From d91a0624dc2dd4ab208dc6f3ca79b0574dd94935 Mon Sep 17 00:00:00 2001 From: Cullen Date: Tue, 20 Jan 2026 17:55:21 -0500 Subject: [PATCH 01/12] Add Rebuilt game enums and data structures for scoring and capabilities --- lib/Enums.ts | 29 ++++++ lib/client/GameId.ts | 1 + lib/games.ts | 238 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 268 insertions(+) diff --git a/lib/Enums.ts b/lib/Enums.ts index ccd7a6f0..2bd17041 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -109,3 +109,32 @@ export namespace ReefscapeEnums { Shallow = "Shallow", } } +export namespace RebuiltEnums { + export enum Climbing { + No = "No", + FirstLevel = "First Level", + SecondLevel = "Second Level", + ThirdLevel = "Third Level", + } + + export enum DriveOverBump{ + No = "No", + Slow="Slow", + Fast="Fast", + } + + export enum EndgameClimbStatus { + None = "None", + FirstLevel = "First Level", + SecondLevel = "Second Level", + ThirdLevel = "Third Level", + } + + export enum AutoCapabilities { + NoAuto = "No Auto", + MovePastStart = "Move Past Start", + ClimbLevelOne = "Climb Level One", + ScoreOneOrMoreFuel = "Score One Or More Fuel", + ScoreFuelAndClimb = "Score Fuel And Climb", + } +} \ No newline at end of file diff --git a/lib/client/GameId.ts b/lib/client/GameId.ts index d2f946cc..0227eed5 100644 --- a/lib/client/GameId.ts +++ b/lib/client/GameId.ts @@ -3,6 +3,7 @@ export enum GameId { CenterStage = "CenterStage", IntoTheDeep = "IntoTheDeep", Reefscape = "Reefscape", + Rebuilt = "Rebuilt", } export const defaultGameId = GameId.Reefscape; diff --git a/lib/games.ts b/lib/games.ts index 756ddc0d..eb5af4dc 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -5,6 +5,7 @@ import { FrcDrivetrain, IntakeTypes, IntoTheDeepEnums, + RebuiltEnums, ReefscapeEnums, } from "./Enums"; import { Badge, FormLayoutProps, PitStatsLayout, StatsLayout } from "./Layout"; @@ -32,6 +33,7 @@ import { } from "./client/StatsMath"; import { report } from "process"; import { GetMaximum } from "./client/StatsMath"; +import { getMaxListeners } from "events"; function getBaseBadges( pitReport: Pitreport | undefined, @@ -1888,7 +1890,243 @@ namespace Reefscape { ); } +namespace Rebuilt { + export class QuantitativeData extends QuantData { + AutoScoredOnePoint: number = 0; + AutoScoredFivePoint: number = 0; + AutoScoredTenPoint: number = 0; + AutoClimbedLevelOne: boolean = false; + + TeleopScoredOnePoint: number = 0; + TeleopScoredFivePoint: number = 0; + TeleopScoredTenPoint: number = 0; + EngameDefenseStatus: Defense = Defense.None; + EndgameClimbStatus: RebuiltEnums.EndgameClimbStatus = + RebuiltEnums.EndgameClimbStatus.None; + } + export class PitData extends PitReportData { + GroundIntake: boolean = false; + CanDriveOverBump: boolean = false; + CanDriveUnderTrench: boolean = false; + CanDeClimb: boolean = false; + CanScoreFuel: boolean = false; + FuelScoredAuto: number = 0; + AutoCapabilities: RebuiltEnums.AutoCapabilities = + RebuiltEnums.AutoCapabilities.NoAuto; + Climing: RebuiltEnums.Climbing = RebuiltEnums.Climbing.No; + } + const pitReportLayout: FormLayoutProps = { + Capabilities: [ + { key: "GroundIntake", label: "Has Ground Intake?" }, + { key: "CanDriveOverBump", label: "Can Drive Over Bump?" }, + { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, + { key: "CanDeClimb", label: "Can De-Climb?" }, + { key: "CanScoreFuel", label: "Can Score Fuel?" }, + { key: "Climing", label: "Climbing?" }, + ], + "Auto (Describe more in comments)": [ + { key: "AutoCapabilities", label: "Auto Capabilities?" }, + { key: "FuelScoredAuto", label: "Average Fuel Scored In Auto" }, + ], + }; + const quantitativeReportLayout: FormLayoutProps = { + Auto: [ + { key: "AutoScoredOnePoint", label: "1 Point Scored (Auto)" }, + { key: "AutoScoredFivePoint", label: "5 Point Scared (Auto)" }, + { key: "AutoScoredTenPoint", label: "10 Point Scored (Auto)" }, + { key: "AutoClimbedLevelOne", label: "Climbed Level One (Auto)" }, + ], + Teleop: [ + { key: "TeleopScoredOnePoint", label: "1 Point Scored (Teleop)" }, + { key: "TeleopScoredFivePoint", label: "5 Point Scored (Teleop)" }, + { key: "TeleopScoredTenPoint", label: "10 Point Scored (Teleop)" }, + ], + "Post Match": ["EndgameClimbStatus", "Defense"], + }; + const statsLayout: StatsLayout = { + sections: { + Auto: [ + { + key: "AutoScoredOnePoint", + label: "Avg Amt Of Fuel Scored In Increments Of One Auto", + }, + { + label: "> Min Auto One Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "AutoScoredOnePoint"); + }, + }, + { + label: "> Max Auto One Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "AutoScoredOnePoint"); + }, + }, + { + key: "AutoScoredFivePoint", + label: "Avg Amt Of Fuel Scored In Increments Of Five Auto", + }, + { + label: "> Min Auto Five Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "AutoScoredFivePoint"); + }, + }, + { + label: "> Max Auto five Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "AutoScoredFivePoint"); + }, + }, + { + key: "AutoScoredTenPoint", + label: "Avg Amt Of Fuel Scored In Increments Of Ten Auto", + }, + { + label: "> Min Auto Ten Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "autoScoredTenPoint"); + }, + }, + { + label: "> Max Auto Ten Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "autoScoredTenPoint"); + }, + }, + { + label: "Average Auto Fuel", + get(pitData, quantitativeReports) { + if (!quantitativeReports) return 0; + + return ( + quantitativeReports?.reduce( + (acc, report) => + acc + + report.data.AutoScoredOnePoint + + report.data.AutoScoredFivePoint + + report.data.AutoScoredTenPoint, + 0, + ) / quantitativeReports?.length + ); + }, + }, + ], + Teleop: [ + { + key: "TeleopScoredOnePoint", + label: "Teleop Scored One Point Fuel", + }, + { + label: "< Min Teleop Scored One Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "TeleopScoredOnePoint"); + }, + }, + { + label: "< Max Teleop Scored One Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "TeleopScoredOnePoint"); + }, + }, + { + key: "TeleopScoredFivePoint", + label: "Teleop Scored Five Point Fuel", + }, + { + label: "< Min Teleop Scored Five Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "TeleopScoredFivePoint"); + }, + }, + { + label: "< Maximum Teleop Scored Five Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "TeleopScoredFivePoint"); + }, + }, + { + key: "TeleopScoredTenPoint", + label: "Teleop Scored Ten Point Fuel", + }, + { + label: "< Min Teleop Scored Ten Point Fuel", + get(pitData, quantitativeReports) { + return GetMinimum(quantitativeReports!, "TeleopScoredTenPoint"); + }, + }, + { + label: "< Maximum Teleop Scored Ten Point Fuel", + get(pitData, quantitativeReports) { + return GetMaximum(quantitativeReports!, "TeleopScoredTenPoint"); + }, + }, + { + label: "Average Teleop Fuel", + get(pitData, quantitativeReports) { + if (!quantitativeReports) return 0; + + return ( + quantitativeReports?.reduce( + (acc, report) => + acc + + report.data.TeleopScoredOnePoint + + report.data.TeleopScoredFivePoint + + report.data.TeleopScoredTenPoint, + 0, + ) / quantitativeReports?.length + ); + }, + }, + ], + }, + getGraphDots: function ( + quantitativeReports: Report[], + pitReport?: Pitreport | undefined, + ): Dot[] { + return []; + }, + }; + const pitStatsLayout: PitStatsLayout = { + overallSlideStats: [ + { + key: "FuelScoredAuto", + label: "Amount of fuel scored in auto", + }, + ], + individualSlideStats: [ + { + label: "Average Auto Points", + get: ( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + ) => { + if (!quantitativeReports) return 0; + + const OneFuelScored = NumericalTotal( + "AutoScoredOnePoint", + quantitativeReports, + ); + const FiveFuelScored = NumericalTotal( + "AutoScoredFivePoint", + quantitativeReports, + ); + const TenFuelScored = NumericalTotal( + "AutoScoredTenPoint", + quantitativeReports, + ); + return ( + (OneFuelScored + FiveFuelScored + TenFuelScored) / + quantitativeReports.length + ); + }, + }, + ], + }; +} + export const games: { [id in GameId]: Game } = Object.freeze({ + [GameId.Rebuilt]: Rebuilt.game, [GameId.Reefscape]: Reefscape.game, [GameId.IntoTheDeep]: IntoTheDeep.game, [GameId.Crescendo]: Crescendo.game, From 7cb85ca0ee481e436d84f4c242c052cc35d0ca38 Mon Sep 17 00:00:00 2001 From: Cullen Date: Thu, 22 Jan 2026 17:41:05 -0500 Subject: [PATCH 02/12] 1/22 commit --- lib/Enums.ts | 12 ++++---- lib/games.ts | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/lib/Enums.ts b/lib/Enums.ts index 2bd17041..92352f52 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -112,9 +112,9 @@ export namespace ReefscapeEnums { export namespace RebuiltEnums { export enum Climbing { No = "No", - FirstLevel = "First Level", - SecondLevel = "Second Level", - ThirdLevel = "Third Level", + FirstLevel = "FirstLevel", + SecondLevel = "SecondLevel", + ThirdLevel = "ThirdLevel", } export enum DriveOverBump{ @@ -125,9 +125,9 @@ export namespace RebuiltEnums { export enum EndgameClimbStatus { None = "None", - FirstLevel = "First Level", - SecondLevel = "Second Level", - ThirdLevel = "Third Level", + FirstLevel = "FirstLevel", + SecondLevel = "SecondLevel", + ThirdLevel = "ThirdLevel", } export enum AutoCapabilities { diff --git a/lib/games.ts b/lib/games.ts index eb5af4dc..63ef1979 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1895,11 +1895,13 @@ namespace Rebuilt { AutoScoredOnePoint: number = 0; AutoScoredFivePoint: number = 0; AutoScoredTenPoint: number = 0; + AutoTotalScored: number = 0; AutoClimbedLevelOne: boolean = false; TeleopScoredOnePoint: number = 0; TeleopScoredFivePoint: number = 0; TeleopScoredTenPoint: number = 0; + TeleopTotalScored: number=0 EngameDefenseStatus: Defense = Defense.None; EndgameClimbStatus: RebuiltEnums.EndgameClimbStatus = RebuiltEnums.EndgameClimbStatus.None; @@ -1913,7 +1915,7 @@ namespace Rebuilt { FuelScoredAuto: number = 0; AutoCapabilities: RebuiltEnums.AutoCapabilities = RebuiltEnums.AutoCapabilities.NoAuto; - Climing: RebuiltEnums.Climbing = RebuiltEnums.Climbing.No; + Climbing: RebuiltEnums.Climbing = RebuiltEnums.Climbing.No; } const pitReportLayout: FormLayoutProps = { Capabilities: [ @@ -1922,7 +1924,7 @@ namespace Rebuilt { { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, { key: "CanDeClimb", label: "Can De-Climb?" }, { key: "CanScoreFuel", label: "Can Score Fuel?" }, - { key: "Climing", label: "Climbing?" }, + { key: "Climbing", label: "Climbing?" }, ], "Auto (Describe more in comments)": [ { key: "AutoCapabilities", label: "Auto Capabilities?" }, @@ -2121,10 +2123,86 @@ namespace Rebuilt { ); }, }, + { + label: "Average Teleop Points", + get: ( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + ) => { + if (!quantitativeReports) return 0; + + const TeleopOneFuelScored = NumericalTotal( + "TeleopScoredOnePoint", + quantitativeReports, + ); + const TeleopFiveFuelScored = NumericalTotal( + "TeleopScoredFivePoint", + quantitativeReports, + ); + const TeleopTenFuelScored = NumericalTotal( + "TeleopScoredTenPoint", + quantitativeReports, + ); + return ( + (TeleopOneFuelScored + TeleopFiveFuelScored + TeleopTenFuelScored) / + quantitativeReports.length + ); + }, + }, + { + label: "Ave Endgame Stats", + get: ( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + ) => { + if (!quantitativeReports) return 0; + + const climb = NumericalTotal( + "EndGameClimbStatus", + quantitativeReports, + ); + return Round(climb) / quantitativeReports.length; + }, + }, ], + RobotCapabilites: [ + { key: "GroundIntake", label: "Has Ground Intake?" }, + { key: "CanDriveOverBump", label: "Can Drive Over Bump?" }, + { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, + { key: "CanDeClimb", label: "Can De-Climb?" }, + { key: "CanScoreFuel", label: "Can Score Fuel?" }, + { key: "Climbing", label: "Climbing?" }, + ], + GraphStat: [ + ] + }; + function getBadges( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + card: boolean, + ) { + const badges: Badge[] = getBaseBadges(pitReport, quantitativeReports); + if (pitReport?.data?.GroundIntake) + badges.push({ text: "Can Use Ground Intake", color: "primary" }); + if (pitReport?.data?.CanDriveOverBump) + badges.push({ text: "Can Drive Over Bump", color: "accent"}); + if (pitReport?.data?.CanDriveUnderTrench) + badges.push({ text: "Can Drive Under Trench", color: "accent"}); + if (pitReport?.data?.CanDeClimb) + badges.push({ text: "Can Declimb", color:"accent"}); + if (pitReport?.data?.CanScoreFuel) + badges.push({ text: "Can Score Fuel", color: "accent"}); + + if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.FirstLevel)) + badges.push({ text: "Can Climb First Level", color: "accent" }); + else if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.SecondLevel)) + badges.push({ text: "Can Climb Second Level", color: "accent" }); + else if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.ThirdLevel)) + badges.push({ text: "Can Climb Third Level", color: "accent" }); }; } + export const games: { [id in GameId]: Game } = Object.freeze({ [GameId.Rebuilt]: Rebuilt.game, [GameId.Reefscape]: Reefscape.game, From 34ac314a7488576546aab70a0d7d648c8bac22ab Mon Sep 17 00:00:00 2001 From: Cullen Date: Mon, 2 Feb 2026 16:14:18 -0500 Subject: [PATCH 03/12] feb 2nd --- components/stats/SmallGraph.tsx | 21 ++++++--- lib/Enums.ts | 6 +++ lib/Layout.ts | 12 +++++ lib/api/ClientApi.ts | 2 +- lib/client/GameId.ts | 2 +- lib/games.ts | 75 +++++++++++++++++++++++++------- public/fields/RebuiltBlue.png | Bin 0 -> 45890 bytes public/fields/RebuiltRed.png | Bin 0 -> 45049 bytes 8 files changed, 95 insertions(+), 23 deletions(-) create mode 100644 public/fields/RebuiltBlue.png create mode 100644 public/fields/RebuiltRed.png diff --git a/components/stats/SmallGraph.tsx b/components/stats/SmallGraph.tsx index 31e6dd35..cd349a13 100644 --- a/components/stats/SmallGraph.tsx +++ b/components/stats/SmallGraph.tsx @@ -1,4 +1,4 @@ -import { Defense, ReefscapeEnums } from "@/lib/Enums"; +import { Defense, RebuiltEnums } from "@/lib/Enums"; import { Report } from "@/lib/Types"; import ClientApi from "@/lib/api/ClientApi"; @@ -87,15 +87,24 @@ export default function SmallGraph(props: { return 1; } } else if (key === "EndgameClimbStatus") { + ///switch (data) { + //case ReefscapeEnums.EndgameClimbStatus.None: + //return 0; + //case ReefscapeEnums.EndgameClimbStatus.Park: + //return 0.33; + //case ReefscapeEnums.EndgameClimbStatus.High: + //return 0.66; + //case ReefscapeEnums.EndgameClimbStatus.Low: + //return 1; switch (data) { - case ReefscapeEnums.EndgameClimbStatus.None: + case RebuiltEnums.EndgameClimbStatus.None: return 0; - case ReefscapeEnums.EndgameClimbStatus.Park: + case RebuiltEnums.EndgameClimbStatus.FirstLevel: return 0.33; - case ReefscapeEnums.EndgameClimbStatus.High: + case RebuiltEnums.EndgameClimbStatus.SecondLevel: return 0.66; - case ReefscapeEnums.EndgameClimbStatus.Low: - return 1; + case RebuiltEnums.EndgameClimbStatus.ThirdLevel: + return 1; } } return data; diff --git a/lib/Enums.ts b/lib/Enums.ts index 92352f52..d95465ca 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -123,6 +123,12 @@ export namespace RebuiltEnums { Fast="Fast", } + export enum DriveUnderTrench{ + No= "No", + Slow="Slow", + Fast="Fast", + } + export enum EndgameClimbStatus { None = "None", FirstLevel = "FirstLevel", diff --git a/lib/Layout.ts b/lib/Layout.ts index 01ef80d1..e961e962 100644 --- a/lib/Layout.ts +++ b/lib/Layout.ts @@ -10,6 +10,7 @@ import { IntoTheDeepEnums, FtcDrivetrain, ReefscapeEnums, + RebuiltEnums, } from "./Enums"; import { PitReportData, QuantData, Pitreport, Report, League } from "./Types"; @@ -217,6 +218,11 @@ export function keyToType( ReefscapeEnums.Climbing, ReefscapeEnums.DriveThroughDeepCage, ReefscapeEnums.EndgameClimbStatus, + RebuiltEnums.AutoCapabilities, + RebuiltEnums.Climbing, + RebuiltEnums.DriveOverBump, + RebuiltEnums.DriveUnderTrench, + RebuiltEnums.EndgameClimbStatus ]; if (key === "Defense") return Defense; @@ -231,6 +237,12 @@ export function keyToType( if (key == "DriveThroughDeepCage") return ReefscapeEnums.DriveThroughDeepCage; if (key == "EndgameClimbStatus") return ReefscapeEnums.EndgameClimbStatus; + if (key == "AutoCapabilities") return RebuiltEnums.AutoCapabilities; + if (key == "climbing") return RebuiltEnums.Climbing; + if (key == "DriveOverBump") return RebuiltEnums.DriveOverBump; + if (key == "DiveUnderTrench")return RebuiltEnums.DriveUnderTrench; + if (key == "EndgameClimbStatus") return RebuiltEnums.EndgameClimbStatus; + for (const e of enums) { if (Object.values(e).includes(exampleData[key])) return e; } diff --git a/lib/api/ClientApi.ts b/lib/api/ClientApi.ts index e3d5c45b..5e26cac7 100644 --- a/lib/api/ClientApi.ts +++ b/lib/api/ClientApi.ts @@ -42,7 +42,7 @@ import { assignScoutersToCompetitionMatches, generateReportsForMatch, } from "../CompetitionHandling"; -import { CenterStage, Crescendo, games, IntoTheDeep } from "../games"; +import { CenterStage, Crescendo, games, IntoTheDeep, Rebuilt } from "../games"; import { Statbotics } from "../Statbotics"; import { TheBlueAlliance } from "../TheBlueAlliance"; import { SlackNotLinkedError } from "./Errors"; diff --git a/lib/client/GameId.ts b/lib/client/GameId.ts index 0227eed5..4897b965 100644 --- a/lib/client/GameId.ts +++ b/lib/client/GameId.ts @@ -6,4 +6,4 @@ export enum GameId { Rebuilt = "Rebuilt", } -export const defaultGameId = GameId.Reefscape; +export const defaultGameId = GameId.Rebuilt; diff --git a/lib/games.ts b/lib/games.ts index 63ef1979..57c84e97 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1890,7 +1890,7 @@ namespace Reefscape { ); } -namespace Rebuilt { +export namespace Rebuilt { export class QuantitativeData extends QuantData { AutoScoredOnePoint: number = 0; AutoScoredFivePoint: number = 0; @@ -1901,7 +1901,7 @@ namespace Rebuilt { TeleopScoredOnePoint: number = 0; TeleopScoredFivePoint: number = 0; TeleopScoredTenPoint: number = 0; - TeleopTotalScored: number=0 + TeleopTotalScored: number = 0; EngameDefenseStatus: Defense = Defense.None; EndgameClimbStatus: RebuiltEnums.EndgameClimbStatus = RebuiltEnums.EndgameClimbStatus.None; @@ -1942,6 +1942,7 @@ namespace Rebuilt { { key: "TeleopScoredOnePoint", label: "1 Point Scored (Teleop)" }, { key: "TeleopScoredFivePoint", label: "5 Point Scored (Teleop)" }, { key: "TeleopScoredTenPoint", label: "10 Point Scored (Teleop)" }, + { key: "TeleopTotalScored", label:"Total Fuel Scored (Teleop)"} ], "Post Match": ["EndgameClimbStatus", "Defense"], }; @@ -2165,7 +2166,7 @@ namespace Rebuilt { }, }, ], - RobotCapabilites: [ + robotCapabilities: [ { key: "GroundIntake", label: "Has Ground Intake?" }, { key: "CanDriveOverBump", label: "Can Drive Over Bump?" }, { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, @@ -2173,8 +2174,10 @@ namespace Rebuilt { { key: "CanScoreFuel", label: "Can Score Fuel?" }, { key: "Climbing", label: "Climbing?" }, ], - GraphStat: [ - ] + graphStat: { + label: "Average Fuel Scored In Hopper", + key: "TeleopTotalPoints", + }, }; function getBadges( pitReport: Pitreport | undefined, @@ -2185,23 +2188,65 @@ namespace Rebuilt { if (pitReport?.data?.GroundIntake) badges.push({ text: "Can Use Ground Intake", color: "primary" }); if (pitReport?.data?.CanDriveOverBump) - badges.push({ text: "Can Drive Over Bump", color: "accent"}); + badges.push({ text: "Can Drive Over Bump", color: "accent" }); if (pitReport?.data?.CanDriveUnderTrench) - badges.push({ text: "Can Drive Under Trench", color: "accent"}); + badges.push({ text: "Can Drive Under Trench", color: "accent" }); if (pitReport?.data?.CanDeClimb) - badges.push({ text: "Can Declimb", color:"accent"}); - if (pitReport?.data?.CanScoreFuel) - badges.push({ text: "Can Score Fuel", color: "accent"}); + badges.push({ text: "Can Declimb", color: "accent" }); + if (!pitReport?.data?.CanScoreFuel) + badges.push({ text: "Can't Score Fuel", color: "warning" }); - if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.FirstLevel)) + if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.FirstLevel) badges.push({ text: "Can Climb First Level", color: "accent" }); - else if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.SecondLevel)) + else if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.SecondLevel) badges.push({ text: "Can Climb Second Level", color: "accent" }); - else if ((pitReport?.data?.Climbing = RebuiltEnums.Climbing.ThirdLevel)) + else if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.ThirdLevel) badges.push({ text: "Can Climb Third Level", color: "accent" }); - }; -} + return badges; + } + function getAvgPoints(reports: Report[] | undefined){ + if (!reports) return 0; + + let totalPoints=0; + + for (const report of reports.map((r) => r.data)) { + switch (report.EndgameClimbStatus) { + case RebuiltEnums.EndgameClimbStatus.None: + break; + case RebuiltEnums.EndgameClimbStatus.FirstLevel: + totalPoints+=10 + break; + case RebuiltEnums.EndgameClimbStatus.SecondLevel: + totalPoints+=20 + break; + case RebuiltEnums.EndgameClimbStatus.ThirdLevel: + totalPoints+=30 + break; + } + totalPoints+= (report.AutoScoredOnePoint+report.TeleopScoredOnePoint); + totalPoints+= (report.AutoScoredFivePoint+report.TeleopScoredFivePoint)*5; + totalPoints+= (report.AutoScoredTenPoint+report.TeleopScoredTenPoint)*10; + } + return totalPoints/Math.max(reports.length,1); + } + export const game = new Game( + "Rebuilt", + 2026, + League.FRC, + QuantitativeData, + PitData, + pitReportLayout, + quantitativeReportLayout, + statsLayout, + pitStatsLayout, + "Rebuilt", + "https://www.firstinspires.org/hs-fs/hubfs/image-library/web/frc_rebuilt_1240x860.webp?width=630", + "invert", //Ask Colin + getBadges, + getAvgPoints, + ); +} export const games: { [id in GameId]: Game } = Object.freeze({ [GameId.Rebuilt]: Rebuilt.game, diff --git a/public/fields/RebuiltBlue.png b/public/fields/RebuiltBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..68cf5423cf8b0f37e973568909bace41ffda1133 GIT binary patch literal 45890 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 bIvxIhG|jE7kryk000000NkvXXu0mjfYCO7Y literal 0 HcmV?d00001 diff --git a/public/fields/RebuiltRed.png b/public/fields/RebuiltRed.png new file mode 100644 index 0000000000000000000000000000000000000000..d668194961584d6eecab1c72935518b486f12176 GIT binary patch literal 45049 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 Ac>n+a literal 0 HcmV?d00001 From 9ea32ce2e62e156bd3b583e70245a95a481c11b6 Mon Sep 17 00:00:00 2001 From: Cullen Date: Mon, 23 Feb 2026 16:06:27 -0500 Subject: [PATCH 04/12] 2/23 --- components/stats/SmallGraph.tsx | 28 +- lib/Enums.ts | 32 +- lib/Layout.ts | 14 +- lib/games.ts | 107 ++- package-lock.json | 1330 +++++++++++++++++++------------ package.json | 3 +- 6 files changed, 942 insertions(+), 572 deletions(-) diff --git a/components/stats/SmallGraph.tsx b/components/stats/SmallGraph.tsx index cd349a13..ca66df4f 100644 --- a/components/stats/SmallGraph.tsx +++ b/components/stats/SmallGraph.tsx @@ -86,25 +86,25 @@ export default function SmallGraph(props: { case Defense.Full: return 1; } - } else if (key === "EndgameClimbStatus") { + } else if (key === "LevelClimbed") { ///switch (data) { - //case ReefscapeEnums.EndgameClimbStatus.None: - //return 0; - //case ReefscapeEnums.EndgameClimbStatus.Park: - //return 0.33; - //case ReefscapeEnums.EndgameClimbStatus.High: - //return 0.66; - //case ReefscapeEnums.EndgameClimbStatus.Low: - //return 1; + //case ReefscapeEnums.EndgameClimbStatus.None: + //return 0; + //case ReefscapeEnums.EndgameClimbStatus.Park: + //return 0.33; + //case ReefscapeEnums.EndgameClimbStatus.High: + //return 0.66; + //case ReefscapeEnums.EndgameClimbStatus.Low: + //return 1; switch (data) { - case RebuiltEnums.EndgameClimbStatus.None: + case RebuiltEnums.LevelClimbed.No: return 0; - case RebuiltEnums.EndgameClimbStatus.FirstLevel: + case RebuiltEnums.LevelClimbed.First: return 0.33; - case RebuiltEnums.EndgameClimbStatus.SecondLevel: + case RebuiltEnums.LevelClimbed.Second: return 0.66; - case RebuiltEnums.EndgameClimbStatus.ThirdLevel: - return 1; + case RebuiltEnums.LevelClimbed.Third: + return 1; } } return data; diff --git a/lib/Enums.ts b/lib/Enums.ts index d95465ca..20669b16 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -110,37 +110,37 @@ export namespace ReefscapeEnums { } } export namespace RebuiltEnums { - export enum Climbing { + export enum ClimbingAbilities { No = "No", FirstLevel = "FirstLevel", SecondLevel = "SecondLevel", ThirdLevel = "ThirdLevel", } - - export enum DriveOverBump{ + + export enum DriveOverBump { No = "No", - Slow="Slow", - Fast="Fast", + Slow = "Slow", + Fast = "Fast", } - export enum DriveUnderTrench{ - No= "No", - Slow="Slow", - Fast="Fast", + export enum DriveUnderTrench { + No = "No", + Slow = "Slow", + Fast = "Fast", } - export enum EndgameClimbStatus { - None = "None", - FirstLevel = "FirstLevel", - SecondLevel = "SecondLevel", - ThirdLevel = "ThirdLevel", + export enum LevelClimbed { + No = "No", + First = "First", + Second = "Second", + Third = "Third", } - export enum AutoCapabilities { + export enum AutoAbilities { NoAuto = "No Auto", MovePastStart = "Move Past Start", ClimbLevelOne = "Climb Level One", ScoreOneOrMoreFuel = "Score One Or More Fuel", ScoreFuelAndClimb = "Score Fuel And Climb", } -} \ No newline at end of file +} diff --git a/lib/Layout.ts b/lib/Layout.ts index e961e962..f18d101b 100644 --- a/lib/Layout.ts +++ b/lib/Layout.ts @@ -218,11 +218,11 @@ export function keyToType( ReefscapeEnums.Climbing, ReefscapeEnums.DriveThroughDeepCage, ReefscapeEnums.EndgameClimbStatus, - RebuiltEnums.AutoCapabilities, - RebuiltEnums.Climbing, + RebuiltEnums.AutoAbilities, + RebuiltEnums.ClimbingAbilities, RebuiltEnums.DriveOverBump, RebuiltEnums.DriveUnderTrench, - RebuiltEnums.EndgameClimbStatus + RebuiltEnums.LevelClimbed, ]; if (key === "Defense") return Defense; @@ -237,11 +237,11 @@ export function keyToType( if (key == "DriveThroughDeepCage") return ReefscapeEnums.DriveThroughDeepCage; if (key == "EndgameClimbStatus") return ReefscapeEnums.EndgameClimbStatus; - if (key == "AutoCapabilities") return RebuiltEnums.AutoCapabilities; - if (key == "climbing") return RebuiltEnums.Climbing; + if (key == "AutoAbilities") return RebuiltEnums.AutoAbilities; + if (key == "ClimbingAbilities") return RebuiltEnums.ClimbingAbilities; if (key == "DriveOverBump") return RebuiltEnums.DriveOverBump; - if (key == "DiveUnderTrench")return RebuiltEnums.DriveUnderTrench; - if (key == "EndgameClimbStatus") return RebuiltEnums.EndgameClimbStatus; + if (key == "DiveUnderTrench") return RebuiltEnums.DriveUnderTrench; + if (key == "LevelClimbed") return RebuiltEnums.LevelClimbed; for (const e of enums) { if (Object.values(e).includes(exampleData[key])) return e; diff --git a/lib/games.ts b/lib/games.ts index 57c84e97..ffcf2ca2 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -34,6 +34,7 @@ import { import { report } from "process"; import { GetMaximum } from "./client/StatsMath"; import { getMaxListeners } from "events"; +//import { ClimbingCapabilities, ClimbingAbilities } from './Enums'; function getBaseBadges( pitReport: Pitreport | undefined, @@ -1903,8 +1904,7 @@ export namespace Rebuilt { TeleopScoredTenPoint: number = 0; TeleopTotalScored: number = 0; EngameDefenseStatus: Defense = Defense.None; - EndgameClimbStatus: RebuiltEnums.EndgameClimbStatus = - RebuiltEnums.EndgameClimbStatus.None; + LevelClimbed: RebuiltEnums.LevelClimbed = RebuiltEnums.LevelClimbed.No; } export class PitData extends PitReportData { GroundIntake: boolean = false; @@ -1913,9 +1913,10 @@ export namespace Rebuilt { CanDeClimb: boolean = false; CanScoreFuel: boolean = false; FuelScoredAuto: number = 0; - AutoCapabilities: RebuiltEnums.AutoCapabilities = - RebuiltEnums.AutoCapabilities.NoAuto; - Climbing: RebuiltEnums.Climbing = RebuiltEnums.Climbing.No; + AutoAbilities: RebuiltEnums.AutoAbilities = + RebuiltEnums.AutoAbilities.NoAuto; + ClimbingAbilities: RebuiltEnums.ClimbingAbilities = + RebuiltEnums.ClimbingAbilities.No; } const pitReportLayout: FormLayoutProps = { Capabilities: [ @@ -1924,28 +1925,49 @@ export namespace Rebuilt { { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, { key: "CanDeClimb", label: "Can De-Climb?" }, { key: "CanScoreFuel", label: "Can Score Fuel?" }, - { key: "Climbing", label: "Climbing?" }, + { key: "ClimbingAbilites", label: "Climbing?" }, ], "Auto (Describe more in comments)": [ - { key: "AutoCapabilities", label: "Auto Capabilities?" }, + { key: "AutoAbilities", label: "Auto Capabilities?" }, { key: "FuelScoredAuto", label: "Average Fuel Scored In Auto" }, ], }; const quantitativeReportLayout: FormLayoutProps = { Auto: [ - { key: "AutoScoredOnePoint", label: "1 Point Scored (Auto)" }, - { key: "AutoScoredFivePoint", label: "5 Point Scared (Auto)" }, - { key: "AutoScoredTenPoint", label: "10 Point Scored (Auto)" }, + [ + [ + { key: "AutoScoredOnePoint", label: "1 Point Scored (Auto)" }, + { key: "AutoScoredFivePoint", label: "5 Point Scared (Auto)" }, + { key: "AutoScoredTenPoint", label: "10 Point Scored (Auto)" }, + ], + ], { key: "AutoClimbedLevelOne", label: "Climbed Level One (Auto)" }, ], Teleop: [ - { key: "TeleopScoredOnePoint", label: "1 Point Scored (Teleop)" }, - { key: "TeleopScoredFivePoint", label: "5 Point Scored (Teleop)" }, - { key: "TeleopScoredTenPoint", label: "10 Point Scored (Teleop)" }, - { key: "TeleopTotalScored", label:"Total Fuel Scored (Teleop)"} + [ + [ + { key: "TeleopScoredOnePoint", label: "1 Point Scored (Teleop)" }, + { key: "TeleopScoredFivePoint", label: "5 Point Scored (Teleop)" }, + { key: "TeleopScoredTenPoint", label: "10 Point Scored (Teleop)" }, + ], + ], ], - "Post Match": ["EndgameClimbStatus", "Defense"], + "Post Match": ["LevelClimbed", "Defense"], }; + function getTotalFuel(reports: Report[] | undefined) { + if (!reports) return 0; + + for (const report of reports.map((r) => r.data)) { + report.TeleopTotalScored += report.TeleopScoredOnePoint; + report.TeleopTotalScored += report.TeleopScoredFivePoint * 5; + report.TeleopTotalScored += report.TeleopScoredTenPoint * 10; + + report.AutoTotalScored += report.AutoScoredOnePoint; + report.AutoTotalScored += report.AutoScoredFivePoint * 5; + report.AutoTotalScored += report.AutoScoredFivePoint * 10; + } + } + getTotalFuel const statsLayout: StatsLayout = { sections: { Auto: [ @@ -2158,10 +2180,7 @@ export namespace Rebuilt { ) => { if (!quantitativeReports) return 0; - const climb = NumericalTotal( - "EndGameClimbStatus", - quantitativeReports, - ); + const climb = NumericalTotal("LevelClimbed", quantitativeReports); return Round(climb) / quantitativeReports.length; }, }, @@ -2172,7 +2191,7 @@ export namespace Rebuilt { { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, { key: "CanDeClimb", label: "Can De-Climb?" }, { key: "CanScoreFuel", label: "Can Score Fuel?" }, - { key: "Climbing", label: "Climbing?" }, + { key: "ClimbingAbilities", label: "Climbing?" }, ], graphStat: { label: "Average Fuel Scored In Hopper", @@ -2196,39 +2215,50 @@ export namespace Rebuilt { if (!pitReport?.data?.CanScoreFuel) badges.push({ text: "Can't Score Fuel", color: "warning" }); - if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.FirstLevel) + if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.FirstLevel + ) badges.push({ text: "Can Climb First Level", color: "accent" }); - else if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.SecondLevel) + else if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.SecondLevel + ) badges.push({ text: "Can Climb Second Level", color: "accent" }); - else if (pitReport?.data?.Climbing === RebuiltEnums.Climbing.ThirdLevel) + else if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.ThirdLevel + ) badges.push({ text: "Can Climb Third Level", color: "accent" }); return badges; } - function getAvgPoints(reports: Report[] | undefined){ + function getAvgPoints(reports: Report[] | undefined) { if (!reports) return 0; - let totalPoints=0; + let totalPoints = 0; for (const report of reports.map((r) => r.data)) { - switch (report.EndgameClimbStatus) { - case RebuiltEnums.EndgameClimbStatus.None: + switch (report.LevelClimbed) { + case RebuiltEnums.LevelClimbed.No: break; - case RebuiltEnums.EndgameClimbStatus.FirstLevel: - totalPoints+=10 + case RebuiltEnums.LevelClimbed.First: + totalPoints += 10; break; - case RebuiltEnums.EndgameClimbStatus.SecondLevel: - totalPoints+=20 + case RebuiltEnums.LevelClimbed.Second: + totalPoints += 20; break; - case RebuiltEnums.EndgameClimbStatus.ThirdLevel: - totalPoints+=30 + case RebuiltEnums.LevelClimbed.Third: + totalPoints += 30; break; } - totalPoints+= (report.AutoScoredOnePoint+report.TeleopScoredOnePoint); - totalPoints+= (report.AutoScoredFivePoint+report.TeleopScoredFivePoint)*5; - totalPoints+= (report.AutoScoredTenPoint+report.TeleopScoredTenPoint)*10; + totalPoints += report.AutoScoredOnePoint + report.TeleopScoredOnePoint; + totalPoints += + (report.AutoScoredFivePoint + report.TeleopScoredFivePoint) * 5; + totalPoints += + (report.AutoScoredTenPoint + report.TeleopScoredTenPoint) * 10; } - return totalPoints/Math.max(reports.length,1); + return totalPoints / Math.max(reports.length, 1); } export const game = new Game( "Rebuilt", @@ -2236,12 +2266,13 @@ export namespace Rebuilt { League.FRC, QuantitativeData, PitData, + //getTotalFuel, pitReportLayout, quantitativeReportLayout, statsLayout, pitStatsLayout, "Rebuilt", - "https://www.firstinspires.org/hs-fs/hubfs/image-library/web/frc_rebuilt_1240x860.webp?width=630", + "https://www.firstinspires.org/hs-fs/hubfs/image-library/web/frc_rebuilt_1240x860.webp?width=630", "invert", //Ask Colin getBadges, getAvgPoints, diff --git a/package-lock.json b/package-lock.json index e1d3d706..ceb4e729 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "next": "^15.2.4", "next-auth": "^4.24.11", "next-seo": "^6.6.0", + "nodemailer": "^7.0.13", "omit-call-signature": "^1.0.15", "react": "18.3.1", "react-beautiful-dnd": "^13.1.1", @@ -68,7 +69,7 @@ "jest": "^29.7.0", "postcss": "^8.5.3", "prettier": "3.5.3", - "serwist": "^9.0.11", + "serwist": "^9.0.13", "tailwindcss": "^3.4.17", "ts-jest": "^29.2.5" } @@ -107,13 +108,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -338,19 +341,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -365,109 +370,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.29.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -710,14 +634,15 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -754,14 +679,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -793,6 +718,16 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", @@ -1283,81 +1218,541 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "license": "Apache-2.0", + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.22" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "license": "Apache-2.0", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -1453,10 +1848,11 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1933,9 +2329,9 @@ } }, "node_modules/@next/env": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", - "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz", + "integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -1976,9 +2372,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", - "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz", + "integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==", "cpu": [ "arm64" ], @@ -1992,9 +2388,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", - "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz", + "integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==", "cpu": [ "x64" ], @@ -2008,9 +2404,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", - "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz", + "integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==", "cpu": [ "arm64" ], @@ -2024,9 +2420,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", - "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz", + "integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==", "cpu": [ "arm64" ], @@ -2040,9 +2436,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", - "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz", + "integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==", "cpu": [ "x64" ], @@ -2056,9 +2452,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", - "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz", + "integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==", "cpu": [ "x64" ], @@ -2072,9 +2468,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", - "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz", + "integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==", "cpu": [ "arm64" ], @@ -2088,9 +2484,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", - "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz", + "integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==", "cpu": [ "x64" ], @@ -2174,13 +2570,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", - "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.1.tgz", + "integrity": "sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.52.0" + "playwright": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -2324,16 +2720,17 @@ } }, "node_modules/@serwist/build": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@serwist/build/-/build-9.0.13.tgz", - "integrity": "sha512-Hoc6llxFmnsE8z5Cs95UmRRhRyoNh44OdrMWWPPX8BpW19z0CK/qnBquptjyBIe46jjoOxsPHK0Tt7oZOV4Mbw==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@serwist/build/-/build-9.5.4.tgz", + "integrity": "sha512-FTiNsNb3luKsLIxjKCvkPiqFZSbx7yVNOFGSUhp4lyfzgnelT1M3/lMC88kLiak90emkuFjSkQgwa6OnyhMZlQ==", "license": "MIT", "dependencies": { + "@serwist/utils": "9.5.4", "common-tags": "1.8.2", - "glob": "10.4.5", + "glob": "10.5.0", "pretty-bytes": "6.1.1", "source-map": "0.8.0-beta.0", - "zod": "3.24.2" + "zod": "4.3.6" }, "engines": { "node": ">=18.0.0" @@ -2348,18 +2745,19 @@ } }, "node_modules/@serwist/build/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@serwist/build/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -2395,6 +2793,7 @@ "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" @@ -2430,56 +2829,55 @@ } }, "node_modules/@serwist/next": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@serwist/next/-/next-9.0.13.tgz", - "integrity": "sha512-nI2N4oSEHJGH0YUsE4m1obPfudO3DZ/pXiHPaisw+28YjgkMqD6ePfhzeHGO07ahPmIUiyHca9VNO8OfarbQ1Q==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@serwist/next/-/next-9.5.4.tgz", + "integrity": "sha512-bkPkvMs4GfNV3C3tSZg9O5mb+B7Rq8zLpkZNF2hV96zep6d/ujA7yBp8o8bD1rmLb7I++ifsIMQzH2a+vVc/ag==", "license": "MIT", "dependencies": { - "@serwist/build": "9.0.13", - "@serwist/webpack-plugin": "9.0.13", - "@serwist/window": "9.0.13", - "chalk": "5.4.1", - "glob": "10.4.5", - "serwist": "9.0.13", - "zod": "3.24.2" + "@serwist/build": "9.5.4", + "@serwist/utils": "9.5.4", + "@serwist/webpack-plugin": "9.5.4", + "@serwist/window": "9.5.4", + "browserslist": "4.28.1", + "glob": "10.5.0", + "kolorist": "1.8.0", + "semver": "7.7.3", + "serwist": "9.5.4", + "zod": "4.3.6" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { + "@serwist/cli": "^9.5.4", "next": ">=14.0.0", + "react": ">=18.0.0", "typescript": ">=5.0.0" }, "peerDependenciesMeta": { + "@serwist/cli": { + "optional": true + }, "typescript": { "optional": true } } }, "node_modules/@serwist/next/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@serwist/next/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@serwist/next/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -2499,6 +2897,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2509,15 +2908,30 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@serwist/utils": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@serwist/utils/-/utils-9.5.4.tgz", + "integrity": "sha512-uyriGQF1qjNEHXXfsd8XJ5kfK3/MezEaUw//XdHjZeJ0LvLamrgnLJGQQoyJqUfEPCiJ4jJwc4uYMB9LjLiHxA==", + "license": "MIT", + "peerDependencies": { + "browserslist": ">=4" + }, + "peerDependenciesMeta": { + "browserslist": { + "optional": true + } + } + }, "node_modules/@serwist/webpack-plugin": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@serwist/webpack-plugin/-/webpack-plugin-9.0.13.tgz", - "integrity": "sha512-Z+Eve8dckM2FulRCa7Cj7VCF3EOP7QkRA76tI742olF7J2sYZSm3t9Ex13jDxTMmYiU1AxLq6V6gEMIdRAetVw==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@serwist/webpack-plugin/-/webpack-plugin-9.5.4.tgz", + "integrity": "sha512-Zmrce/fuKIBYPOFlCSutIk2rE3949ihFjrXiiR3SNOhnBhxYDOcf6oz3zXFQDLAaih8wdjDL4PlzPEqKg1OmJA==", "license": "MIT", "dependencies": { - "@serwist/build": "9.0.13", + "@serwist/build": "9.5.4", + "@serwist/utils": "9.5.4", "pretty-bytes": "6.1.1", - "zod": "3.24.2" + "zod": "4.3.6" }, "engines": { "node": ">=18.0.0" @@ -2536,13 +2950,13 @@ } }, "node_modules/@serwist/window": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@serwist/window/-/window-9.0.13.tgz", - "integrity": "sha512-Cf3RizPuFInDcLt0P1Y5QzG1sA5mW131/PZfMYE3yBuNUSGNgOQGlYuLdwDOWPHgECYoVb/da8pspdQNKs0O5g==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@serwist/window/-/window-9.5.4.tgz", + "integrity": "sha512-52t2G+TgiWDdRwGG0ArU28uy6/oQYICQfNLHs4ywybyS6mHy3BxHFl+JjB5vhg8znIG1LMpGvOmS5b7AuPVYDw==", "license": "MIT", "dependencies": { "@types/trusted-types": "2.0.7", - "serwist": "9.0.13" + "serwist": "9.5.4" }, "peerDependencies": { "typescript": ">=5.0.0" @@ -2582,11 +2996,6 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -3648,6 +4057,15 @@ "zxing-wasm": "^2.0.1" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -3693,9 +4111,10 @@ "integrity": "sha512-N/toHA87JcmAHPqU8Qt7YnhFK6W2WUpdq5M1k/JqLdTqtts7sHEMZhFjFWTvvR2poKF7Qki0qknhIPIr5I7TIQ==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3721,10 +4140,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -3741,10 +4159,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -3788,17 +4207,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -3844,9 +4252,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", + "version": "1.0.30001768", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz", + "integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==", "funding": [ { "type": "opencollective", @@ -4047,20 +4455,6 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4077,17 +4471,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4352,15 +4735,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/decache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decache/-/decache-3.1.0.tgz", - "integrity": "sha512-p7D6wJ5EJFFq1CcF2lu1XeqKFLBob8jRQGNAvFLTsV3CbSKBl3VtliAVlUIGz2i9H6kEFnI2Amaft5ZopIG2Fw==", - "optional": true, - "dependencies": { - "find": "^0.2.4" - } - }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -4448,9 +4822,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "engines": { @@ -4482,9 +4856,10 @@ "dev": true }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -4620,10 +4995,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.114", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz", - "integrity": "sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==", - "dev": true, + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "license": "ISC" }, "node_modules/emittery": { @@ -4901,7 +5275,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -5193,9 +5566,9 @@ } }, "node_modules/eslint-config-next/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -5747,10 +6120,11 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -5778,15 +6152,6 @@ "node": ">=8" } }, - "node_modules/find": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", - "integrity": "sha512-7a4/LCiInB9xYMnAUEjLilL9FKclwbwK7VlXw+h5jMvT2TDFeYFCHM24O1XdnC/on/hx8mxVO3FTQkyHZnOghQ==", - "optional": true, - "dependencies": { - "traverse-chain": "~0.1.0" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5852,6 +6217,20 @@ "node": "*" } }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/formidable": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", @@ -6295,9 +6674,9 @@ } }, "node_modules/idb": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.2.tgz", - "integrity": "sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz", + "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==", "license": "ISC" }, "node_modules/idb-wrapper": { @@ -6394,10 +6773,14 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } }, "node_modules/is-array-buffer": { "version": "3.0.4", @@ -7847,9 +8230,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7966,6 +8349,12 @@ "node": ">=6" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -8057,9 +8446,10 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -8359,15 +8749,13 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", - "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz", + "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==", "license": "MIT", "dependencies": { - "@next/env": "15.2.4", - "@swc/counter": "0.1.3", + "@next/env": "15.5.12", "@swc/helpers": "0.5.15", - "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -8379,19 +8767,19 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.2.4", - "@next/swc-darwin-x64": "15.2.4", - "@next/swc-linux-arm64-gnu": "15.2.4", - "@next/swc-linux-arm64-musl": "15.2.4", - "@next/swc-linux-x64-gnu": "15.2.4", - "@next/swc-linux-x64-musl": "15.2.4", - "@next/swc-win32-arm64-msvc": "15.2.4", - "@next/swc-win32-x64-msvc": "15.2.4", - "sharp": "^0.33.5" + "@next/swc-darwin-arm64": "15.5.12", + "@next/swc-darwin-x64": "15.5.12", + "@next/swc-linux-arm64-gnu": "15.5.12", + "@next/swc-linux-arm64-musl": "15.5.12", + "@next/swc-linux-x64-gnu": "15.5.12", + "@next/swc-linux-x64-musl": "15.5.12", + "@next/swc-win32-arm64-msvc": "15.5.12", + "@next/swc-win32-x64-msvc": "15.5.12", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", @@ -8413,9 +8801,9 @@ } }, "node_modules/next-auth": { - "version": "4.24.11", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz", - "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==", + "version": "4.24.13", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.13.tgz", + "integrity": "sha512-sgObCfcfL7BzIK76SS5TnQtc3yo2Oifp/yIpfv6fMfeBOiBJkDWF3A2y9+yqnmJ4JKc2C+nMjSjmgDeTwgN1rQ==", "license": "ISC", "dependencies": { "@babel/runtime": "^7.20.13", @@ -8429,9 +8817,9 @@ "uuid": "^8.3.2" }, "peerDependencies": { - "@auth/core": "0.34.2", - "next": "^12.2.5 || ^13 || ^14 || ^15", - "nodemailer": "^6.6.5", + "@auth/core": "0.34.3", + "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", + "nodemailer": "^7.0.7", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" }, @@ -8507,10 +8895,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/node-walker": { @@ -8522,12 +8909,10 @@ } }, "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.13.tgz", + "integrity": "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==", "license": "MIT-0", - "optional": true, - "peer": true, "engines": { "node": ">=6.0.0" } @@ -9026,13 +9411,13 @@ } }, "node_modules/playwright": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", - "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.1.tgz", + "integrity": "sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.52.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -9045,9 +9430,9 @@ } }, "node_modules/playwright-core": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", - "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.1.tgz", + "integrity": "sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -9061,7 +9446,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -9780,19 +10164,6 @@ "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -9901,9 +10272,10 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollbar": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.26.4.tgz", - "integrity": "sha512-JKmrj6riYm9ZPJisgxljgH4uCsvjMHDHXrinDF7aAFaP+eoF51HomVPtLcDTYLsrJ568aKVNLUhedFajONBwSg==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.26.5.tgz", + "integrity": "sha512-4Of0ALl5+CU2glyDy5dWMRRy9Ty81DrY2r46ucbqjtCikbgHoWJNGXbQUWpDaLxsc8Q71LT/yj1bPb9NHbJIFQ==", + "license": "MIT", "dependencies": { "async": "~3.2.3", "console-polyfill": "0.3.0", @@ -9912,9 +10284,6 @@ "lru-cache": "~2.2.1", "request-ip": "~3.3.0", "source-map": "^0.5.7" - }, - "optionalDependencies": { - "decache": "^3.0.5" } }, "node_modules/rollbar/node_modules/lru-cache": { @@ -10036,9 +10405,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -10048,12 +10417,13 @@ } }, "node_modules/serwist": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/serwist/-/serwist-9.0.13.tgz", - "integrity": "sha512-BF3bmzYdOVT2lF3iHV0044NqTO6q6GAiqrYpc7L9EPYQXZHOy22WajKaHLvCdvpm2Jpji4SsxUL8/uC1WSCZ5g==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/serwist/-/serwist-9.5.4.tgz", + "integrity": "sha512-uTHBzpIeA6rE3oyRt392MbtNQDs2JVZelKD1KkT18UkhX6HRwCeassoI1Nd1h52DqYqa7ZfBeldJ4awy+PYrnQ==", "license": "MIT", "dependencies": { - "idb": "8.0.2" + "@serwist/utils": "9.5.4", + "idb": "8.0.3" }, "peerDependencies": { "typescript": ">=5.0.0" @@ -10096,16 +10466,16 @@ } }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -10114,25 +10484,30 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -10182,23 +10557,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -10250,15 +10608,16 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -10349,14 +10708,6 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10629,19 +10980,22 @@ } }, "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -10794,15 +11148,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10837,12 +11182,6 @@ "node": ">=12" } }, - "node_modules/traverse-chain": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", - "optional": true - }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -11190,10 +11529,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -11657,9 +11995,9 @@ } }, "node_modules/zod": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 93953def..118cde82 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "next": "^15.2.4", "next-auth": "^4.24.11", "next-seo": "^6.6.0", + "nodemailer": "^7.0.13", "omit-call-signature": "^1.0.15", "react": "18.3.1", "react-beautiful-dnd": "^13.1.1", @@ -79,7 +80,7 @@ "jest": "^29.7.0", "postcss": "^8.5.3", "prettier": "3.5.3", - "serwist": "^9.0.11", + "serwist": "^9.0.13", "tailwindcss": "^3.4.17", "ts-jest": "^29.2.5" } From 70813ec1ab9e812457edfe383cecec1258871c1d Mon Sep 17 00:00:00 2001 From: Cullen Date: Wed, 4 Mar 2026 20:52:39 -0500 Subject: [PATCH 05/12] 3/4 --- lib/Enums.ts | 14 +++ lib/client/StatsMath.ts | 6 +- lib/games.ts | 244 +++++++++------------------------------- 3 files changed, 72 insertions(+), 192 deletions(-) diff --git a/lib/Enums.ts b/lib/Enums.ts index 20669b16..9e4361b3 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -143,4 +143,18 @@ export namespace RebuiltEnums { ScoreOneOrMoreFuel = "Score One Or More Fuel", ScoreFuelAndClimb = "Score Fuel And Climb", } + export enum OffenceDriverSkill{ + LevelOne = "One", + LevelTwo = "Two", + LevelThree = "Three", + LevelFour = "Four", + LevelFive = "Five", + } + export enum DefenceDriverSkill { + LevelOne = "One", + LevelTwo = "Two", + LevelThree = "Three", + LevelFour = "Four", + LevelFive = "Five", + } } diff --git a/lib/client/StatsMath.ts b/lib/client/StatsMath.ts index 6fd009f7..036edcfb 100644 --- a/lib/client/StatsMath.ts +++ b/lib/client/StatsMath.ts @@ -153,9 +153,9 @@ export function GetMinimum( stat: string, ) { if (!quantitativeReports) return 0; - let minimum = quantitativeReports[0].data[stat]; + let minimum = Number(quantitativeReports[0].data[stat]); for (let repo of quantitativeReports) { - if (repo.data[stat] < minimum) { + if (Number(repo.data[stat]) < minimum) { minimum = repo.data[stat]; } } @@ -170,7 +170,7 @@ export function GetMaximum( if (!quantitativeReports) return 0; let maximum = 0; for (let repo of quantitativeReports) { - if (repo.data[stat] > maximum) { + if (Number(repo.data[stat]) > maximum) { maximum = repo.data[stat]; } } diff --git a/lib/games.ts b/lib/games.ts index ffcf2ca2..9245a863 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -34,7 +34,7 @@ import { import { report } from "process"; import { GetMaximum } from "./client/StatsMath"; import { getMaxListeners } from "events"; -//import { ClimbingCapabilities, ClimbingAbilities } from './Enums'; +//import { ClimbingCapabilities, ClimbingAbilities, DriverSkillLevel } from './Enums'; function getBaseBadges( pitReport: Pitreport | undefined, @@ -1893,18 +1893,19 @@ namespace Reefscape { export namespace Rebuilt { export class QuantitativeData extends QuantData { - AutoScoredOnePoint: number = 0; - AutoScoredFivePoint: number = 0; - AutoScoredTenPoint: number = 0; + TotalAllianceFuelPoints: number = 0; + PercentagePointsScored: number = 0; + + AutoCycles: number = 0; AutoTotalScored: number = 0; AutoClimbedLevelOne: boolean = false; - TeleopScoredOnePoint: number = 0; - TeleopScoredFivePoint: number = 0; - TeleopScoredTenPoint: number = 0; - TeleopTotalScored: number = 0; EngameDefenseStatus: Defense = Defense.None; LevelClimbed: RebuiltEnums.LevelClimbed = RebuiltEnums.LevelClimbed.No; + OffenceDriverSkill: RebuiltEnums.OffenceDriverSkill = + RebuiltEnums.OffenceDriverSkill.LevelOne; + DefenceDriverSkill: RebuiltEnums.DefenceDriverSkill = + RebuiltEnums.DefenceDriverSkill.LevelOne; } export class PitData extends PitReportData { GroundIntake: boolean = false; @@ -1912,7 +1913,7 @@ export namespace Rebuilt { CanDriveUnderTrench: boolean = false; CanDeClimb: boolean = false; CanScoreFuel: boolean = false; - FuelScoredAuto: number = 0; + HopperVolume: number = 0; AutoAbilities: RebuiltEnums.AutoAbilities = RebuiltEnums.AutoAbilities.NoAuto; ClimbingAbilities: RebuiltEnums.ClimbingAbilities = @@ -1926,181 +1927,83 @@ export namespace Rebuilt { { key: "CanDeClimb", label: "Can De-Climb?" }, { key: "CanScoreFuel", label: "Can Score Fuel?" }, { key: "ClimbingAbilites", label: "Climbing?" }, + { key: "HopperVolume", label: "Hopper Volume?" }, ], "Auto (Describe more in comments)": [ { key: "AutoAbilities", label: "Auto Capabilities?" }, - { key: "FuelScoredAuto", label: "Average Fuel Scored In Auto" }, ], }; const quantitativeReportLayout: FormLayoutProps = { Auto: [ - [ - [ - { key: "AutoScoredOnePoint", label: "1 Point Scored (Auto)" }, - { key: "AutoScoredFivePoint", label: "5 Point Scared (Auto)" }, - { key: "AutoScoredTenPoint", label: "10 Point Scored (Auto)" }, - ], - ], + /*[[{ key: "AutoCycles", label: "Number Of Cycles In Auto" }]],*/ { key: "AutoClimbedLevelOne", label: "Climbed Level One (Auto)" }, ], Teleop: [ [ [ - { key: "TeleopScoredOnePoint", label: "1 Point Scored (Teleop)" }, - { key: "TeleopScoredFivePoint", label: "5 Point Scored (Teleop)" }, - { key: "TeleopScoredTenPoint", label: "10 Point Scored (Teleop)" }, + { + key: "TotalAllianceFuelPoints", + label: "Fuel Scored By Allience(Must Be Just A Whole Number)", + }, + { + key: "PercentagePointsScored", + label: "Estimated Percentage Of Points(Must Be Just A Whole Number)", + }, ], ], ], - "Post Match": ["LevelClimbed", "Defense"], + "Post Match": [ + "LevelClimbed", + "Defense", + "OffenceDriverSkill", + "DefenceDriverSkill", + { + key: "EstimatedHopperVolume", + label: "Estamate Of Fuel The Hopper Can Hold?", + }, + { + key: "EstimatedFuelMissed", + label: "Estamate Of Fuel Missed Per Cycle", + }, + ], }; - function getTotalFuel(reports: Report[] | undefined) { - if (!reports) return 0; - - for (const report of reports.map((r) => r.data)) { - report.TeleopTotalScored += report.TeleopScoredOnePoint; - report.TeleopTotalScored += report.TeleopScoredFivePoint * 5; - report.TeleopTotalScored += report.TeleopScoredTenPoint * 10; - report.AutoTotalScored += report.AutoScoredOnePoint; - report.AutoTotalScored += report.AutoScoredFivePoint * 5; - report.AutoTotalScored += report.AutoScoredFivePoint * 10; - } - } - getTotalFuel const statsLayout: StatsLayout = { sections: { Auto: [ - { - key: "AutoScoredOnePoint", - label: "Avg Amt Of Fuel Scored In Increments Of One Auto", - }, - { - label: "> Min Auto One Point Fuel", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "AutoScoredOnePoint"); - }, - }, - { - label: "> Max Auto One Point Fuel", - get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "AutoScoredOnePoint"); - }, - }, - { - key: "AutoScoredFivePoint", - label: "Avg Amt Of Fuel Scored In Increments Of Five Auto", - }, - { - label: "> Min Auto Five Point Fuel", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "AutoScoredFivePoint"); - }, - }, - { - label: "> Max Auto five Point Fuel", - get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "AutoScoredFivePoint"); - }, - }, - { - key: "AutoScoredTenPoint", - label: "Avg Amt Of Fuel Scored In Increments Of Ten Auto", - }, - { - label: "> Min Auto Ten Point Fuel", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "autoScoredTenPoint"); - }, - }, - { - label: "> Max Auto Ten Point Fuel", - get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "autoScoredTenPoint"); - }, - }, - { - label: "Average Auto Fuel", - get(pitData, quantitativeReports) { - if (!quantitativeReports) return 0; - - return ( - quantitativeReports?.reduce( - (acc, report) => - acc + - report.data.AutoScoredOnePoint + - report.data.AutoScoredFivePoint + - report.data.AutoScoredTenPoint, - 0, - ) / quantitativeReports?.length - ); - }, - }, ], + Teleop: [ { - key: "TeleopScoredOnePoint", - label: "Teleop Scored One Point Fuel", - }, - { - label: "< Min Teleop Scored One Point Fuel", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "TeleopScoredOnePoint"); - }, - }, - { - label: "< Max Teleop Scored One Point Fuel", - get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "TeleopScoredOnePoint"); - }, - }, - { - key: "TeleopScoredFivePoint", - label: "Teleop Scored Five Point Fuel", + key: "TotalAllianceFuelPoints", + label: "Total Fuel Points Scored By Alliance", }, { - label: "< Min Teleop Scored Five Point Fuel", + label: "< Min Fuel Points Scored By Alliance", get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "TeleopScoredFivePoint"); + return GetMinimum(quantitativeReports!, "TotalAllianceFuelPoints"); }, }, { - label: "< Maximum Teleop Scored Five Point Fuel", + label: "< Max Fuel Points Scored By Alliance", get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "TeleopScoredFivePoint"); + return GetMaximum(quantitativeReports!, "TotalAllianceFuelPoints"); }, }, { - key: "TeleopScoredTenPoint", - label: "Teleop Scored Ten Point Fuel", - }, - { - label: "< Min Teleop Scored Ten Point Fuel", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "TeleopScoredTenPoint"); - }, + key: "PercentagePointsScored", + label: "Estamated Percentage Points Scored By Team", }, { - label: "< Maximum Teleop Scored Ten Point Fuel", + label: "< Min Estamated Percentage Points Scored By Team", get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "TeleopScoredTenPoint"); + return GetMinimum(quantitativeReports!, "PercentagePointsScored"); }, }, { - label: "Average Teleop Fuel", + label: "< Max Estamated Percentage Points Scored By Team", get(pitData, quantitativeReports) { - if (!quantitativeReports) return 0; - - return ( - quantitativeReports?.reduce( - (acc, report) => - acc + - report.data.TeleopScoredOnePoint + - report.data.TeleopScoredFivePoint + - report.data.TeleopScoredTenPoint, - 0, - ) / quantitativeReports?.length - ); + return GetMaximum(quantitativeReports!, "PercentagePointsScored"); }, }, ], @@ -2114,60 +2017,26 @@ export namespace Rebuilt { }; const pitStatsLayout: PitStatsLayout = { overallSlideStats: [ - { - key: "FuelScoredAuto", - label: "Amount of fuel scored in auto", - }, ], individualSlideStats: [ { - label: "Average Auto Points", - get: ( - pitReport: Pitreport | undefined, - quantitativeReports: Report[] | undefined, - ) => { - if (!quantitativeReports) return 0; - - const OneFuelScored = NumericalTotal( - "AutoScoredOnePoint", - quantitativeReports, - ); - const FiveFuelScored = NumericalTotal( - "AutoScoredFivePoint", - quantitativeReports, - ); - const TenFuelScored = NumericalTotal( - "AutoScoredTenPoint", - quantitativeReports, - ); - return ( - (OneFuelScored + FiveFuelScored + TenFuelScored) / - quantitativeReports.length - ); - }, - }, - { - label: "Average Teleop Points", + label: "Average Points", get: ( pitReport: Pitreport | undefined, quantitativeReports: Report[] | undefined, ) => { if (!quantitativeReports) return 0; - const TeleopOneFuelScored = NumericalTotal( - "TeleopScoredOnePoint", + const TotalAllianceFuelPoints = NumericalTotal( + "TotalAllianceFuelPoints", quantitativeReports, ); - const TeleopFiveFuelScored = NumericalTotal( - "TeleopScoredFivePoint", - quantitativeReports, - ); - const TeleopTenFuelScored = NumericalTotal( - "TeleopScoredTenPoint", + const PercentagePointsScored = NumericalTotal( + "PercentagePointsScored", quantitativeReports, ); return ( - (TeleopOneFuelScored + TeleopFiveFuelScored + TeleopTenFuelScored) / + (TotalAllianceFuelPoints) / quantitativeReports.length ); }, @@ -2252,11 +2121,9 @@ export namespace Rebuilt { totalPoints += 30; break; } - totalPoints += report.AutoScoredOnePoint + report.TeleopScoredOnePoint; - totalPoints += - (report.AutoScoredFivePoint + report.TeleopScoredFivePoint) * 5; totalPoints += - (report.AutoScoredTenPoint + report.TeleopScoredTenPoint) * 10; + Number(report.TotalAllianceFuelPoints) * + (Number(report.PercentagePointsScored)/10); } return totalPoints / Math.max(reports.length, 1); } @@ -2266,7 +2133,6 @@ export namespace Rebuilt { League.FRC, QuantitativeData, PitData, - //getTotalFuel, pitReportLayout, quantitativeReportLayout, statsLayout, From d9b35006b6f99f3e72156363850db59da7a84f60 Mon Sep 17 00:00:00 2001 From: Cullen Date: Wed, 4 Mar 2026 21:24:33 -0500 Subject: [PATCH 06/12] new 3/4 --- lib/client/StatsMath.ts | 8 +++++--- lib/games.ts | 44 +++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/lib/client/StatsMath.ts b/lib/client/StatsMath.ts index 036edcfb..44a027c2 100644 --- a/lib/client/StatsMath.ts +++ b/lib/client/StatsMath.ts @@ -44,7 +44,7 @@ export function NumericalTotal( reports: Report[], ) { let sum = 0; - reports?.forEach((report) => (sum += getSelection(selector, report))); + reports?.forEach((report) => (sum += Number(getSelection(selector, report) || 0))); return Round(sum); } @@ -156,8 +156,10 @@ export function GetMinimum( let minimum = Number(quantitativeReports[0].data[stat]); for (let repo of quantitativeReports) { if (Number(repo.data[stat]) < minimum) { - minimum = repo.data[stat]; + minimum = Number(repo.data[stat]); + } + } return minimum; } @@ -171,7 +173,7 @@ export function GetMaximum( let maximum = 0; for (let repo of quantitativeReports) { if (Number(repo.data[stat]) > maximum) { - maximum = repo.data[stat]; + maximum = Number(repo.data[stat]); } } return maximum; diff --git a/lib/games.ts b/lib/games.ts index 9245a863..a9f6d8d9 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1893,11 +1893,9 @@ namespace Reefscape { export namespace Rebuilt { export class QuantitativeData extends QuantData { - TotalAllianceFuelPoints: number = 0; - PercentagePointsScored: number = 0; + TotalAllianceFuelPoints: Number = 0; + PercentagePointsScored: Number = 0; - AutoCycles: number = 0; - AutoTotalScored: number = 0; AutoClimbedLevelOne: boolean = false; EngameDefenseStatus: Defense = Defense.None; @@ -1947,7 +1945,8 @@ export namespace Rebuilt { }, { key: "PercentagePointsScored", - label: "Estimated Percentage Of Points(Must Be Just A Whole Number)", + label: + "Estimated Percentage Of Points(Must Be Just A Whole Number)", }, ], ], @@ -1957,26 +1956,22 @@ export namespace Rebuilt { "Defense", "OffenceDriverSkill", "DefenceDriverSkill", - { - key: "EstimatedHopperVolume", - label: "Estamate Of Fuel The Hopper Can Hold?", - }, - { - key: "EstimatedFuelMissed", - label: "Estamate Of Fuel Missed Per Cycle", - }, ], }; const statsLayout: StatsLayout = { sections: { - Auto: [ - ], + Auto: [], Teleop: [ { - key: "TotalAllianceFuelPoints", label: "Total Fuel Points Scored By Alliance", + get(pitData, quantitativeReports) { + return NumericalTotal( + "TotalAllianceFuelPoints", + quantitativeReports!, + ); + }, }, { label: "< Min Fuel Points Scored By Alliance", @@ -1991,8 +1986,13 @@ export namespace Rebuilt { }, }, { - key: "PercentagePointsScored", label: "Estamated Percentage Points Scored By Team", + get(pitData, quantitativeReports) { + return NumericalTotal( + "PercentagePointsScored", + quantitativeReports!, + ); + }, }, { label: "< Min Estamated Percentage Points Scored By Team", @@ -2016,8 +2016,7 @@ export namespace Rebuilt { }, }; const pitStatsLayout: PitStatsLayout = { - overallSlideStats: [ - ], + overallSlideStats: [], individualSlideStats: [ { label: "Average Points", @@ -2035,10 +2034,7 @@ export namespace Rebuilt { "PercentagePointsScored", quantitativeReports, ); - return ( - (TotalAllianceFuelPoints) / - quantitativeReports.length - ); + return TotalAllianceFuelPoints / quantitativeReports.length; }, }, { @@ -2123,7 +2119,7 @@ export namespace Rebuilt { } totalPoints += Number(report.TotalAllianceFuelPoints) * - (Number(report.PercentagePointsScored)/10); + (Number(report.PercentagePointsScored) / 10); } return totalPoints / Math.max(reports.length, 1); } From 787adb9f8da3fda75d58811cb9d637a211677e43 Mon Sep 17 00:00:00 2001 From: Cullen Date: Thu, 5 Mar 2026 16:13:01 -0500 Subject: [PATCH 07/12] 3/5 --- lib/Gearbox.code-workspace | 9 +++++++++ lib/games.ts | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 lib/Gearbox.code-workspace diff --git a/lib/Gearbox.code-workspace b/lib/Gearbox.code-workspace new file mode 100644 index 00000000..283f6185 --- /dev/null +++ b/lib/Gearbox.code-workspace @@ -0,0 +1,9 @@ +{ + "folders": [ + { + "name": "Gearbox", + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/lib/games.ts b/lib/games.ts index a9f6d8d9..cd6cd9a7 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1941,12 +1941,13 @@ export namespace Rebuilt { [ { key: "TotalAllianceFuelPoints", - label: "Fuel Scored By Allience(Must Be Just A Whole Number)", + label: "Fuel Scored By Allience", + type: "number", }, { key: "PercentagePointsScored", - label: - "Estimated Percentage Of Points(Must Be Just A Whole Number)", + label: "Estimated Percentage Of Points", + type: "number", }, ], ], From e7dab61490a25ba7f4dba05bcfb1d5a534edd833 Mon Sep 17 00:00:00 2001 From: Tr01ler Date: Thu, 5 Mar 2026 16:51:42 -0500 Subject: [PATCH 08/12] Made branch FRC-Rebuilt --- package-lock.json | 8 ++--- package.json | 2 +- tsconfig.json | 83 ++++++++++++++++++++++++++--------------------- 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d3d3dc2..96f54ad1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "next": "^15.2.6", "next-auth": "^4.24.11", "next-seo": "^6.6.0", - "nodemailer": "^7.0.12", + "nodemailer": "^7.0.13", "omit-call-signature": "^1.0.15", "react": "18.3.1", "react-beautiful-dnd": "^13.1.1", @@ -8895,9 +8895,9 @@ } }, "node_modules/nodemailer": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.12.tgz", - "integrity": "sha512-H+rnK5bX2Pi/6ms3sN4/jRQvYSMltV6vqup/0SFOrxYYY/qoNvhXPlYq3e+Pm9RFJRwrMGbMIwi81M4dxpomhA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.13.tgz", + "integrity": "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==", "license": "MIT-0", "peer": true, "engines": { diff --git a/package.json b/package.json index 41c2f309..d53e168e 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "next": "^15.2.6", "next-auth": "^4.24.11", "next-seo": "^6.6.0", - "nodemailer": "^7.0.12", + "nodemailer": "^7.0.13", "omit-call-signature": "^1.0.15", "react": "18.3.1", "react-beautiful-dnd": "^13.1.1", diff --git a/tsconfig.json b/tsconfig.json index 8dff24bc..c9757eed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,39 +1,48 @@ { - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext", "webworker"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "downlevelIteration": true, - "paths": { - "@/*": ["./*"] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - "pages/createTeam.tsx", - "pages/[teamSlug]/createSeason.ksx", - "pages/index.tsx", - "pages/profile.jsx", - "pages/[teamSlug]/index.jsx", - "pages/[teamSlug]/[seasonSlug]/index.jsx", - "pages/[teamSlug]/[seasonSlug]/[competitonSlug]/index.jsx", - "lib/client/getSession.js", - "index.ts", - "pages/_error.js", - "tests/lib/client/InputVerification.test.ts" - ], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext", + "webworker" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "downlevelIteration": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "pages/createTeam.tsx", + "pages/[teamSlug]/createSeason.ksx", + "pages/index.tsx", + "pages/profile.jsx", + "pages/[teamSlug]/index.jsx", + "pages/[teamSlug]/[seasonSlug]/index.jsx", + "pages/[teamSlug]/[seasonSlug]/[competitonSlug]/index.jsx", + "lib/client/getSession.js", + "index.ts", + "pages/_error.js", + "tests/lib/client/InputVerification.test.ts" + ], + "exclude": [ + "node_modules" + ] } From 8f5ee206a9fc6e299832ab300a52663391357f13 Mon Sep 17 00:00:00 2001 From: Gearbox Bot Date: Thu, 5 Mar 2026 22:01:13 +0000 Subject: [PATCH 09/12] 1.3.6 --- package-lock.json | 451 +--------------------------------------------- package.json | 2 +- 2 files changed, 3 insertions(+), 450 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46a6fbe4..05332676 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sj3", - "version": "1.3.5", + "version": "1.3.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sj3", - "version": "1.3.5", + "version": "1.3.6", "license": "CC BY-NC-SA 4.0", "dependencies": { "dependencies": "^0.0.1", @@ -1649,453 +1649,6 @@ "@img/sharp-libvips-linux-x64": "1.2.4" } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, "node_modules/@img/sharp-linuxmusl-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", diff --git a/package.json b/package.json index 26e16061..3b42e51d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sj3", - "version": "1.3.5", + "version": "1.3.6", "private": true, "repository": "https://github.com/Decatur-Robotics/Gearbox", "license": "CC BY-NC-SA 4.0", From 4bf85145fd9ddfb2ea9392f269856f8ad080638c Mon Sep 17 00:00:00 2001 From: Tr01ler Date: Thu, 5 Mar 2026 19:08:09 -0500 Subject: [PATCH 10/12] Uh it almost works --- lib/Enums.ts | 17 +- lib/Layout.ts | 4 +- lib/games.ts | 160 +++++++++---------- pages/[teamSlug]/[seasonSlug]/createComp.tsx | 3 + 4 files changed, 88 insertions(+), 96 deletions(-) diff --git a/lib/Enums.ts b/lib/Enums.ts index 5eef3b60..cfadb311 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -144,19 +144,7 @@ export namespace RebuiltEnums { ScoreOneOrMoreFuel = "Score One Or More Fuel", ScoreFuelAndClimb = "Score Fuel And Climb", } - export enum OffenceDriverSkill{ - LevelOne = "One", - LevelTwo = "Two", - LevelThree = "Three", - LevelFour = "Four", - LevelFive = "Five", - } - export enum DefenceDriverSkill { - LevelOne = "One", - LevelTwo = "Two", - LevelThree = "Three", - LevelFour = "Four", - LevelFive = "Five", +} export namespace DecodeEnums { export enum EndgameParkStatus { @@ -166,10 +154,11 @@ export namespace DecodeEnums { TwoBotPark = "Two Bot Park", } - export enum AutoCapabilities { + export enum AutoStatus { NoAuto = "No Auto", MovePastStart = "Move Past Start", ScoreOneArtifact = "Score One Artifact", ScoreMultipleArtifacts = "Score Multiple Artifacts", } } + \ No newline at end of file diff --git a/lib/Layout.ts b/lib/Layout.ts index 03dde83f..e0135a6b 100644 --- a/lib/Layout.ts +++ b/lib/Layout.ts @@ -224,7 +224,7 @@ export function keyToType( RebuiltEnums.DriveOverBump, RebuiltEnums.DriveUnderTrench, RebuiltEnums.LevelClimbed, - DecodeEnums.AutoCapabilities, + DecodeEnums.AutoStatus, DecodeEnums.EndgameParkStatus, ]; @@ -247,7 +247,7 @@ export function keyToType( if (key == "LevelClimbed") return RebuiltEnums.LevelClimbed; if (key == "EndgameParkStatusDecode") return DecodeEnums.EndgameParkStatus; - if (key == "AutoAbilities") return DecodeEnums.AutoCapabilities; + if (key == "AutoStatus") return DecodeEnums.AutoStatus; for (const e of enums) { if (Object.values(e).includes(exampleData[key])) return e; diff --git a/lib/games.ts b/lib/games.ts index 9bb5e742..f23b993a 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1898,17 +1898,14 @@ namespace Reefscape { export namespace Rebuilt { export class QuantitativeData extends QuantData { - TotalAllianceFuelPoints: Number = 0; - PercentagePointsScored: Number = 0; + FuelPointsOne: number = 0; + FuelPointsFive: number = 0; + FuelPointsTen: number = 0; AutoClimbedLevelOne: boolean = false; EngameDefenseStatus: Defense = Defense.None; LevelClimbed: RebuiltEnums.LevelClimbed = RebuiltEnums.LevelClimbed.No; - OffenceDriverSkill: RebuiltEnums.OffenceDriverSkill = - RebuiltEnums.OffenceDriverSkill.LevelOne; - DefenceDriverSkill: RebuiltEnums.DefenceDriverSkill = - RebuiltEnums.DefenceDriverSkill.LevelOne; } export class PitData extends PitReportData { GroundIntake: boolean = false; @@ -1932,85 +1929,93 @@ export namespace Rebuilt { { key: "ClimbingAbilites", label: "Climbing?" }, { key: "HopperVolume", label: "Hopper Volume?" }, ], - "Auto (Describe more in comments)": [ + Auto: [ { key: "AutoAbilities", label: "Auto Capabilities?" }, ], }; const quantitativeReportLayout: FormLayoutProps = { Auto: [ - /*[[{ key: "AutoCycles", label: "Number Of Cycles In Auto" }]],*/ { key: "AutoClimbedLevelOne", label: "Climbed Level One (Auto)" }, - ], - Teleop: [ [ [ { - key: "TotalAllianceFuelPoints", - label: "Fuel Scored By Allience", - type: "number", + key: "FuelPointsOne", + label: "One point", + }, + ], + [ + { + key: "FuelPointsFive", + label: "Five points", }, + ], + [ { - key: "PercentagePointsScored", - label: "Estimated Percentage Of Points", - type: "number", + key: "FuelPointsTen", + label: "Ten points", }, ], ], ], - "Post Match": [ - "LevelClimbed", - "Defense", - "OffenceDriverSkill", - "DefenceDriverSkill", + Teleop: [ + [ + [ + { + key: "FuelPointsOne", + label: "One point", + }, + ], + [ + { + key: "FuelPointsFive", + label: "Five points", + }, + ], + [ + { + key: "FuelPointsTen", + label: "Ten points", + }, + ], + ], ], - }; + "Post Match": ["LevelClimbed", "Defense"], + }; const statsLayout: StatsLayout = { sections: { - Auto: [], + Auto: [], Teleop: [ { label: "Total Fuel Points Scored By Alliance", get(pitData, quantitativeReports) { - return NumericalTotal( - "TotalAllianceFuelPoints", - quantitativeReports!, + return ( + NumericalTotal("FuelPointsOne", quantitativeReports!) + + NumericalTotal("FuelPointsFive", quantitativeReports!) * 5 + + NumericalTotal("FuelPointsTen", quantitativeReports!) * 10 ); }, }, { label: "< Min Fuel Points Scored By Alliance", get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "TotalAllianceFuelPoints"); + return ( + GetMinimum(quantitativeReports!, "FuelPointsOne") + + GetMinimum(quantitativeReports!, "FuelPointsFive") * 5 + + GetMinimum(quantitativeReports!, "FuelPointsTen") * 10 + ); }, }, { label: "< Max Fuel Points Scored By Alliance", get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "TotalAllianceFuelPoints"); - }, - }, - { - label: "Estamated Percentage Points Scored By Team", - get(pitData, quantitativeReports) { - return NumericalTotal( - "PercentagePointsScored", - quantitativeReports!, + return ( + GetMaximum(quantitativeReports!, "FuelPointsOne") + + GetMaximum(quantitativeReports!, "FuelPointsFive") * 5 + + GetMaximum(quantitativeReports!, "FuelPointsTen") * 10 ); }, }, - { - label: "< Min Estamated Percentage Points Scored By Team", - get(pitData, quantitativeReports) { - return GetMinimum(quantitativeReports!, "PercentagePointsScored"); - }, - }, - { - label: "< Max Estamated Percentage Points Scored By Team", - get(pitData, quantitativeReports) { - return GetMaximum(quantitativeReports!, "PercentagePointsScored"); - }, - }, ], }, getGraphDots: function ( @@ -2020,44 +2025,40 @@ export namespace Rebuilt { return []; }, }; - - const pitStatsLayout: PitStatsLayout = { + + const pitStatsLayout: PitStatsLayout = { overallSlideStats: [], individualSlideStats: [ { label: "Average Points", - get: ( + get: ( pitReport: Pitreport | undefined, quantitativeReports: Report[] | undefined, ) => { - if (!quantitativeReports) return 0; + if (!quantitativeReports) return 0; - const TotalAllianceFuelPoints = NumericalTotal( - "TotalAllianceFuelPoints", - quantitativeReports, - ); - const PercentagePointsScored = NumericalTotal( - "PercentagePointsScored", - quantitativeReports, - ); + const TotalAllianceFuelPoints = + NumericalTotal("FuelPointsOne", quantitativeReports) + + NumericalTotal("FuelPointsFive", quantitativeReports) * 5 + + NumericalTotal("FuelPointsTen", quantitativeReports) * 10; return TotalAllianceFuelPoints / quantitativeReports.length; }, }, { label: "Ave Endgame Stats", - get: ( + get: ( pitReport: Pitreport | undefined, quantitativeReports: Report[] | undefined, ) => { - if (!quantitativeReports) return 0; + if (!quantitativeReports) return 0; const climb = NumericalTotal("LevelClimbed", quantitativeReports); return Round(climb) / quantitativeReports.length; - }, + }, }, ], robotCapabilities: [ - { key: "GroundIntake", label: "Has Ground Intake?" }, + { key: "GroundIntake", label: "Has Ground Intake?" }, { key: "CanDriveOverBump", label: "Can Drive Over Bump?" }, { key: "CanDriveUnderTrench", label: "Can Drive Under Trench?" }, { key: "CanDeClimb", label: "Can De-Climb?" }, @@ -2070,14 +2071,14 @@ export namespace Rebuilt { }, }; - function getBadges( + function getBadges( pitReport: Pitreport | undefined, quantitativeReports: Report[] | undefined, card: boolean, ) { const badges: Badge[] = getBaseBadges(pitReport, quantitativeReports); - - if (pitReport?.data?.GroundIntake) + + if (pitReport?.data?.GroundIntake) badges.push({ text: "Can Use Ground Intake", color: "primary" }); if (pitReport?.data?.CanDriveOverBump) badges.push({ text: "Can Drive Over Bump", color: "accent" }); @@ -2106,15 +2107,14 @@ export namespace Rebuilt { return badges; } - - function getAvgPoints(reports: Report[] | undefined) { + + function getAvgPoints(reports: Report[] | undefined) { if (!reports) return 0; let totalPoints = 0; for (const report of reports.map((r) => r.data)) { - - switch (report.LevelClimbed) { + switch (report.LevelClimbed) { case RebuiltEnums.LevelClimbed.No: break; case RebuiltEnums.LevelClimbed.First: @@ -2128,8 +2128,9 @@ export namespace Rebuilt { break; } totalPoints += - Number(report.TotalAllianceFuelPoints) * - (Number(report.PercentagePointsScored) / 10); + Number(report.FuelPointsOne) + + Number(report.FuelPointsFive) * 5 + + Number(report.FuelPointsTen) * 10; } return totalPoints / Math.max(reports.length, 1); } @@ -2137,21 +2138,20 @@ export namespace Rebuilt { "Rebuilt", 2026, League.FRC, - QuantitativeData, + QuantitativeData, PitData, pitReportLayout, quantitativeReportLayout, statsLayout, pitStatsLayout, - "Rebuilt", + "Rebuilt", "https://www.firstinspires.org/hs-fs/hubfs/image-library/web/frc_rebuilt_1240x860.webp?width=630", - "invert", //Ask Colin - getBadges, + "invert", + getBadges, getAvgPoints, ); } - export namespace Decode { export class QuantitativeData extends QuantData { AutoMovedPastStartingLine: boolean = false; @@ -2178,8 +2178,8 @@ export namespace Decode { ArtifactsScoredAuto: number = 0; AutoAccountsForMotif: boolean = false; - AutoAbilities: DecodeEnums.AutoCapabilities = - DecodeEnums.AutoCapabilities.NoAuto; + AutoAbilities: DecodeEnums.AutoStatus = + DecodeEnums.AutoStatus.NoAuto; } const pitReportLayout: FormLayoutProps = { diff --git a/pages/[teamSlug]/[seasonSlug]/createComp.tsx b/pages/[teamSlug]/[seasonSlug]/createComp.tsx index b8d52415..6bf87ea0 100644 --- a/pages/[teamSlug]/[seasonSlug]/createComp.tsx +++ b/pages/[teamSlug]/[seasonSlug]/createComp.tsx @@ -191,9 +191,12 @@ export const getServerSideProps: GetServerSideProps = async (context) => { return resolved; } + console.log(resolved); + return { props: { ...resolved, + season: serializeDatabaseObject(resolved.season), }, }; From a863d468bdf5ace52af2459f8e0768d0dba1338b Mon Sep 17 00:00:00 2001 From: Tr01ler Date: Thu, 5 Mar 2026 20:02:15 -0500 Subject: [PATCH 11/12] ctrl + S --- lib/Enums.ts | 1 - lib/Layout.ts | 2 +- lib/games.ts | 7 ++----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/Enums.ts b/lib/Enums.ts index cfadb311..4086cde2 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -161,4 +161,3 @@ export namespace DecodeEnums { ScoreMultipleArtifacts = "Score Multiple Artifacts", } } - \ No newline at end of file diff --git a/lib/Layout.ts b/lib/Layout.ts index e0135a6b..e2c06760 100644 --- a/lib/Layout.ts +++ b/lib/Layout.ts @@ -245,7 +245,7 @@ export function keyToType( if (key == "DriveOverBump") return RebuiltEnums.DriveOverBump; if (key == "DiveUnderTrench") return RebuiltEnums.DriveUnderTrench; if (key == "LevelClimbed") return RebuiltEnums.LevelClimbed; - + if (key == "EndgameParkStatusDecode") return DecodeEnums.EndgameParkStatus; if (key == "AutoStatus") return DecodeEnums.AutoStatus; diff --git a/lib/games.ts b/lib/games.ts index f23b993a..b90efff9 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -1929,9 +1929,7 @@ export namespace Rebuilt { { key: "ClimbingAbilites", label: "Climbing?" }, { key: "HopperVolume", label: "Hopper Volume?" }, ], - Auto: [ - { key: "AutoAbilities", label: "Auto Capabilities?" }, - ], + Auto: [{ key: "AutoAbilities", label: "Auto Capabilities?" }], }; const quantitativeReportLayout: FormLayoutProps = { Auto: [ @@ -2178,8 +2176,7 @@ export namespace Decode { ArtifactsScoredAuto: number = 0; AutoAccountsForMotif: boolean = false; - AutoAbilities: DecodeEnums.AutoStatus = - DecodeEnums.AutoStatus.NoAuto; + AutoAbilities: DecodeEnums.AutoStatus = DecodeEnums.AutoStatus.NoAuto; } const pitReportLayout: FormLayoutProps = { From 3a9311d9d23680cf6a3cb246ff17f7ed2afb1558 Mon Sep 17 00:00:00 2001 From: Tr01ler Date: Thu, 5 Mar 2026 20:05:16 -0500 Subject: [PATCH 12/12] Prettier go! --- lib/Gearbox.code-workspace | 8 +- lib/client/StatsMath.ts | 6 +- pages/[teamSlug]/[seasonSlug]/createComp.tsx | 2 +- tsconfig.json | 83 +++++++++----------- 4 files changed, 45 insertions(+), 54 deletions(-) diff --git a/lib/Gearbox.code-workspace b/lib/Gearbox.code-workspace index 283f6185..0268e976 100644 --- a/lib/Gearbox.code-workspace +++ b/lib/Gearbox.code-workspace @@ -2,8 +2,8 @@ "folders": [ { "name": "Gearbox", - "path": ".." - } + "path": "..", + }, ], - "settings": {} -} \ No newline at end of file + "settings": {}, +} diff --git a/lib/client/StatsMath.ts b/lib/client/StatsMath.ts index 53bdf6d2..21470c91 100644 --- a/lib/client/StatsMath.ts +++ b/lib/client/StatsMath.ts @@ -49,7 +49,9 @@ export function NumericalTotal( reports: Report[], ) { let sum = 0; - reports?.forEach((report) => (sum += Number(getSelection(selector, report) || 0))); + reports?.forEach( + (report) => (sum += Number(getSelection(selector, report) || 0)), + ); return Round(sum); } @@ -162,9 +164,7 @@ export function GetMinimum( for (let repo of quantitativeReports) { if (Number(repo.data[stat]) < minimum) { minimum = Number(repo.data[stat]); - } - } return minimum; } diff --git a/pages/[teamSlug]/[seasonSlug]/createComp.tsx b/pages/[teamSlug]/[seasonSlug]/createComp.tsx index 6bf87ea0..06fabf7b 100644 --- a/pages/[teamSlug]/[seasonSlug]/createComp.tsx +++ b/pages/[teamSlug]/[seasonSlug]/createComp.tsx @@ -196,7 +196,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { return { props: { ...resolved, - + season: serializeDatabaseObject(resolved.season), }, }; diff --git a/tsconfig.json b/tsconfig.json index c9757eed..8dff24bc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,48 +1,39 @@ { - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext", - "webworker" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "downlevelIteration": true, - "paths": { - "@/*": [ - "./*" - ] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - "pages/createTeam.tsx", - "pages/[teamSlug]/createSeason.ksx", - "pages/index.tsx", - "pages/profile.jsx", - "pages/[teamSlug]/index.jsx", - "pages/[teamSlug]/[seasonSlug]/index.jsx", - "pages/[teamSlug]/[seasonSlug]/[competitonSlug]/index.jsx", - "lib/client/getSession.js", - "index.ts", - "pages/_error.js", - "tests/lib/client/InputVerification.test.ts" - ], - "exclude": [ - "node_modules" - ] + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext", "webworker"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "downlevelIteration": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "pages/createTeam.tsx", + "pages/[teamSlug]/createSeason.ksx", + "pages/index.tsx", + "pages/profile.jsx", + "pages/[teamSlug]/index.jsx", + "pages/[teamSlug]/[seasonSlug]/index.jsx", + "pages/[teamSlug]/[seasonSlug]/[competitonSlug]/index.jsx", + "lib/client/getSession.js", + "index.ts", + "pages/_error.js", + "tests/lib/client/InputVerification.test.ts" + ], + "exclude": ["node_modules"] }