diff --git a/components/stats/SmallGraph.tsx b/components/stats/SmallGraph.tsx index 31e6dd35..ca66df4f 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"; @@ -86,15 +86,24 @@ 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; switch (data) { - case ReefscapeEnums.EndgameClimbStatus.None: + case RebuiltEnums.LevelClimbed.No: return 0; - case ReefscapeEnums.EndgameClimbStatus.Park: + case RebuiltEnums.LevelClimbed.First: return 0.33; - case ReefscapeEnums.EndgameClimbStatus.High: + case RebuiltEnums.LevelClimbed.Second: return 0.66; - case ReefscapeEnums.EndgameClimbStatus.Low: + case RebuiltEnums.LevelClimbed.Third: return 1; } } diff --git a/lib/Enums.ts b/lib/Enums.ts index 79c45916..4086cde2 100644 --- a/lib/Enums.ts +++ b/lib/Enums.ts @@ -110,6 +110,42 @@ export namespace ReefscapeEnums { } } +export namespace RebuiltEnums { + export enum ClimbingAbilities { + No = "No", + FirstLevel = "FirstLevel", + SecondLevel = "SecondLevel", + ThirdLevel = "ThirdLevel", + } + + export enum DriveOverBump { + No = "No", + Slow = "Slow", + Fast = "Fast", + } + + export enum DriveUnderTrench { + No = "No", + Slow = "Slow", + Fast = "Fast", + } + + export enum LevelClimbed { + No = "No", + First = "First", + Second = "Second", + Third = "Third", + } + + 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", + } +} + export namespace DecodeEnums { export enum EndgameParkStatus { No = "No", @@ -118,7 +154,7 @@ export namespace DecodeEnums { TwoBotPark = "Two Bot Park", } - export enum AutoCapabilities { + export enum AutoStatus { NoAuto = "No Auto", MovePastStart = "Move Past Start", ScoreOneArtifact = "Score One Artifact", diff --git a/lib/Gearbox.code-workspace b/lib/Gearbox.code-workspace new file mode 100644 index 00000000..0268e976 --- /dev/null +++ b/lib/Gearbox.code-workspace @@ -0,0 +1,9 @@ +{ + "folders": [ + { + "name": "Gearbox", + "path": "..", + }, + ], + "settings": {}, +} diff --git a/lib/Layout.ts b/lib/Layout.ts index 841b9625..e2c06760 100644 --- a/lib/Layout.ts +++ b/lib/Layout.ts @@ -10,6 +10,7 @@ import { IntoTheDeepEnums, FtcDrivetrain, ReefscapeEnums, + RebuiltEnums, DecodeEnums, } from "./Enums"; import { PitReportData, QuantData, Pitreport, Report, League } from "./Types"; @@ -218,7 +219,12 @@ export function keyToType( ReefscapeEnums.Climbing, ReefscapeEnums.DriveThroughDeepCage, ReefscapeEnums.EndgameClimbStatus, - DecodeEnums.AutoCapabilities, + RebuiltEnums.AutoAbilities, + RebuiltEnums.ClimbingAbilities, + RebuiltEnums.DriveOverBump, + RebuiltEnums.DriveUnderTrench, + RebuiltEnums.LevelClimbed, + DecodeEnums.AutoStatus, DecodeEnums.EndgameParkStatus, ]; @@ -234,8 +240,14 @@ export function keyToType( if (key == "DriveThroughDeepCage") return ReefscapeEnums.DriveThroughDeepCage; if (key == "EndgameClimbStatus") return ReefscapeEnums.EndgameClimbStatus; + 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 == "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/api/ClientApi.ts b/lib/api/ClientApi.ts index 25fc2f5c..2bf4827c 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 2dcbdb15..71c169e5 100644 --- a/lib/client/GameId.ts +++ b/lib/client/GameId.ts @@ -3,7 +3,8 @@ export enum GameId { CenterStage = "CenterStage", IntoTheDeep = "IntoTheDeep", Reefscape = "Reefscape", + Rebuilt = "Rebuilt", Decode = "Decode", } -export const defaultGameId = GameId.Reefscape; +export const defaultGameId = GameId.Rebuilt; diff --git a/lib/client/StatsMath.ts b/lib/client/StatsMath.ts index 61b49d71..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 += getSelection(selector, report))); + reports?.forEach( + (report) => (sum += Number(getSelection(selector, report) || 0)), + ); return Round(sum); } @@ -158,10 +160,10 @@ 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) { - minimum = repo.data[stat]; + if (Number(repo.data[stat]) < minimum) { + minimum = Number(repo.data[stat]); } } return minimum; @@ -175,8 +177,8 @@ export function GetMaximum( if (!quantitativeReports) return 0; let maximum = 0; for (let repo of quantitativeReports) { - if (repo.data[stat] > maximum) { - maximum = repo.data[stat]; + if (Number(repo.data[stat]) > maximum) { + maximum = Number(repo.data[stat]); } } return maximum; diff --git a/lib/games.ts b/lib/games.ts index 839e2a4b..b90efff9 100644 --- a/lib/games.ts +++ b/lib/games.ts @@ -6,6 +6,7 @@ import { FrcDrivetrain, IntakeTypes, IntoTheDeepEnums, + RebuiltEnums, ReefscapeEnums, } from "./Enums"; import { Badge, FormLayoutProps, PitStatsLayout, StatsLayout } from "./Layout"; @@ -37,6 +38,8 @@ import { } from "./client/StatsMath"; import { report } from "process"; import { GetMaximum } from "./client/StatsMath"; +import { getMaxListeners } from "events"; +//import { ClimbingCapabilities, ClimbingAbilities, DriverSkillLevel } from './Enums'; function getBaseBadges( pitReport: Pitreport | undefined, @@ -1893,7 +1896,261 @@ namespace Reefscape { ); } -namespace Decode { +export namespace Rebuilt { + export class QuantitativeData extends QuantData { + FuelPointsOne: number = 0; + FuelPointsFive: number = 0; + FuelPointsTen: number = 0; + + AutoClimbedLevelOne: boolean = false; + + EngameDefenseStatus: Defense = Defense.None; + LevelClimbed: RebuiltEnums.LevelClimbed = RebuiltEnums.LevelClimbed.No; + } + export class PitData extends PitReportData { + GroundIntake: boolean = false; + CanDriveOverBump: boolean = false; + CanDriveUnderTrench: boolean = false; + CanDeClimb: boolean = false; + CanScoreFuel: boolean = false; + HopperVolume: number = 0; + AutoAbilities: RebuiltEnums.AutoAbilities = + RebuiltEnums.AutoAbilities.NoAuto; + ClimbingAbilities: RebuiltEnums.ClimbingAbilities = + RebuiltEnums.ClimbingAbilities.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: "ClimbingAbilites", label: "Climbing?" }, + { key: "HopperVolume", label: "Hopper Volume?" }, + ], + Auto: [{ key: "AutoAbilities", label: "Auto Capabilities?" }], + }; + const quantitativeReportLayout: FormLayoutProps = { + Auto: [ + { key: "AutoClimbedLevelOne", label: "Climbed Level One (Auto)" }, + [ + [ + { + key: "FuelPointsOne", + label: "One point", + }, + ], + [ + { + key: "FuelPointsFive", + label: "Five points", + }, + ], + [ + { + key: "FuelPointsTen", + label: "Ten points", + }, + ], + ], + ], + 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: [], + Teleop: [ + { + label: "Total Fuel Points Scored By Alliance", + get(pitData, 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!, "FuelPointsOne") + + GetMinimum(quantitativeReports!, "FuelPointsFive") * 5 + + GetMinimum(quantitativeReports!, "FuelPointsTen") * 10 + ); + }, + }, + { + label: "< Max Fuel Points Scored By Alliance", + get(pitData, quantitativeReports) { + return ( + GetMaximum(quantitativeReports!, "FuelPointsOne") + + GetMaximum(quantitativeReports!, "FuelPointsFive") * 5 + + GetMaximum(quantitativeReports!, "FuelPointsTen") * 10 + ); + }, + }, + ], + }, + getGraphDots: function ( + quantitativeReports: Report[], + pitReport?: Pitreport | undefined, + ): Dot[] { + return []; + }, + }; + + const pitStatsLayout: PitStatsLayout = { + overallSlideStats: [], + individualSlideStats: [ + { + label: "Average Points", + get: ( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + ) => { + if (!quantitativeReports) return 0; + + const TotalAllianceFuelPoints = + NumericalTotal("FuelPointsOne", quantitativeReports) + + NumericalTotal("FuelPointsFive", quantitativeReports) * 5 + + NumericalTotal("FuelPointsTen", quantitativeReports) * 10; + return TotalAllianceFuelPoints / quantitativeReports.length; + }, + }, + { + label: "Ave Endgame Stats", + get: ( + pitReport: Pitreport | undefined, + quantitativeReports: Report[] | undefined, + ) => { + if (!quantitativeReports) return 0; + + const climb = NumericalTotal("LevelClimbed", quantitativeReports); + return Round(climb) / quantitativeReports.length; + }, + }, + ], + robotCapabilities: [ + { 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: "ClimbingAbilities", label: "Climbing?" }, + ], + graphStat: { + label: "Average Fuel Scored In Hopper", + key: "TeleopTotalPoints", + }, + }; + + 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't Score Fuel", color: "warning" }); + + if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.FirstLevel + ) + badges.push({ text: "Can Climb First Level", color: "accent" }); + else if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.SecondLevel + ) + badges.push({ text: "Can Climb Second Level", color: "accent" }); + else if ( + pitReport?.data?.ClimbingAbilities === + RebuiltEnums.ClimbingAbilities.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.LevelClimbed) { + case RebuiltEnums.LevelClimbed.No: + break; + case RebuiltEnums.LevelClimbed.First: + totalPoints += 10; + break; + case RebuiltEnums.LevelClimbed.Second: + totalPoints += 20; + break; + case RebuiltEnums.LevelClimbed.Third: + totalPoints += 30; + break; + } + totalPoints += + Number(report.FuelPointsOne) + + Number(report.FuelPointsFive) * 5 + + Number(report.FuelPointsTen) * 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", + getBadges, + getAvgPoints, + ); +} + +export namespace Decode { export class QuantitativeData extends QuantData { AutoMovedPastStartingLine: boolean = false; @@ -1919,8 +2176,7 @@ namespace Decode { ArtifactsScoredAuto: number = 0; AutoAccountsForMotif: boolean = false; - AutoAbilities: DecodeEnums.AutoCapabilities = - DecodeEnums.AutoCapabilities.NoAuto; + AutoAbilities: DecodeEnums.AutoStatus = DecodeEnums.AutoStatus.NoAuto; } const pitReportLayout: FormLayoutProps = { @@ -2267,6 +2523,7 @@ namespace Decode { } 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, diff --git a/package-lock.json b/package-lock.json index 9d3d3dc2..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", @@ -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", @@ -69,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" } @@ -108,13 +108,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "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/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -371,27 +371,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "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/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "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": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -635,15 +635,15 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "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.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -680,9 +680,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "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": { @@ -720,9 +720,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "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": { @@ -2329,9 +2329,9 @@ } }, "node_modules/@next/env": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", - "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", + "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": { @@ -2372,9 +2372,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", - "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", + "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" ], @@ -2388,9 +2388,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", - "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", + "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" ], @@ -2404,9 +2404,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", - "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", + "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" ], @@ -2420,9 +2420,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", - "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", + "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" ], @@ -2436,9 +2436,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", - "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", + "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" ], @@ -2452,9 +2452,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", - "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", + "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" ], @@ -2468,9 +2468,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", - "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", + "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" ], @@ -2484,9 +2484,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", - "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", + "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" ], @@ -2570,14 +2570,14 @@ } }, "node_modules/@playwright/test": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", - "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", + "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", "peer": true, "dependencies": { - "playwright": "1.57.0" + "playwright": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -2722,16 +2722,17 @@ } }, "node_modules/@serwist/build": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@serwist/build/-/build-9.2.3.tgz", - "integrity": "sha512-UU38GDsTerzoCRDIT5v62W/CcTMLfGZm/tAa+u8XLBU0y0f2aJ2GCfsHnI1eXhEuWvt4Y7Imx/uG2ww2KWIBWQ==", + "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.5.0", "pretty-bytes": "6.1.1", "source-map": "0.8.0-beta.0", - "zod": "4.1.12" + "zod": "4.3.6" }, "engines": { "node": ">=18.0.0" @@ -2758,6 +2759,7 @@ "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", @@ -2829,27 +2831,35 @@ } }, "node_modules/@serwist/next": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@serwist/next/-/next-9.2.3.tgz", - "integrity": "sha512-sbStIaen8H6ZhNCtfxAuZ2haujJe8nPFRBiq5KQFYYi5iyFrDGLpYICmRTBP6Oc1pQBmsAqbBZzIjjC60d+7zg==", + "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.2.3", - "@serwist/webpack-plugin": "9.2.3", - "@serwist/window": "9.2.3", - "chalk": "5.6.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", - "serwist": "9.2.3", - "zod": "4.1.12" + "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 } @@ -2864,22 +2874,11 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@serwist/next/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "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.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", @@ -2911,15 +2910,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.2.3", - "resolved": "https://registry.npmjs.org/@serwist/webpack-plugin/-/webpack-plugin-9.2.3.tgz", - "integrity": "sha512-y1Ag1a7LARo/LtPVRSrfGO5PG4BZdc1NiMGAq+CGlBH/PJa7RQimo4iq9C94pjxusEsP4yHnsDQ06+GVTQ6gww==", + "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.2.3", + "@serwist/build": "9.5.4", + "@serwist/utils": "9.5.4", "pretty-bytes": "6.1.1", - "zod": "4.1.12" + "zod": "4.3.6" }, "engines": { "node": ">=18.0.0" @@ -2938,13 +2952,13 @@ } }, "node_modules/@serwist/window": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@serwist/window/-/window-9.2.3.tgz", - "integrity": "sha512-6bK01QAaFI+oXTmDSQHvsw0kTTNlj79PFkox+0Z9XYNqTVLoXY9C6BFmZNvxNxEinOqCSm7cms4I5V54E9/1XA==", + "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.2.3" + "serwist": "9.5.4" }, "peerDependencies": { "typescript": ">=5.0.0" @@ -4047,6 +4061,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", @@ -4121,10 +4144,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", @@ -4142,10 +4164,11 @@ "license": "MIT", "peer": true, "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" @@ -4234,9 +4257,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", @@ -4839,9 +4862,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" } @@ -4977,10 +5001,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": { @@ -5258,7 +5281,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" } @@ -8338,6 +8360,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", @@ -8429,9 +8457,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", @@ -8732,13 +8761,13 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", - "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz", + "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==", "license": "MIT", "peer": true, "dependencies": { - "@next/env": "15.5.7", + "@next/env": "15.5.12", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -8751,14 +8780,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.7", - "@next/swc-darwin-x64": "15.5.7", - "@next/swc-linux-arm64-gnu": "15.5.7", - "@next/swc-linux-arm64-musl": "15.5.7", - "@next/swc-linux-x64-gnu": "15.5.7", - "@next/swc-linux-x64-musl": "15.5.7", - "@next/swc-win32-arm64-msvc": "15.5.7", - "@next/swc-win32-x64-msvc": "15.5.7", + "@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": { @@ -8880,10 +8909,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": { @@ -8895,11 +8923,10 @@ } }, "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": { "node": ">=6.0.0" } @@ -9398,13 +9425,13 @@ } }, "node_modules/playwright": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", + "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.57.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -9417,9 +9444,9 @@ } }, "node_modules/playwright-core": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "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": { @@ -9433,7 +9460,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, @@ -10409,11 +10435,12 @@ } }, "node_modules/serwist": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/serwist/-/serwist-9.2.3.tgz", - "integrity": "sha512-menorUH09SpLvU7R25TvG0TuQ12MUDpQ5NKGohbtREF8YI+0D++Abn59XCmvvMp2n740rBizIkeqWq0m6U+++g==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/serwist/-/serwist-9.5.4.tgz", + "integrity": "sha512-uTHBzpIeA6rE3oyRt392MbtNQDs2JVZelKD1KkT18UkhX6HRwCeassoI1Nd1h52DqYqa7ZfBeldJ4awy+PYrnQ==", "license": "MIT", "dependencies": { + "@serwist/utils": "9.5.4", "idb": "8.0.3" }, "peerDependencies": { @@ -10984,6 +11011,7 @@ "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": { @@ -11522,10 +11550,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", @@ -11989,9 +12016,9 @@ } }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "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 41c2f309..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", @@ -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", @@ -80,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" } diff --git a/pages/[teamSlug]/[seasonSlug]/createComp.tsx b/pages/[teamSlug]/[seasonSlug]/createComp.tsx index b8d52415..06fabf7b 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), }, }; diff --git a/public/fields/RebuiltBlue.png b/public/fields/RebuiltBlue.png new file mode 100644 index 00000000..68cf5423 Binary files /dev/null and b/public/fields/RebuiltBlue.png differ diff --git a/public/fields/RebuiltRed.png b/public/fields/RebuiltRed.png new file mode 100644 index 00000000..d6681949 Binary files /dev/null and b/public/fields/RebuiltRed.png differ