From 56bfa86b778864ff3314891c75ccbd7d6dbbba0f Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 12 May 2026 12:45:34 -0600 Subject: [PATCH 01/15] Add target calculation commands - Add `/target` and `/calculate` subcommands for game stat goals - Support stat and ratio targets with autocomplete and setback estimates - Add localized command and argument strings --- .../src/commands/target/target.command.ts | 522 ++++++++++++++++++ locales/en-US/default.json | 32 ++ 2 files changed, 554 insertions(+) create mode 100644 apps/discord-bot/src/commands/target/target.command.ts diff --git a/apps/discord-bot/src/commands/target/target.command.ts b/apps/discord-bot/src/commands/target/target.command.ts new file mode 100644 index 000000000..638ef2436 --- /dev/null +++ b/apps/discord-bot/src/commands/target/target.command.ts @@ -0,0 +1,522 @@ +/** + * Copyright (c) Statsify + * + * This source code is licensed under the GNU GPL v3 license found in the + * LICENSE file in the root directory of this source tree. + * https://github.com/Statsify/statsify/blob/main/LICENSE + */ + +import { + type APIApplicationCommandOptionChoice, + ApplicationCommandOptionType, +} from "discord-api-types/v10"; +import { + AbstractArgument, + ApiService, + Command, + CommandContext, + EmbedBuilder, + ErrorMessage, + type LocalizationString, + PlayerArgument, + SubCommand, +} from "@statsify/discord"; +import { + type Constructor, + prettify, + removeFormatting, +} from "@statsify/util"; +import { Container } from "typedi"; +import { + LEADERBOARD_RATIOS, + MetadataScanner, + type Player, + PlayerStats, + type Ratio, +} from "@statsify/schemas"; +import { STATUS_COLORS } from "@statsify/logger"; + +type GameKey = keyof PlayerStats; + +interface TargetStat { + denominator?: string; + denominatorName?: string; + key: string; + name: string; + numerator?: string; + numeratorName?: string; + ratio?: Ratio; + type: "ratio" | "stat"; +} + +const apiService = Container.get(ApiService); +const DEFAULT_SETBACK = 15; + +const GAMES: [GameKey, name: string, group?: string][] = [ + ["arcade", "Arcade"], + ["arenabrawl", "Arena Brawl", "classic"], + ["bedwars", "BedWars"], + ["blitzsg", "BlitzSG"], + ["buildbattle", "Build Battle"], + ["challenges", "Challenges"], + ["copsandcrims", "Cops and Crims"], + ["duels", "Duels"], + ["general", "General"], + ["megawalls", "MegaWalls"], + ["murdermystery", "Murder Mystery"], + ["paintball", "Paintball", "classic"], + ["parkour", "Parkour"], + ["pit", "Pit"], + ["quake", "Quake", "classic"], + ["quests", "Quests"], + ["skywars", "SkyWars"], + ["smashheroes", "Smash Heroes"], + ["speeduhc", "Speed UHC"], + ["tntgames", "TNT Games"], + ["turbokartracers", "Turbo Kart Racers", "classic"], + ["uhc", "UHC"], + ["vampirez", "VampireZ", "classic"], + ["walls", "Walls", "classic"], + ["warlords", "Warlords"], + ["woolgames", "WoolGames"], +]; + +const GAME_NAMES = new Map(GAMES.map(([key, name]) => [key, name])); + +const getGameClass = (game: GameKey) => + Reflect.getMetadata("design:type", PlayerStats.prototype, game) as Constructor; + +const statCache = new Map(); + +const targetArgs = (game: GameKey) => [ + new TargetStatArgument(game), + new TargetArgument(), + new PlayerArgument(), + new SetbackArgument(), +]; + +class TargetStatArgument extends AbstractArgument { + public autocomplete = true; + public description: LocalizationString; + public name = "stat"; + public required = true; + public type = ApplicationCommandOptionType.String; + private readonly game: GameKey; + + public constructor(game: GameKey) { + super(); + this.description = (t) => t("arguments.target-stat"); + this.game = game; + } + + public autocompleteHandler( + context: CommandContext + ): APIApplicationCommandOptionChoice[] { + const currentValue = context.option(this.name, "").toLowerCase(); + const stats = getTargetStats(this.game); + + const filtered = currentValue ? + stats.filter((stat) => + [stat.key, stat.name] + .some((value) => value.toLowerCase().includes(currentValue)) + ) : + stats; + + return filtered + .slice(0, 25) + .map((stat) => ({ name: stat.name.slice(0, 100), value: stat.key })); + } +} + +class TargetArgument extends AbstractArgument { + public description: LocalizationString; + public min_value = 0; + public name = "target"; + public required = true; + public type = ApplicationCommandOptionType.Number; + + public constructor() { + super(); + this.description = (t) => t("arguments.target"); + } +} + +class SetbackArgument extends AbstractArgument { + public description: LocalizationString; + public min_value = 0; + public name = "setback"; + public required = false; + public type = ApplicationCommandOptionType.Integer; + + public constructor() { + super(); + this.description = (t) => t("arguments.target-setback"); + } +} + +@Command({ description: (t) => t("commands.target") }) +export class TargetCommand { + @SubCommand({ description: (t) => t("commands.target-arcade"), args: targetArgs("arcade") }) + public arcade(context: CommandContext) { + return runTarget(context, "arcade"); + } + + @SubCommand({ description: (t) => t("commands.target-arenabrawl"), args: targetArgs("arenabrawl"), group: "classic" }) + public arenabrawl(context: CommandContext) { + return runTarget(context, "arenabrawl"); + } + + @SubCommand({ description: (t) => t("commands.target-bedwars"), args: targetArgs("bedwars") }) + public bedwars(context: CommandContext) { + return runTarget(context, "bedwars"); + } + + @SubCommand({ description: (t) => t("commands.target-blitzsg"), args: targetArgs("blitzsg") }) + public blitzsg(context: CommandContext) { + return runTarget(context, "blitzsg"); + } + + @SubCommand({ description: (t) => t("commands.target-buildbattle"), args: targetArgs("buildbattle") }) + public buildbattle(context: CommandContext) { + return runTarget(context, "buildbattle"); + } + + @SubCommand({ description: (t) => t("commands.target-challenges"), args: targetArgs("challenges") }) + public challenges(context: CommandContext) { + return runTarget(context, "challenges"); + } + + @SubCommand({ description: (t) => t("commands.target-copsandcrims"), args: targetArgs("copsandcrims") }) + public copsandcrims(context: CommandContext) { + return runTarget(context, "copsandcrims"); + } + + @SubCommand({ description: (t) => t("commands.target-duels"), args: targetArgs("duels") }) + public duels(context: CommandContext) { + return runTarget(context, "duels"); + } + + @SubCommand({ description: (t) => t("commands.target-general"), args: targetArgs("general") }) + public general(context: CommandContext) { + return runTarget(context, "general"); + } + + @SubCommand({ description: (t) => t("commands.target-megawalls"), args: targetArgs("megawalls") }) + public megawalls(context: CommandContext) { + return runTarget(context, "megawalls"); + } + + @SubCommand({ description: (t) => t("commands.target-murdermystery"), args: targetArgs("murdermystery") }) + public murdermystery(context: CommandContext) { + return runTarget(context, "murdermystery"); + } + + @SubCommand({ description: (t) => t("commands.target-paintball"), args: targetArgs("paintball"), group: "classic" }) + public paintball(context: CommandContext) { + return runTarget(context, "paintball"); + } + + @SubCommand({ description: (t) => t("commands.target-parkour"), args: targetArgs("parkour") }) + public parkour(context: CommandContext) { + return runTarget(context, "parkour"); + } + + @SubCommand({ description: (t) => t("commands.target-pit"), args: targetArgs("pit") }) + public pit(context: CommandContext) { + return runTarget(context, "pit"); + } + + @SubCommand({ description: (t) => t("commands.target-quake"), args: targetArgs("quake"), group: "classic" }) + public quake(context: CommandContext) { + return runTarget(context, "quake"); + } + + @SubCommand({ description: (t) => t("commands.target-quests"), args: targetArgs("quests") }) + public quests(context: CommandContext) { + return runTarget(context, "quests"); + } + + @SubCommand({ description: (t) => t("commands.target-skywars"), args: targetArgs("skywars") }) + public skywars(context: CommandContext) { + return runTarget(context, "skywars"); + } + + @SubCommand({ description: (t) => t("commands.target-smashheroes"), args: targetArgs("smashheroes") }) + public smashheroes(context: CommandContext) { + return runTarget(context, "smashheroes"); + } + + @SubCommand({ description: (t) => t("commands.target-speeduhc"), args: targetArgs("speeduhc") }) + public speeduhc(context: CommandContext) { + return runTarget(context, "speeduhc"); + } + + @SubCommand({ description: (t) => t("commands.target-tntgames"), args: targetArgs("tntgames") }) + public tntgames(context: CommandContext) { + return runTarget(context, "tntgames"); + } + + @SubCommand({ description: (t) => t("commands.target-turbokartracers"), args: targetArgs("turbokartracers"), group: "classic" }) + public turbokartracers(context: CommandContext) { + return runTarget(context, "turbokartracers"); + } + + @SubCommand({ description: (t) => t("commands.target-uhc"), args: targetArgs("uhc") }) + public uhc(context: CommandContext) { + return runTarget(context, "uhc"); + } + + @SubCommand({ description: (t) => t("commands.target-vampirez"), args: targetArgs("vampirez"), group: "classic" }) + public vampirez(context: CommandContext) { + return runTarget(context, "vampirez"); + } + + @SubCommand({ description: (t) => t("commands.target-walls"), args: targetArgs("walls"), group: "classic" }) + public walls(context: CommandContext) { + return runTarget(context, "walls"); + } + + @SubCommand({ description: (t) => t("commands.target-warlords"), args: targetArgs("warlords") }) + public warlords(context: CommandContext) { + return runTarget(context, "warlords"); + } + + @SubCommand({ description: (t) => t("commands.target-woolgames"), args: targetArgs("woolgames") }) + public woolgames(context: CommandContext) { + return runTarget(context, "woolgames"); + } +} + +@Command({ name: "calculate", description: (t) => t("commands.calculate") }) +export class CalculateCommand extends TargetCommand {} + +async function runTarget(context: CommandContext, game: GameKey) { + const user = context.getUser(); + const player = await apiService.getPlayer(context.option("player"), user); + const target = context.option("target"); + const setback = context.option("setback", DEFAULT_SETBACK); + const stat = resolveTargetStat(game, context.option("stat")); + const gameStats = player.stats[game] as unknown as Record; + const level = getLevel(gameStats); + + if (stat.type === "ratio") { + return buildRatioResponse(player, game, gameStats, stat, target, setback, level); + } + + return buildStatResponse(player, game, gameStats, stat, target, level); +} + +function buildRatioResponse( + player: Player, + game: GameKey, + gameStats: Record, + stat: TargetStat, + target: number, + setback: number, + level?: string +) { + const numerator = getNumber(gameStats, stat.numerator!); + const denominator = getNumber(gameStats, stat.denominator!); + const current = denominator === 0 ? numerator : numerator / denominator; + const needed = Math.max(0, Math.ceil(target * denominator - numerator)); + const neededWithSetback = Math.max( + 0, + Math.ceil(target * (denominator + setback) - numerator) + ); + const numeratorName = stat.numeratorName!; + const denominatorName = singularize(stat.denominatorName!); + + const lines = [ + `Current: **${formatDecimal(current)} ${stat.name}**`, + `Needed: **${formatInteger(needed)} ${numeratorName}** without another ${denominatorName}`, + ]; + + if (setback > 0) { + lines.push( + `Or: **${formatInteger(neededWithSetback)} ${numeratorName}** if you take **${formatInteger(setback)} ${stat.denominatorName}**` + ); + } + + return { + embeds: [ + baseEmbed(player, game, level) + .title(`To reach ${formatDecimal(target)} ${stat.name}:`) + .description(lines.join("\n")), + ], + }; +} + +function buildStatResponse( + player: Player, + game: GameKey, + gameStats: Record, + stat: TargetStat, + target: number, + level?: string +) { + const current = getNumber(gameStats, stat.key); + const needed = Math.max(0, Math.ceil(target - current)); + const statName = statNameLower(stat.name); + + return { + embeds: [ + baseEmbed(player, game, level) + .title(`To reach ${formatTarget(target)} ${stat.name}:`) + .description( + [ + `Current: **${formatTarget(current)} ${stat.name}**`, + `Needed: **${formatInteger(needed)} ${statName}**${needed === 0 ? " (target reached)" : ""}`, + ].join("\n") + ), + ], + }; +} + +function baseEmbed(player: Player, game: GameKey, level?: string) { + const titleParts = [player.displayName]; + if (level) titleParts.push(level); + + return new EmbedBuilder() + .author(titleParts.join(" ")) + .footer(GAME_NAMES.get(game)!) + .color(STATUS_COLORS.info); +} + +function getTargetStats(game: GameKey) { + if (statCache.has(game)) return statCache.get(game)!; + + const metadata = MetadataScanner.scan(getGameClass(game)); + const numberFields = metadata + .filter(([, { type }]) => type.type === Number) + .map(([key, { leaderboard }]) => ({ + key, + name: cleanName(leaderboard.fieldName || leaderboard.name || prettify(key)), + })); + + const byKey = new Map(numberFields.map((field) => [field.key, field])); + const ratioKeys = new Set(LEADERBOARD_RATIOS.map((ratio) => ratio[2])); + const ratios: TargetStat[] = []; + + for (const [numerator, denominator, ratioKey, prettyName] of LEADERBOARD_RATIOS) { + for (const field of numberFields) { + if (lastPathPart(field.key) !== ratioKey) continue; + + const parent = parentPath(field.key); + const numeratorKey = pathWithParent(parent, numerator); + const denominatorKey = pathWithParent(parent, denominator); + const numeratorField = byKey.get(numeratorKey); + const denominatorField = byKey.get(denominatorKey); + + if (!numeratorField || !denominatorField) continue; + + ratios.push({ + denominator: denominatorKey, + denominatorName: statNameLower(denominatorField.name), + key: field.key, + name: parent === "overall" || !parent ? prettyName : `${cleanName(parent)} ${prettyName}`, + numerator: numeratorKey, + numeratorName: statNameLower(numeratorField.name), + ratio: [numerator, denominator, ratioKey, prettyName], + type: "ratio", + }); + } + } + + const stats: TargetStat[] = [ + ...ratios, + ...numberFields + .filter((field) => !ratioKeys.has(lastPathPart(field.key))) + .map((field) => ({ ...field, type: "stat" as const })), + ]; + + statCache.set(game, stats); + return stats; +} + +function resolveTargetStat(game: GameKey, input: string) { + const stats = getTargetStats(game); + const normalized = input.toLowerCase(); + const exact = stats.find((stat) => stat.key === input); + if (exact) return exact; + + const overall = stats.find( + (stat) => + stat.key.toLowerCase() === `overall.${normalized}` || + stat.name.toLowerCase() === normalized + ); + if (overall) return overall; + + const fallback = stats.find( + (stat) => + lastPathPart(stat.key).toLowerCase() === normalized || + stat.name.toLowerCase().includes(normalized) + ); + + if (!fallback) { + throw new ErrorMessage( + "Target stat not found", + `I couldn't find \`${input}\` for ${GAME_NAMES.get(game)}. Use the stat autocomplete to pick a supported target.` + ); + } + + return fallback; +} + +function getLevel(gameStats: Record) { + const formatted = gameStats.levelFormatted || gameStats.naturalLevelFormatted; + if (typeof formatted === "string") return removeFormatting(formatted); + + const level = gameStats.level; + if (typeof level === "number") return `Level ${formatDecimal(level)}`; + + return undefined; +} + +function getNumber(data: Record, path: string) { + const value = path + .split(".") + .reduce((acc, key) => (acc as Record | undefined)?.[key], data); + + return typeof value === "number" && Number.isFinite(value) ? value : 0; +} + +function cleanName(value: string) { + return removeFormatting(value) + .replace(/\s+/g, " ") + .trim(); +} + +function statNameLower(value: string) { + return cleanName(value).toLowerCase(); +} + +function singularize(value: string) { + return value.endsWith("s") ? value.slice(0, -1) : value; +} + +function formatDecimal(value: number) { + return value.toLocaleString("en-US", { + maximumFractionDigits: 2, + minimumFractionDigits: 2, + }); +} + +function formatInteger(value: number) { + return value.toLocaleString("en-US", { maximumFractionDigits: 0 }); +} + +function formatTarget(value: number) { + return Number.isInteger(value) ? formatInteger(value) : formatDecimal(value); +} + +function lastPathPart(path: string) { + return path.split(".").at(-1)!; +} + +function parentPath(path: string) { + return path.split(".").slice(0, -1).join("."); +} + +function pathWithParent(parent: string, key: string) { + return parent ? `${parent}.${key}` : key; +} diff --git a/locales/en-US/default.json b/locales/en-US/default.json index b66f3e884..5e94dcc89 100644 --- a/locales/en-US/default.json +++ b/locales/en-US/default.json @@ -14,6 +14,9 @@ "server": "A Minecraft server name or a server IP", "tags-content": "The content of the tag", "tags-name": "The name of the tag", + "target": "The goal you want to reach", + "target-setback": "How many denominator stats to include in the alternate calculation", + "target-stat": "The stat or ratio you want to target", "text": "A message", "user": "Choose a Discord user" }, @@ -31,6 +34,7 @@ "buildbattle": "$t(commands.hypixel-command, { \"name\": \"Build Battle\" })", "cape": "View someone's Minecraft and Optifine capes", "challenges": "$t(commands.hypixel-command, { \"name\": \"Challenge\" })", + "calculate": "$t(commands.target)", "quests-command": "View your {{name}} questing stats", "quests": "$t(commands.hypixel-command, { \"name\": \"Questing\" })", "quests-overall": "$t(commands.quests-command, { \"name\": \"Overall\" })", @@ -212,6 +216,34 @@ "tags-delete": "Delete a support tag", "tags-rename": "Rename a support tag", "text": "Generate Minecraft text", + "target": "Calculate what you need to reach a stat target", + "target-arcade": "$t(commands.target-command, { \"name\": \"Arcade\" })", + "target-arenabrawl": "$t(commands.target-command, { \"name\": \"Arena Brawl\" })", + "target-bedwars": "$t(commands.target-command, { \"name\": \"BedWars\" })", + "target-blitzsg": "$t(commands.target-command, { \"name\": \"BlitzSG\" })", + "target-buildbattle": "$t(commands.target-command, { \"name\": \"Build Battle\" })", + "target-command": "Calculate a {{name}} stat target", + "target-challenges": "$t(commands.target-command, { \"name\": \"Challenges\" })", + "target-copsandcrims": "$t(commands.target-command, { \"name\": \"Cops and Crims\" })", + "target-duels": "$t(commands.target-command, { \"name\": \"Duels\" })", + "target-general": "$t(commands.target-command, { \"name\": \"General\" })", + "target-megawalls": "$t(commands.target-command, { \"name\": \"MegaWalls\" })", + "target-murdermystery": "$t(commands.target-command, { \"name\": \"Murder Mystery\" })", + "target-paintball": "$t(commands.target-command, { \"name\": \"Paintball\" })", + "target-parkour": "$t(commands.target-command, { \"name\": \"Parkour\" })", + "target-pit": "$t(commands.target-command, { \"name\": \"Pit\" })", + "target-quake": "$t(commands.target-command, { \"name\": \"Quake\" })", + "target-quests": "$t(commands.target-command, { \"name\": \"Quests\" })", + "target-skywars": "$t(commands.target-command, { \"name\": \"SkyWars\" })", + "target-smashheroes": "$t(commands.target-command, { \"name\": \"Smash Heroes\" })", + "target-speeduhc": "$t(commands.target-command, { \"name\": \"Speed UHC\" })", + "target-tntgames": "$t(commands.target-command, { \"name\": \"TNT Games\" })", + "target-turbokartracers": "$t(commands.target-command, { \"name\": \"Turbo Kart Racers\" })", + "target-uhc": "$t(commands.target-command, { \"name\": \"UHC\" })", + "target-vampirez": "$t(commands.target-command, { \"name\": \"VampireZ\" })", + "target-walls": "$t(commands.target-command, { \"name\": \"Walls\" })", + "target-warlords": "$t(commands.target-command, { \"name\": \"Warlords\" })", + "target-woolgames": "$t(commands.target-command, { \"name\": \"WoolGames\" })", "theme": "Change your theme for every profile", "theme-boxes": "Change the appearance of the profile boxes", "theme-font": "Change the font of the profiles", From 9b509d9cb534e209e0cdf853504aa7981a3cc5f3 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 12 May 2026 13:00:50 -0600 Subject: [PATCH 02/15] Revert "Add target calculation commands" (#849) This reverts commit 56bfa86b778864ff3314891c75ccbd7d6dbbba0f. --- .../src/commands/target/target.command.ts | 522 ------------------ locales/en-US/default.json | 32 -- 2 files changed, 554 deletions(-) delete mode 100644 apps/discord-bot/src/commands/target/target.command.ts diff --git a/apps/discord-bot/src/commands/target/target.command.ts b/apps/discord-bot/src/commands/target/target.command.ts deleted file mode 100644 index 638ef2436..000000000 --- a/apps/discord-bot/src/commands/target/target.command.ts +++ /dev/null @@ -1,522 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { - type APIApplicationCommandOptionChoice, - ApplicationCommandOptionType, -} from "discord-api-types/v10"; -import { - AbstractArgument, - ApiService, - Command, - CommandContext, - EmbedBuilder, - ErrorMessage, - type LocalizationString, - PlayerArgument, - SubCommand, -} from "@statsify/discord"; -import { - type Constructor, - prettify, - removeFormatting, -} from "@statsify/util"; -import { Container } from "typedi"; -import { - LEADERBOARD_RATIOS, - MetadataScanner, - type Player, - PlayerStats, - type Ratio, -} from "@statsify/schemas"; -import { STATUS_COLORS } from "@statsify/logger"; - -type GameKey = keyof PlayerStats; - -interface TargetStat { - denominator?: string; - denominatorName?: string; - key: string; - name: string; - numerator?: string; - numeratorName?: string; - ratio?: Ratio; - type: "ratio" | "stat"; -} - -const apiService = Container.get(ApiService); -const DEFAULT_SETBACK = 15; - -const GAMES: [GameKey, name: string, group?: string][] = [ - ["arcade", "Arcade"], - ["arenabrawl", "Arena Brawl", "classic"], - ["bedwars", "BedWars"], - ["blitzsg", "BlitzSG"], - ["buildbattle", "Build Battle"], - ["challenges", "Challenges"], - ["copsandcrims", "Cops and Crims"], - ["duels", "Duels"], - ["general", "General"], - ["megawalls", "MegaWalls"], - ["murdermystery", "Murder Mystery"], - ["paintball", "Paintball", "classic"], - ["parkour", "Parkour"], - ["pit", "Pit"], - ["quake", "Quake", "classic"], - ["quests", "Quests"], - ["skywars", "SkyWars"], - ["smashheroes", "Smash Heroes"], - ["speeduhc", "Speed UHC"], - ["tntgames", "TNT Games"], - ["turbokartracers", "Turbo Kart Racers", "classic"], - ["uhc", "UHC"], - ["vampirez", "VampireZ", "classic"], - ["walls", "Walls", "classic"], - ["warlords", "Warlords"], - ["woolgames", "WoolGames"], -]; - -const GAME_NAMES = new Map(GAMES.map(([key, name]) => [key, name])); - -const getGameClass = (game: GameKey) => - Reflect.getMetadata("design:type", PlayerStats.prototype, game) as Constructor; - -const statCache = new Map(); - -const targetArgs = (game: GameKey) => [ - new TargetStatArgument(game), - new TargetArgument(), - new PlayerArgument(), - new SetbackArgument(), -]; - -class TargetStatArgument extends AbstractArgument { - public autocomplete = true; - public description: LocalizationString; - public name = "stat"; - public required = true; - public type = ApplicationCommandOptionType.String; - private readonly game: GameKey; - - public constructor(game: GameKey) { - super(); - this.description = (t) => t("arguments.target-stat"); - this.game = game; - } - - public autocompleteHandler( - context: CommandContext - ): APIApplicationCommandOptionChoice[] { - const currentValue = context.option(this.name, "").toLowerCase(); - const stats = getTargetStats(this.game); - - const filtered = currentValue ? - stats.filter((stat) => - [stat.key, stat.name] - .some((value) => value.toLowerCase().includes(currentValue)) - ) : - stats; - - return filtered - .slice(0, 25) - .map((stat) => ({ name: stat.name.slice(0, 100), value: stat.key })); - } -} - -class TargetArgument extends AbstractArgument { - public description: LocalizationString; - public min_value = 0; - public name = "target"; - public required = true; - public type = ApplicationCommandOptionType.Number; - - public constructor() { - super(); - this.description = (t) => t("arguments.target"); - } -} - -class SetbackArgument extends AbstractArgument { - public description: LocalizationString; - public min_value = 0; - public name = "setback"; - public required = false; - public type = ApplicationCommandOptionType.Integer; - - public constructor() { - super(); - this.description = (t) => t("arguments.target-setback"); - } -} - -@Command({ description: (t) => t("commands.target") }) -export class TargetCommand { - @SubCommand({ description: (t) => t("commands.target-arcade"), args: targetArgs("arcade") }) - public arcade(context: CommandContext) { - return runTarget(context, "arcade"); - } - - @SubCommand({ description: (t) => t("commands.target-arenabrawl"), args: targetArgs("arenabrawl"), group: "classic" }) - public arenabrawl(context: CommandContext) { - return runTarget(context, "arenabrawl"); - } - - @SubCommand({ description: (t) => t("commands.target-bedwars"), args: targetArgs("bedwars") }) - public bedwars(context: CommandContext) { - return runTarget(context, "bedwars"); - } - - @SubCommand({ description: (t) => t("commands.target-blitzsg"), args: targetArgs("blitzsg") }) - public blitzsg(context: CommandContext) { - return runTarget(context, "blitzsg"); - } - - @SubCommand({ description: (t) => t("commands.target-buildbattle"), args: targetArgs("buildbattle") }) - public buildbattle(context: CommandContext) { - return runTarget(context, "buildbattle"); - } - - @SubCommand({ description: (t) => t("commands.target-challenges"), args: targetArgs("challenges") }) - public challenges(context: CommandContext) { - return runTarget(context, "challenges"); - } - - @SubCommand({ description: (t) => t("commands.target-copsandcrims"), args: targetArgs("copsandcrims") }) - public copsandcrims(context: CommandContext) { - return runTarget(context, "copsandcrims"); - } - - @SubCommand({ description: (t) => t("commands.target-duels"), args: targetArgs("duels") }) - public duels(context: CommandContext) { - return runTarget(context, "duels"); - } - - @SubCommand({ description: (t) => t("commands.target-general"), args: targetArgs("general") }) - public general(context: CommandContext) { - return runTarget(context, "general"); - } - - @SubCommand({ description: (t) => t("commands.target-megawalls"), args: targetArgs("megawalls") }) - public megawalls(context: CommandContext) { - return runTarget(context, "megawalls"); - } - - @SubCommand({ description: (t) => t("commands.target-murdermystery"), args: targetArgs("murdermystery") }) - public murdermystery(context: CommandContext) { - return runTarget(context, "murdermystery"); - } - - @SubCommand({ description: (t) => t("commands.target-paintball"), args: targetArgs("paintball"), group: "classic" }) - public paintball(context: CommandContext) { - return runTarget(context, "paintball"); - } - - @SubCommand({ description: (t) => t("commands.target-parkour"), args: targetArgs("parkour") }) - public parkour(context: CommandContext) { - return runTarget(context, "parkour"); - } - - @SubCommand({ description: (t) => t("commands.target-pit"), args: targetArgs("pit") }) - public pit(context: CommandContext) { - return runTarget(context, "pit"); - } - - @SubCommand({ description: (t) => t("commands.target-quake"), args: targetArgs("quake"), group: "classic" }) - public quake(context: CommandContext) { - return runTarget(context, "quake"); - } - - @SubCommand({ description: (t) => t("commands.target-quests"), args: targetArgs("quests") }) - public quests(context: CommandContext) { - return runTarget(context, "quests"); - } - - @SubCommand({ description: (t) => t("commands.target-skywars"), args: targetArgs("skywars") }) - public skywars(context: CommandContext) { - return runTarget(context, "skywars"); - } - - @SubCommand({ description: (t) => t("commands.target-smashheroes"), args: targetArgs("smashheroes") }) - public smashheroes(context: CommandContext) { - return runTarget(context, "smashheroes"); - } - - @SubCommand({ description: (t) => t("commands.target-speeduhc"), args: targetArgs("speeduhc") }) - public speeduhc(context: CommandContext) { - return runTarget(context, "speeduhc"); - } - - @SubCommand({ description: (t) => t("commands.target-tntgames"), args: targetArgs("tntgames") }) - public tntgames(context: CommandContext) { - return runTarget(context, "tntgames"); - } - - @SubCommand({ description: (t) => t("commands.target-turbokartracers"), args: targetArgs("turbokartracers"), group: "classic" }) - public turbokartracers(context: CommandContext) { - return runTarget(context, "turbokartracers"); - } - - @SubCommand({ description: (t) => t("commands.target-uhc"), args: targetArgs("uhc") }) - public uhc(context: CommandContext) { - return runTarget(context, "uhc"); - } - - @SubCommand({ description: (t) => t("commands.target-vampirez"), args: targetArgs("vampirez"), group: "classic" }) - public vampirez(context: CommandContext) { - return runTarget(context, "vampirez"); - } - - @SubCommand({ description: (t) => t("commands.target-walls"), args: targetArgs("walls"), group: "classic" }) - public walls(context: CommandContext) { - return runTarget(context, "walls"); - } - - @SubCommand({ description: (t) => t("commands.target-warlords"), args: targetArgs("warlords") }) - public warlords(context: CommandContext) { - return runTarget(context, "warlords"); - } - - @SubCommand({ description: (t) => t("commands.target-woolgames"), args: targetArgs("woolgames") }) - public woolgames(context: CommandContext) { - return runTarget(context, "woolgames"); - } -} - -@Command({ name: "calculate", description: (t) => t("commands.calculate") }) -export class CalculateCommand extends TargetCommand {} - -async function runTarget(context: CommandContext, game: GameKey) { - const user = context.getUser(); - const player = await apiService.getPlayer(context.option("player"), user); - const target = context.option("target"); - const setback = context.option("setback", DEFAULT_SETBACK); - const stat = resolveTargetStat(game, context.option("stat")); - const gameStats = player.stats[game] as unknown as Record; - const level = getLevel(gameStats); - - if (stat.type === "ratio") { - return buildRatioResponse(player, game, gameStats, stat, target, setback, level); - } - - return buildStatResponse(player, game, gameStats, stat, target, level); -} - -function buildRatioResponse( - player: Player, - game: GameKey, - gameStats: Record, - stat: TargetStat, - target: number, - setback: number, - level?: string -) { - const numerator = getNumber(gameStats, stat.numerator!); - const denominator = getNumber(gameStats, stat.denominator!); - const current = denominator === 0 ? numerator : numerator / denominator; - const needed = Math.max(0, Math.ceil(target * denominator - numerator)); - const neededWithSetback = Math.max( - 0, - Math.ceil(target * (denominator + setback) - numerator) - ); - const numeratorName = stat.numeratorName!; - const denominatorName = singularize(stat.denominatorName!); - - const lines = [ - `Current: **${formatDecimal(current)} ${stat.name}**`, - `Needed: **${formatInteger(needed)} ${numeratorName}** without another ${denominatorName}`, - ]; - - if (setback > 0) { - lines.push( - `Or: **${formatInteger(neededWithSetback)} ${numeratorName}** if you take **${formatInteger(setback)} ${stat.denominatorName}**` - ); - } - - return { - embeds: [ - baseEmbed(player, game, level) - .title(`To reach ${formatDecimal(target)} ${stat.name}:`) - .description(lines.join("\n")), - ], - }; -} - -function buildStatResponse( - player: Player, - game: GameKey, - gameStats: Record, - stat: TargetStat, - target: number, - level?: string -) { - const current = getNumber(gameStats, stat.key); - const needed = Math.max(0, Math.ceil(target - current)); - const statName = statNameLower(stat.name); - - return { - embeds: [ - baseEmbed(player, game, level) - .title(`To reach ${formatTarget(target)} ${stat.name}:`) - .description( - [ - `Current: **${formatTarget(current)} ${stat.name}**`, - `Needed: **${formatInteger(needed)} ${statName}**${needed === 0 ? " (target reached)" : ""}`, - ].join("\n") - ), - ], - }; -} - -function baseEmbed(player: Player, game: GameKey, level?: string) { - const titleParts = [player.displayName]; - if (level) titleParts.push(level); - - return new EmbedBuilder() - .author(titleParts.join(" ")) - .footer(GAME_NAMES.get(game)!) - .color(STATUS_COLORS.info); -} - -function getTargetStats(game: GameKey) { - if (statCache.has(game)) return statCache.get(game)!; - - const metadata = MetadataScanner.scan(getGameClass(game)); - const numberFields = metadata - .filter(([, { type }]) => type.type === Number) - .map(([key, { leaderboard }]) => ({ - key, - name: cleanName(leaderboard.fieldName || leaderboard.name || prettify(key)), - })); - - const byKey = new Map(numberFields.map((field) => [field.key, field])); - const ratioKeys = new Set(LEADERBOARD_RATIOS.map((ratio) => ratio[2])); - const ratios: TargetStat[] = []; - - for (const [numerator, denominator, ratioKey, prettyName] of LEADERBOARD_RATIOS) { - for (const field of numberFields) { - if (lastPathPart(field.key) !== ratioKey) continue; - - const parent = parentPath(field.key); - const numeratorKey = pathWithParent(parent, numerator); - const denominatorKey = pathWithParent(parent, denominator); - const numeratorField = byKey.get(numeratorKey); - const denominatorField = byKey.get(denominatorKey); - - if (!numeratorField || !denominatorField) continue; - - ratios.push({ - denominator: denominatorKey, - denominatorName: statNameLower(denominatorField.name), - key: field.key, - name: parent === "overall" || !parent ? prettyName : `${cleanName(parent)} ${prettyName}`, - numerator: numeratorKey, - numeratorName: statNameLower(numeratorField.name), - ratio: [numerator, denominator, ratioKey, prettyName], - type: "ratio", - }); - } - } - - const stats: TargetStat[] = [ - ...ratios, - ...numberFields - .filter((field) => !ratioKeys.has(lastPathPart(field.key))) - .map((field) => ({ ...field, type: "stat" as const })), - ]; - - statCache.set(game, stats); - return stats; -} - -function resolveTargetStat(game: GameKey, input: string) { - const stats = getTargetStats(game); - const normalized = input.toLowerCase(); - const exact = stats.find((stat) => stat.key === input); - if (exact) return exact; - - const overall = stats.find( - (stat) => - stat.key.toLowerCase() === `overall.${normalized}` || - stat.name.toLowerCase() === normalized - ); - if (overall) return overall; - - const fallback = stats.find( - (stat) => - lastPathPart(stat.key).toLowerCase() === normalized || - stat.name.toLowerCase().includes(normalized) - ); - - if (!fallback) { - throw new ErrorMessage( - "Target stat not found", - `I couldn't find \`${input}\` for ${GAME_NAMES.get(game)}. Use the stat autocomplete to pick a supported target.` - ); - } - - return fallback; -} - -function getLevel(gameStats: Record) { - const formatted = gameStats.levelFormatted || gameStats.naturalLevelFormatted; - if (typeof formatted === "string") return removeFormatting(formatted); - - const level = gameStats.level; - if (typeof level === "number") return `Level ${formatDecimal(level)}`; - - return undefined; -} - -function getNumber(data: Record, path: string) { - const value = path - .split(".") - .reduce((acc, key) => (acc as Record | undefined)?.[key], data); - - return typeof value === "number" && Number.isFinite(value) ? value : 0; -} - -function cleanName(value: string) { - return removeFormatting(value) - .replace(/\s+/g, " ") - .trim(); -} - -function statNameLower(value: string) { - return cleanName(value).toLowerCase(); -} - -function singularize(value: string) { - return value.endsWith("s") ? value.slice(0, -1) : value; -} - -function formatDecimal(value: number) { - return value.toLocaleString("en-US", { - maximumFractionDigits: 2, - minimumFractionDigits: 2, - }); -} - -function formatInteger(value: number) { - return value.toLocaleString("en-US", { maximumFractionDigits: 0 }); -} - -function formatTarget(value: number) { - return Number.isInteger(value) ? formatInteger(value) : formatDecimal(value); -} - -function lastPathPart(path: string) { - return path.split(".").at(-1)!; -} - -function parentPath(path: string) { - return path.split(".").slice(0, -1).join("."); -} - -function pathWithParent(parent: string, key: string) { - return parent ? `${parent}.${key}` : key; -} diff --git a/locales/en-US/default.json b/locales/en-US/default.json index 5e94dcc89..b66f3e884 100644 --- a/locales/en-US/default.json +++ b/locales/en-US/default.json @@ -14,9 +14,6 @@ "server": "A Minecraft server name or a server IP", "tags-content": "The content of the tag", "tags-name": "The name of the tag", - "target": "The goal you want to reach", - "target-setback": "How many denominator stats to include in the alternate calculation", - "target-stat": "The stat or ratio you want to target", "text": "A message", "user": "Choose a Discord user" }, @@ -34,7 +31,6 @@ "buildbattle": "$t(commands.hypixel-command, { \"name\": \"Build Battle\" })", "cape": "View someone's Minecraft and Optifine capes", "challenges": "$t(commands.hypixel-command, { \"name\": \"Challenge\" })", - "calculate": "$t(commands.target)", "quests-command": "View your {{name}} questing stats", "quests": "$t(commands.hypixel-command, { \"name\": \"Questing\" })", "quests-overall": "$t(commands.quests-command, { \"name\": \"Overall\" })", @@ -216,34 +212,6 @@ "tags-delete": "Delete a support tag", "tags-rename": "Rename a support tag", "text": "Generate Minecraft text", - "target": "Calculate what you need to reach a stat target", - "target-arcade": "$t(commands.target-command, { \"name\": \"Arcade\" })", - "target-arenabrawl": "$t(commands.target-command, { \"name\": \"Arena Brawl\" })", - "target-bedwars": "$t(commands.target-command, { \"name\": \"BedWars\" })", - "target-blitzsg": "$t(commands.target-command, { \"name\": \"BlitzSG\" })", - "target-buildbattle": "$t(commands.target-command, { \"name\": \"Build Battle\" })", - "target-command": "Calculate a {{name}} stat target", - "target-challenges": "$t(commands.target-command, { \"name\": \"Challenges\" })", - "target-copsandcrims": "$t(commands.target-command, { \"name\": \"Cops and Crims\" })", - "target-duels": "$t(commands.target-command, { \"name\": \"Duels\" })", - "target-general": "$t(commands.target-command, { \"name\": \"General\" })", - "target-megawalls": "$t(commands.target-command, { \"name\": \"MegaWalls\" })", - "target-murdermystery": "$t(commands.target-command, { \"name\": \"Murder Mystery\" })", - "target-paintball": "$t(commands.target-command, { \"name\": \"Paintball\" })", - "target-parkour": "$t(commands.target-command, { \"name\": \"Parkour\" })", - "target-pit": "$t(commands.target-command, { \"name\": \"Pit\" })", - "target-quake": "$t(commands.target-command, { \"name\": \"Quake\" })", - "target-quests": "$t(commands.target-command, { \"name\": \"Quests\" })", - "target-skywars": "$t(commands.target-command, { \"name\": \"SkyWars\" })", - "target-smashheroes": "$t(commands.target-command, { \"name\": \"Smash Heroes\" })", - "target-speeduhc": "$t(commands.target-command, { \"name\": \"Speed UHC\" })", - "target-tntgames": "$t(commands.target-command, { \"name\": \"TNT Games\" })", - "target-turbokartracers": "$t(commands.target-command, { \"name\": \"Turbo Kart Racers\" })", - "target-uhc": "$t(commands.target-command, { \"name\": \"UHC\" })", - "target-vampirez": "$t(commands.target-command, { \"name\": \"VampireZ\" })", - "target-walls": "$t(commands.target-command, { \"name\": \"Walls\" })", - "target-warlords": "$t(commands.target-command, { \"name\": \"Warlords\" })", - "target-woolgames": "$t(commands.target-command, { \"name\": \"WoolGames\" })", "theme": "Change your theme for every profile", "theme-boxes": "Change the appearance of the profile boxes", "theme-font": "Change the font of the profiles", From e19b84a4dcff0034c75f510a68d93b6b11199d8b Mon Sep 17 00:00:00 2001 From: Venxm <96634931+venxmised@users.noreply.github.com> Date: Fri, 29 May 2026 20:32:21 +0100 Subject: [PATCH 03/15] feat: add shotsHit --- locales/en-US/default.json | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/en-US/default.json b/locales/en-US/default.json index b66f3e884..ebb1b3d33 100644 --- a/locales/en-US/default.json +++ b/locales/en-US/default.json @@ -748,6 +748,7 @@ "seekerWins": "Seeker Wins", "shotAccuracy": "Shot Accuracy", "shotsFired": "Shots Fired", + "shotsHit": "Shots Hit", "silver": "Silver", "silverTrophies": "Silver Trophies", "slumberTickets": "Slumber Tickets", From 0bd1e462252ab574f110278b6686ef9f5f241feb Mon Sep 17 00:00:00 2001 From: Venxm <96634931+venxmised@users.noreply.github.com> Date: Fri, 29 May 2026 20:32:57 +0100 Subject: [PATCH 04/15] feat: add shotsHit --- .../schemas/src/player/gamemodes/duels/mode.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/schemas/src/player/gamemodes/duels/mode.ts b/packages/schemas/src/player/gamemodes/duels/mode.ts index 57cd014a0..2d68645ba 100644 --- a/packages/schemas/src/player/gamemodes/duels/mode.ts +++ b/packages/schemas/src/player/gamemodes/duels/mode.ts @@ -84,19 +84,26 @@ export class BowPVPBaseDuelsGameMode extends PVPBaseDuelsGameMode { @Field() public shotsFired: number; + @Field() + public shotsHit: number; + public constructor(data: APIData, mode: string) { super(data, mode); this.shotsFired = data[`${mode}_bow_shots`]; + this.shotsHit = data[`${mode}_bow_hits}`]; } } export class BowBaseDuelsGameMode extends PVPBaseDuelsGameMode { @Field() public shotsFired: number; + @Field() + public shotsHit: number; public constructor(data: APIData, mode: string) { super(data, mode); this.shotsFired = data[`${mode}_bow_shots`]; + this.shotsHit = data[`${mode}_bow_hits}`]; } } @@ -257,11 +264,14 @@ export class SinglePVPDuelsGameMode extends PVPBaseDuelsGameMode { export class SingleBowPVPDuelsGameMode extends SinglePVPDuelsGameMode { @Field() public shotsFired: number; + @Field() + public shotsHit: number; public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { super(data, title, mode, titleRequirement); mode = mode ? `${mode}_` : mode; this.shotsFired = data[`${mode}bow_shots`]; + this.shotsHit = data[`${mode}_bow_hits}`]; } } @@ -397,10 +407,14 @@ export class QuakeDuels extends SinglePVPDuelsGameMode { @Field() public shotsFired: number; + @Field() + public shotsHit: number; + public constructor(data: APIData) { super(data, "Quakecraft", "quake_duel", "default"); this.headshots = data.quake_duel_quake_headshots; this.shotsFired = data.quake_duel_quake_shots_taken; + this.shotsHit = data.quake_duel_quake_shots_hit; } } From 0e48320b0994ecd9ffbcd9129b0f5280be623ef6 Mon Sep 17 00:00:00 2001 From: Venxm <96634931+venxmised@users.noreply.github.com> Date: Fri, 29 May 2026 20:33:31 +0100 Subject: [PATCH 05/15] feat: add shotsHit --- apps/discord-bot/src/commands/duels/duels.profile.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/discord-bot/src/commands/duels/duels.profile.tsx b/apps/discord-bot/src/commands/duels/duels.profile.tsx index d45cfdd5a..5fd44b4f2 100644 --- a/apps/discord-bot/src/commands/duels/duels.profile.tsx +++ b/apps/discord-bot/src/commands/duels/duels.profile.tsx @@ -53,6 +53,12 @@ export const DuelsProfile = ({ sidebar.push([t("stats.shotsFired"), t(stats.overall.shotsFired), "§6"]); } + if ("shotsHit" in stats) { + sidebar.push([t("stats.shotsHit"), t(stats.shotsHit), "§c"]); + } else if ("overall" in stats && "shotsHit" in stats.overall) { + sidebar.push([t("stats.shotsHit"), t(stats.overall.shotsHit), "§c"]); + } + if ("headshots" in stats) sidebar.push([t("stats.headshots"), t(stats.headshots), "§3"]); From 8d2d08d9ee55e6362d634edf30aa370dc9dc09c4 Mon Sep 17 00:00:00 2001 From: Venxm <96634931+venxmised@users.noreply.github.com> Date: Fri, 29 May 2026 20:45:56 +0100 Subject: [PATCH 06/15] fix: remove bad _ --- packages/schemas/src/player/gamemodes/duels/mode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schemas/src/player/gamemodes/duels/mode.ts b/packages/schemas/src/player/gamemodes/duels/mode.ts index 2d68645ba..82030b160 100644 --- a/packages/schemas/src/player/gamemodes/duels/mode.ts +++ b/packages/schemas/src/player/gamemodes/duels/mode.ts @@ -271,7 +271,7 @@ export class SingleBowPVPDuelsGameMode extends SinglePVPDuelsGameMode { super(data, title, mode, titleRequirement); mode = mode ? `${mode}_` : mode; this.shotsFired = data[`${mode}bow_shots`]; - this.shotsHit = data[`${mode}_bow_hits}`]; + this.shotsHit = data[`${mode}bow_hits}`]; } } From f69344d1bccdb4b10b0586d555f07c4db7c89cf9 Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Sun, 31 May 2026 17:19:55 -0400 Subject: [PATCH 07/15] chore: remove .turbo folder --- '.turbo'/0887dd989cb0df92-meta.json | 1 - '.turbo'/0887dd989cb0df92.tar.zst | Bin 236 -> 0 bytes '.turbo'/560fb9e86b65f150-meta.json | 1 - '.turbo'/560fb9e86b65f150.tar.zst | Bin 235 -> 0 bytes '.turbo'/5de5b3be5565a1d4-meta.json | 1 - '.turbo'/5de5b3be5565a1d4.tar.zst | Bin 235 -> 0 bytes '.turbo'/6df68d36259bce9e-meta.json | 1 - '.turbo'/6df68d36259bce9e.tar.zst | Bin 238 -> 0 bytes '.turbo'/6e55f2172ff48f6f-meta.json | 1 - '.turbo'/6e55f2172ff48f6f.tar.zst | Bin 234 -> 0 bytes '.turbo'/87c54e168150e584-meta.json | 1 - '.turbo'/87c54e168150e584.tar.zst | Bin 234 -> 0 bytes '.turbo'/8ec1ba9b0fa0ad92-meta.json | 1 - '.turbo'/8ec1ba9b0fa0ad92.tar.zst | Bin 237 -> 0 bytes '.turbo'/928fdb17552f72c8-meta.json | 1 - '.turbo'/928fdb17552f72c8.tar.zst | Bin 237 -> 0 bytes '.turbo'/bf4fc849fd54c438-meta.json | 1 - '.turbo'/bf4fc849fd54c438.tar.zst | Bin 227 -> 0 bytes '.turbo'/c1c2543d8c410791-meta.json | 1 - '.turbo'/c1c2543d8c410791.tar.zst | Bin 233 -> 0 bytes '.turbo'/c57e3a1fe2240051-meta.json | 1 - '.turbo'/c57e3a1fe2240051.tar.zst | Bin 235 -> 0 bytes '.turbo'/dda3b3af35eb510f-meta.json | 1 - '.turbo'/dda3b3af35eb510f.tar.zst | Bin 232 -> 0 bytes '.turbo'/eb9eb96f6e1ed9be-meta.json | 1 - '.turbo'/eb9eb96f6e1ed9be.tar.zst | Bin 236 -> 0 bytes .gitignore | 1 + 27 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 '.turbo'/0887dd989cb0df92-meta.json delete mode 100644 '.turbo'/0887dd989cb0df92.tar.zst delete mode 100644 '.turbo'/560fb9e86b65f150-meta.json delete mode 100644 '.turbo'/560fb9e86b65f150.tar.zst delete mode 100644 '.turbo'/5de5b3be5565a1d4-meta.json delete mode 100644 '.turbo'/5de5b3be5565a1d4.tar.zst delete mode 100644 '.turbo'/6df68d36259bce9e-meta.json delete mode 100644 '.turbo'/6df68d36259bce9e.tar.zst delete mode 100644 '.turbo'/6e55f2172ff48f6f-meta.json delete mode 100644 '.turbo'/6e55f2172ff48f6f.tar.zst delete mode 100644 '.turbo'/87c54e168150e584-meta.json delete mode 100644 '.turbo'/87c54e168150e584.tar.zst delete mode 100644 '.turbo'/8ec1ba9b0fa0ad92-meta.json delete mode 100644 '.turbo'/8ec1ba9b0fa0ad92.tar.zst delete mode 100644 '.turbo'/928fdb17552f72c8-meta.json delete mode 100644 '.turbo'/928fdb17552f72c8.tar.zst delete mode 100644 '.turbo'/bf4fc849fd54c438-meta.json delete mode 100644 '.turbo'/bf4fc849fd54c438.tar.zst delete mode 100644 '.turbo'/c1c2543d8c410791-meta.json delete mode 100644 '.turbo'/c1c2543d8c410791.tar.zst delete mode 100644 '.turbo'/c57e3a1fe2240051-meta.json delete mode 100644 '.turbo'/c57e3a1fe2240051.tar.zst delete mode 100644 '.turbo'/dda3b3af35eb510f-meta.json delete mode 100644 '.turbo'/dda3b3af35eb510f.tar.zst delete mode 100644 '.turbo'/eb9eb96f6e1ed9be-meta.json delete mode 100644 '.turbo'/eb9eb96f6e1ed9be.tar.zst diff --git a/'.turbo'/0887dd989cb0df92-meta.json b/'.turbo'/0887dd989cb0df92-meta.json deleted file mode 100644 index 0abb21ba7..000000000 --- a/'.turbo'/0887dd989cb0df92-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"0887dd989cb0df92","duration":43270} \ No newline at end of file diff --git a/'.turbo'/0887dd989cb0df92.tar.zst b/'.turbo'/0887dd989cb0df92.tar.zst deleted file mode 100644 index 876d1d00fc6645ee30584c0624a40aded0d9854a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmV%H0Aq{$P6_{z#Gzy-pkpPG>@|09k zWIR?^rn=6~?#N6gZrSWu4M>9=Tnes%gIk}A;L_)B5nS5-fe7x`vdHGk56|KeXzu^t zTm1ilQdQQKsWwivV7WANXiLiBNs$baYzP+s!Q?++{49!)*~d~eVOnWQAP7Q5kh>^i mP9d&h0A*lv0=Hek8Ng!U0n>xDp)&ZnVSr=hGQ|m+wlD#w4QW&W diff --git a/'.turbo'/560fb9e86b65f150-meta.json b/'.turbo'/560fb9e86b65f150-meta.json deleted file mode 100644 index ccc17f6be..000000000 --- a/'.turbo'/560fb9e86b65f150-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"560fb9e86b65f150","duration":45208} \ No newline at end of file diff --git a/'.turbo'/560fb9e86b65f150.tar.zst b/'.turbo'/560fb9e86b65f150.tar.zst deleted file mode 100644 index a5ff4423427b07907278ee618af089ad4853f837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmVLp4oLjeY>C@8I{TBC{|KSpFR@_$=l%Y_ zpI$f#%e~Q|R_cpL5E>Iw&0RHBcqB9s3?6h*(0qY8U?V3(R4n8iqHAL;0JJIUp%r91 zKe=hw$ONH_M#~a=+uz>_8p8pbIGHrrL7eQ$=u8#`{Lq;!g8zUs*;i}$$vs(LG9eZ4 zUkeJv|Cdtn|EpoTFH7uo%*22v`7yXsaBWvX7FP<>6!ioX0KMctU<@saklDymv|(D2 lN`RZ{ARQqNVgO}ea{_F)0m=bL4m^NW0~{-t0Zx!<%NXj&W$FL` diff --git a/'.turbo'/5de5b3be5565a1d4-meta.json b/'.turbo'/5de5b3be5565a1d4-meta.json deleted file mode 100644 index e0932d865..000000000 --- a/'.turbo'/5de5b3be5565a1d4-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"5de5b3be5565a1d4","duration":44301} \ No newline at end of file diff --git a/'.turbo'/5de5b3be5565a1d4.tar.zst b/'.turbo'/5de5b3be5565a1d4.tar.zst deleted file mode 100644 index a477f4935afb3b0dfd850bbf26d319f4502bf036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmVaI22x}t%N}&xhLGlSq^me7?!b72vaPW`{1Lq9va1M-|ph%HrNi<~(M1YjCDTIQg zqQS02vh3~cj7mi6J8v`C!r`13d5VniB3t;L$kD*>p2(5=3!cbdj8*gYWPLU6jr-Sf z1n>VLZ2o^$%C;+!?7~nD)#Ns&qP0?%X&L0KMctU<@saklDymv|(C#N?(y z2|0ka2Wuq&YM~7>Me+$u^!BBt!Xu%9VDONNg69kDa1V@(u+#{{AeyqpAwWvm6jDV} z(O{RVmc6~5af#Hv^EQJm9PW9Mr^p8{vV{+dEDih)iY&RG0E+y@7-inBtgl1@I__V~ zIq&}=bpC%yD%&nqEz?vCl*(<*rD(MgQzx@&Dwz$@oCFmBwd6lwEG>$V*~(J1Vp^F> oK(IxNAoo&)IfXEa0hEEw39#J;Cs^(iqLmw&nhPLdI1t8400oe$ zCgcJ)0*N^zgtW*unI!QAOtSgHaRH*>NH~B*hJka2eK@CqtFTBE#uO}9BLNV(Rw!O5 z5;xQwSx%@VG90Tb(p+zEFIbI-a~|9YF2aL5oA<{9 diff --git a/'.turbo'/87c54e168150e584-meta.json b/'.turbo'/87c54e168150e584-meta.json deleted file mode 100644 index 6cc9d4cf6..000000000 --- a/'.turbo'/87c54e168150e584-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"87c54e168150e584","duration":45136} \ No newline at end of file diff --git a/'.turbo'/87c54e168150e584.tar.zst b/'.turbo'/87c54e168150e584.tar.zst deleted file mode 100644 index 28045f0a7f9971b59ffadfaef8191d21e0321dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmV-I5=>bG0U)JhDybsL zc(ATamA$>)k(o@~v)REK5cj;eR9u4>x55X-l@z~&;!5rxfZ~2JW|_^G_4O2AxPL7t z@ctjd#s4o#Ra;l4+BnsM<2vCI~!iyZ`_I diff --git a/'.turbo'/8ec1ba9b0fa0ad92-meta.json b/'.turbo'/8ec1ba9b0fa0ad92-meta.json deleted file mode 100644 index 49e6c00cc..000000000 --- a/'.turbo'/8ec1ba9b0fa0ad92-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"8ec1ba9b0fa0ad92","duration":47460} \ No newline at end of file diff --git a/'.turbo'/8ec1ba9b0fa0ad92.tar.zst b/'.turbo'/8ec1ba9b0fa0ad92.tar.zst deleted file mode 100644 index 17aa4fdbb0b7d06a41c395b03e22f78ec5df2fcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVTh1iM#l!46&u-yhI2Ov4{09FlftXu{-L8dKZ9qwu` diff --git a/'.turbo'/928fdb17552f72c8-meta.json b/'.turbo'/928fdb17552f72c8-meta.json deleted file mode 100644 index e916ab45c..000000000 --- a/'.turbo'/928fdb17552f72c8-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"928fdb17552f72c8","duration":53821} \ No newline at end of file diff --git a/'.turbo'/928fdb17552f72c8.tar.zst b/'.turbo'/928fdb17552f72c8.tar.zst deleted file mode 100644 index b40d6d9ffaf5d6c97c41c6f88bc74a024bf759b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVMnCOi-t2L+F*Ab768j`u{#2ug)845DdUEC6%PrjsR2 zMWbCwwe9Zij0&XojczmA!tov`xsq%ECEExg$yC7qAj#DG2O!C3tzFUW2|IhvbKcKb zLID1MjL!eFh-KZCRLeBh!Zo?BnJ!D}IyFrr5rY&p1Qh_gLnl!46&u-yhI2Ov4{09FlftXxJoL8L8XyCP-9 diff --git a/'.turbo'/bf4fc849fd54c438-meta.json b/'.turbo'/bf4fc849fd54c438-meta.json deleted file mode 100644 index fd33a9efb..000000000 --- a/'.turbo'/bf4fc849fd54c438-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"bf4fc849fd54c438","duration":54932} \ No newline at end of file diff --git a/'.turbo'/bf4fc849fd54c438.tar.zst b/'.turbo'/bf4fc849fd54c438.tar.zst deleted file mode 100644 index db99be3dde4dbbae1919963fb8bc997e9e5c0e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmV<90381)wJ-euSk(pqqRS{GAgNdffl>TkX=)E+6FdfUeZa3f03@e3L zfM;w2Os$h)QYL#)j_3~5yj|&t&^TBa5Hw<9AbJ8bTJ#_{6bf;irsq;H0MyFZ*2-9c z(7y6^?D?o1F|k-TLhCv^y8yLvDHttskSWLo4sv}?f;=JqCPALsA0RJ6 dMuvhDfW=@0@CRf=Iq*{(0LRK@1c#6aWeF)NVnP4_ diff --git a/'.turbo'/c1c2543d8c410791-meta.json b/'.turbo'/c1c2543d8c410791-meta.json deleted file mode 100644 index fde63cd1e..000000000 --- a/'.turbo'/c1c2543d8c410791-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"c1c2543d8c410791","duration":56038} \ No newline at end of file diff --git a/'.turbo'/c1c2543d8c410791.tar.zst b/'.turbo'/c1c2543d8c410791.tar.zst deleted file mode 100644 index e9773a7179fce5b0609c0e208e74024c247cba0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmVS6AgNdf0fxZ8N>h6fhPo0VzzLm=()9K=<9GA@Y_c%G z4hUcy2TCb}q{uc^QhWiGY_4!jcpx+m3LbGm@LXXX?s4EEC^Nz^2$qa-0Elc^QLIEJ zchnqNPF0GF25ZTr?CtFXjNx$4gImEhcyOunAh=ZGcMx34{Q?l&Gj>JIlP@me6z=`M z<0$@rS*WzNWKyQ7kZaPd=?Y<{t4chlhAk@!6#&8HKVbYUijdjIQZ!*&fl9zdWk^Q| jgBU;=*qp#^S8xWf7=QroAZ@4&er_1xShw1OSSGBLN_#tTRGI za^YA_p}fw{-eB5QyGUqlsB2>}9?p4jr??0&F2nc4l>~nG#FgA%@WlOE6{u@<<_`|I z_x}(Q{690Hm^FoR)2N0@)vPh?s?|Ax93to;768HIKVbYUijdjIQZ!*&X-XgnLPd~6 liXx5yl!46&+;#kOOb^nA%HZdQ0gjc+6enof!UU0bWViqT diff --git a/'.turbo'/dda3b3af35eb510f-meta.json b/'.turbo'/dda3b3af35eb510f-meta.json deleted file mode 100644 index f9869f7fe..000000000 --- a/'.turbo'/dda3b3af35eb510f-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"dda3b3af35eb510f","duration":10523} \ No newline at end of file diff --git a/'.turbo'/dda3b3af35eb510f.tar.zst b/'.turbo'/dda3b3af35eb510f.tar.zst deleted file mode 100644 index f6ca565c0ec46f60dd901e4f3ddc2d986fb04d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmVD%o7&sPIT=AQ(L2q5%5BIvn)CO;BcpVG=AE0|5}ZRw-5@ zlUr(zEFsnu7Y){uN!i=m2^hoSpa-{td+^}W=S6TS=XViY%KZZoT*fY`dGbZ!9EEe< z|38nw|1S*|Z7rFUX)K0o(yigH^P0HfTBQ~MD&;@eY7By77jvQkBZa98*Hk7QAu<}6 i_FzU{0M*D)a00LxcmVexZKw=>76af|xr}jwq%BO8BxNK3 diff --git a/'.turbo'/eb9eb96f6e1ed9be-meta.json b/'.turbo'/eb9eb96f6e1ed9be-meta.json deleted file mode 100644 index dd4925314..000000000 --- a/'.turbo'/eb9eb96f6e1ed9be-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"eb9eb96f6e1ed9be","duration":12686} \ No newline at end of file diff --git a/'.turbo'/eb9eb96f6e1ed9be.tar.zst b/'.turbo'/eb9eb96f6e1ed9be.tar.zst deleted file mode 100644 index d355dec8a135cf02eea2ed28b8cb6b7d5cb5b68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmVvo~%sKTlsv=GnvlNW~*Q+kg z;Zh6<2Wu+;#ZV@ZW^@UO-p+JPh#));3L=p~@LYi*?Rk(9m}t^8h^DJ?2#7H@l}s}- z9_v;jyUxz;$V{TX^0s3&AnkFGCCCO2vV9JMTm}9HL9Xo|fFNJ3Ws$cp>gp-lqWwxG z6z>1uTl~MGOqShBWE*E%uv{*4T1vFecA8Qo!;}pH6#%>BKVTFsijY~!QuJY3fl5G- m<%%FTQiM5$Ac_H$fz1i9-3BNJAUW^=Rt<2hTt+xSq%C80gk>-Q diff --git a/.gitignore b/.gitignore index 9c83ea758..8c2b3f4c0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ config.json dist node_modules .turbo +'.turbo' package-lock.json out .yarn/install-state.gz From 3678c106443f41cd4587b7d7da101d51761d473e Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:41:45 -0400 Subject: [PATCH 08/15] chore: update dependencies and repo cleanup (#871) * chore: update turborepo and typescript + remove commitlint * chore: update napi-rs/cli and @types/node and unplugin * chore: add oxlint for packages using basic rules * chore: add all oxlint rules * chore: lint api * chore: lint scripts * chore: lint site * chore: lint support-bot and site * chore: lint rendering package * chore: lint discord-bot * chore: update submodules * fix: types * chore: remove eslint dependencies and update ci workflow * chore: update node version in ci * chore: add lint ci script * chore: use lint ci script in ci * chore: rename test:types to typecheck * chore: use typescript native preview * chore: update to vitest v4 * chore: update swc version * chore: update lockfile * chore: update tailwind * chore: add compose.dev.yml * chore: only test affected packages in ci * chore: remove affected from test script * chore: add check if rank exists for formatting display names * chore: remove commented site rules * chore: format tsconfigs --- .devcontainer/Dockerfile | 8 - .devcontainer/devcontainer.json | 32 - .github/CONTRIBUTING.md | 2 +- .github/workflows/ci.yml | 21 +- .gitignore | 1 - .oxfmtrc.jsonc | 4 + .oxlintrc.jsonc | 179 + .vscode/settings.json | 26 +- .vscode/tasks.json | 36 +- README.md | 2 +- apps/api/eslint.config.js | 11 - apps/api/package.json | 13 +- apps/api/src/auth/auth.guard.ts | 2 +- apps/api/src/dtos/guild-leaderboard.dto.ts | 4 +- apps/api/src/dtos/guild-rankings.dto.ts | 4 +- apps/api/src/dtos/player-leaderboard.dto.ts | 4 +- apps/api/src/dtos/player-rankings.dto.ts | 4 +- apps/api/src/guild/guild.service.ts | 61 +- apps/api/src/hypixel/hypixel.service.ts | 2 +- apps/api/src/index.ts | 4 +- .../src/leaderboards/leaderboard.service.ts | 16 +- apps/api/src/player/player.controller.ts | 9 +- apps/api/src/player/player.service.ts | 50 +- apps/api/src/skin/skin.service.ts | 2 +- apps/api/src/user/user.service.ts | 43 +- apps/api/tsconfig.json | 5 +- apps/discord-bot/eslint.config.js | 11 - apps/discord-bot/package.json | 11 +- .../src/commands/arcade/modes/dropper.tsx | 4 +- .../src/commands/base.hypixel-command.ts | 6 +- .../challenges/challenges.profile.tsx | 44 +- .../src/commands/config/theme.command.tsx | 2 +- .../src/commands/events/events.command.tsx | 9 +- .../src/commands/gamecounts.command.ts | 9 +- .../commands/gtbhelper/gtbhelpber.command.tsx | 8 +- .../src/commands/guild/guild-list.profile.tsx | 4 +- .../commands/guild/guild-top.subcommand.tsx | 8 +- .../src/commands/guild/guild.command.tsx | 9 +- .../commands/historical/session.command.tsx | 9 +- .../guild-leaderboard.argument.ts | 4 +- .../guild-leaderboard.subcommand.ts | 2 +- .../player-leaderboard.argument.ts | 7 +- .../src/commands/minecraft/cape.command.ts | 11 +- .../src/commands/minecraft/colors.command.ts | 4 +- .../minecraft/server/server.argument.ts | 2 + .../minecraft/server/server.command.tsx | 1 + .../minecraft/server/server.profile.tsx | 2 +- .../src/commands/quests/quests.command.tsx | 11 +- .../src/commands/quests/quests.profile.tsx | 4 +- .../commands/rankings/rankings.command.tsx | 15 +- .../src/commands/ratios/ratios.command.tsx | 13 +- .../src/components/Header/Header.tsx | 2 +- apps/discord-bot/src/components/List.tsx | 4 +- apps/discord-bot/src/index.ts | 6 +- apps/discord-bot/src/lib/command.listener.ts | 5 +- .../src/lib/convert-color-codes.ts | 2 +- apps/discord-bot/tsconfig.json | 10 +- apps/scripts/eslint.config.js | 15 - apps/scripts/package.json | 13 +- apps/scripts/src/api-key.js | 9 +- apps/scripts/src/limit-redis.js | 22 +- apps/scripts/src/purge.js | 10 +- apps/scripts/src/rank-emojis.js | 38 +- apps/scripts/src/timestamp.js | 25 +- apps/scripts/src/validate-commands.js | 14 +- apps/scripts/tsconfig.json | 5 +- apps/site/.oxlintrc.jsonc | 72 + apps/site/app/(home)/session-animation.tsx | 12 +- apps/site/app/api/skin/head/route.ts | 2 +- apps/site/app/api/skin/render/route.ts | 2 +- apps/site/app/players/[slug]/context.tsx | 21 +- .../players/[slug]/general/bingo/bingo.tsx | 10 +- apps/site/app/players/search.tsx | 51 +- apps/site/components/ui/background.tsx | 2 +- apps/site/components/ui/box.tsx | 4 +- apps/site/components/ui/carousel.tsx | 2 + apps/site/components/ui/command.tsx | 7 +- apps/site/components/ui/minecraft-text.tsx | 2 +- apps/site/components/ui/tabs.tsx | 10 +- apps/site/eslint.config.mjs | 22 - apps/site/hooks/use-measure.tsx | 1 - apps/site/package.json | 22 +- apps/support-bot/package.json | 11 +- .../src/commands/commands.command.ts | 9 +- .../src/events/guild-member-add.event.tsx | 40 +- .../src/events/guild-member-update.event.ts | 4 +- apps/support-bot/src/index.ts | 17 +- .../src/services/mongo-loader.service.ts | 4 +- .../src/services/ticket.service.ts | 11 +- apps/support-bot/tsconfig.json | 5 +- apps/verify-server/eslint.config.js | 11 - apps/verify-server/package.json | 9 +- apps/verify-server/src/generate-code.ts | 8 +- apps/verify-server/tsconfig.json | 5 +- assets/private | 2 +- assets/public | 2 +- compose.dev.yml | 21 + config.schema.js | 4 +- eslint.config.js | 235 - package.json | 63 +- packages/api-client/eslint.config.js | 11 - packages/api-client/package.json | 9 +- packages/api-client/src/api.service.ts | 4 +- packages/api-client/tsconfig.json | 5 +- packages/assets/eslint.config.js | 11 - packages/assets/package.json | 11 +- packages/assets/src/index.ts | 4 +- packages/assets/tsconfig.json | 5 +- packages/discord/eslint.config.js | 11 - packages/discord/package.json | 11 +- .../discord/src/arguments/player.argument.ts | 2 +- .../src/command/abstract-command.listener.ts | 7 +- .../discord/src/command/command.builder.ts | 103 +- .../discord/src/command/command.loader.ts | 102 +- packages/discord/src/event/event.loader.ts | 90 +- .../src/messages/components/parse-emoji.ts | 2 +- packages/discord/src/messages/embed.ts | 4 +- packages/discord/src/services/api.service.ts | 27 +- .../src/services/i18n-loader.service.ts | 140 +- .../discord/src/services/member.service.ts | 5 +- .../discord/src/services/paginate.service.ts | 667 +- packages/discord/src/util/error.message.ts | 9 +- .../discord/src/util/parse-discord-error.ts | 14 +- packages/discord/tsconfig.json | 1 - packages/logger/eslint.config.js | 11 - packages/logger/package.json | 9 +- packages/logger/src/index.ts | 65 +- packages/logger/tsconfig.json | 1 - packages/math/eslint.config.js | 11 - packages/math/package.json | 9 +- packages/math/src/index.ts | 4 +- packages/math/tsconfig.json | 1 - packages/rendering/eslint.config.js | 11 - packages/rendering/package.json | 11 +- packages/rendering/src/colors/index.ts | 4 +- packages/rendering/src/font/font-renderer.ts | 31 +- packages/rendering/src/hooks/useGradient.ts | 4 +- packages/rendering/src/index.ts | 3 - packages/rendering/src/intrinsics/Box.ts | 2 +- packages/rendering/src/jsx-runtime/convert.ts | 4 +- .../rendering/src/jsx/create-instructions.ts | 2 +- packages/rendering/src/jsx/render.ts | 16 +- packages/rendering/tsconfig.json | 1 - packages/schemas/eslint.config.js | 11 - packages/schemas/package.json | 9 +- packages/schemas/src/game/game-modes.ts | 2 +- packages/schemas/src/guild/index.ts | 3 +- packages/schemas/src/guild/member.ts | 6 +- packages/schemas/src/guild/util.ts | 4 +- packages/schemas/src/metadata/deserialize.ts | 15 +- .../field/get-leaderboard-metadata.ts | 36 +- .../schemas/src/metadata/metadata-scanner.ts | 197 +- packages/schemas/src/metadata/serialize.ts | 8 +- .../src/player/gamemodes/duels/mode.ts | 110 +- .../player/gamemodes/murdermystery/index.ts | 6 +- .../player/gamemodes/murdermystery/mode.ts | 2 +- .../src/player/gamemodes/quests/util.ts | 16 +- .../src/player/gamemodes/skywars/util.ts | 4 +- .../player/gamemodes/woolgames/sheepwars.ts | 2 +- packages/schemas/src/player/index.ts | 22 +- packages/schemas/src/player/status.ts | 48 +- packages/schemas/src/player/util.ts | 226 +- .../src/util/create-historical-player.ts | 31 +- .../schemas/src/util/historical-scanner.ts | 66 - packages/schemas/src/util/index.ts | 1 - .../schemas/src/util/leaderboard-scanner.ts | 79 +- packages/schemas/src/util/parse-fields.ts | 2 +- packages/schemas/tsconfig.json | 1 - packages/skin-renderer/index.cjs | 102 +- packages/skin-renderer/package.json | 5 +- packages/util/eslint.config.js | 11 - packages/util/package.json | 12 +- packages/util/src/config.ts | 30 +- packages/util/src/flatten.ts | 4 +- packages/util/src/types.ts | 2 +- packages/util/src/unflatten.ts | 12 +- packages/util/src/util.ts | 18 +- packages/util/tsconfig.json | 8 +- pnpm-lock.yaml | 7153 ++++++----------- tsconfig.base.json | 12 +- turbo.json | 88 +- vite.swc.ts | 4 + .../eslint.config.js => vitest.config.ts | 8 +- vitest.workspace.ts | 14 - 184 files changed, 4506 insertions(+), 6977 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json create mode 100644 .oxfmtrc.jsonc create mode 100644 .oxlintrc.jsonc delete mode 100644 apps/api/eslint.config.js delete mode 100644 apps/discord-bot/eslint.config.js delete mode 100644 apps/scripts/eslint.config.js create mode 100644 apps/site/.oxlintrc.jsonc delete mode 100644 apps/site/eslint.config.mjs delete mode 100644 apps/verify-server/eslint.config.js create mode 100644 compose.dev.yml delete mode 100644 eslint.config.js delete mode 100644 packages/api-client/eslint.config.js delete mode 100644 packages/assets/eslint.config.js delete mode 100644 packages/discord/eslint.config.js delete mode 100644 packages/logger/eslint.config.js delete mode 100644 packages/math/eslint.config.js delete mode 100644 packages/rendering/eslint.config.js delete mode 100644 packages/schemas/eslint.config.js delete mode 100644 packages/schemas/src/util/historical-scanner.ts delete mode 100644 packages/util/eslint.config.js rename apps/support-bot/eslint.config.js => vitest.config.ts (57%) delete mode 100644 vitest.workspace.ts diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 5efd057af..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:1-16 - -# Install additional OS packages -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends fontconfig redis-server - -# Install NPM packages -RUN su node -c "npm install -g pm2 git-cz pnpm" \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 7970c288a..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "Statsify", - "build": { - "dockerfile": "Dockerfile" - }, - "customizations": { - "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "vivaxy.vscode-conventional-commits", - "mikestead.dotenv", - "ms-azuretools.vscode-docker", - "lokalise.i18n-ally", - "gruntfuggly.todo-tree" - ] - } - }, - "runArgs": [ - "--privileged" - ], - "containerEnv": { - "USE_POLLING": "true" - }, - "remoteUser": "node", - "postCreateCommand": "git submodule update --init && pnpm install && pnpm run build", - "postStartCommand": "sudo /etc/init.d/redis-server start && git config core.autocrlf true && pnpm scripts api-key --nonInteractiveKeyCreation", - "features": { - "ghcr.io/devcontainers/features/git:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} - } -} \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c87483316..749e96246 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -6,7 +6,7 @@ ## Guidelines ### General Concepts -* Code should follow our ESLint rules as closely as possible (`pnpm lint`) +* Code should follow our linting rules as closely as possible (`pnpm lint`) * Code should attempt to be TypeScript type safe * Code should attempt to be consistent, fast, scalable, and efficient diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc4411879..5fd3cfa11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: branches: - - main + - main pull_request: permissions: @@ -14,8 +14,9 @@ jobs: name: CI runs-on: ubuntu-latest env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 @@ -23,10 +24,10 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Install node.js v22 + - name: Install node.js v24 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: - node-version: 22.6.0 + node-version: 24.7.0 - name: Install wasm-pack run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh @@ -41,16 +42,16 @@ jobs: turbo-${{ github.job }}-${{ github.ref_name }}- - name: Install dependencies - run: pnpm install + run: pnpm install --frozen-lockfile - name: Lint - run: pnpm lint + run: pnpm lint:ci --affected - name: Typecheck - run: pnpm test:types + run: pnpm typecheck --affected - name: Build - run: pnpm build + run: pnpm build --affected - name: Test - run: pnpm test:coverage \ No newline at end of file + run: pnpm test:coverage diff --git a/.gitignore b/.gitignore index 8c2b3f4c0..589536b4e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,5 @@ apps/support-bot/commands.json Cargo.lock /target /data -compose.dev.yml *.node .env diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc new file mode 100644 index 000000000..bc1ae6358 --- /dev/null +++ b/.oxfmtrc.jsonc @@ -0,0 +1,4 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 80, +} diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc new file mode 100644 index 000000000..99b35f251 --- /dev/null +++ b/.oxlintrc.jsonc @@ -0,0 +1,179 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": [ + "eslint", + "typescript", + "unicorn", + "oxc", + "import", + "node", + "promise", + "vitest", + ], + "jsPlugins": [ + { "name": "license-header", "specifier": "eslint-plugin-license-header" }, + ], + "rules": { + // Oxc + "oxc/no-this-in-exported-function": "error", + "oxc/misrefactored-assign-op": "error", + "oxc/approx-constant": "error", + "oxc/no-accumulating-spread": "error", + "oxc/branches-sharing-code": "error", + + // Type Aware Rules + "typescript/no-unnecessary-boolean-literal-compare": "error", + "typescript/no-unnecessary-template-expression": "error", + "typescript/no-unnecessary-type-arguments": "error", + "typescript/no-unnecessary-type-conversion": "error", + "typescript/no-unnecessary-type-assertion": "error", + "typescript/non-nullable-type-assertion-style": "error", + "typescript/prefer-optional-chain": "error", + "typescript/no-unnecessary-condition": "error", + "typescript/no-confusing-void-expression": "error", + "typescript/no-deprecated": "error", + "typescript/no-misused-promises": "error", + "typescript/only-throw-error": "error", + "typescript/prefer-includes": "error", + "typescript/prefer-nullish-coalescing": "error", + "typescript/prefer-promise-reject-errors": "error", + "typescript/related-getter-setter-pairs": "error", + "typescript/require-await": "error", + "typescript/restrict-plus-operands": "error", + "typescript/switch-exhaustiveness-check": "error", + + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-extraneous-class": ["error", { "allowWithDecorator": true }], + "typescript/no-confusing-non-null-assertion": "error", + "typescript/no-non-null-asserted-nullish-coalescing": "error", + "typescript/no-import-type-side-effects": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-dynamic-delete": "error", + "typescript/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + "ts-check": true, + "minimumDescriptionLength": 3, + }, + ], + "typescript/no-unsafe-function-type": "error", + + // Eslint + "no-unneeded-ternary": "error", + "no-unmodified-loop-condition": "error", + "no-unexpected-multiline": "error", + "no-underscore-dangle": "error", + "no-extra-bind": "error", + "no-extend-native": "error", + "no-var": "error", + "no-proto": "error", + "no-param-reassign": "warn", + "no-empty": "error", + "no-useless-call": "error", + "no-await-in-loop": "error", + "no-useless-assignment": "error", + "no-array-constructor": "error", + "no-case-declarations": "error", + "no-constructor-return": "error", + "no-else-return": "error", + "no-fallthrough": "error", + "no-lonely-if": "error", + "no-promise-executor-return": "error", + "no-prototype-builtins": "error", + "no-useless-return": "error", + "no-warning-comments": "warn", + "eqeqeq": "error", + "class-methods-use-this": "warn", + "symbol-description": "error", + + // Unicorn + "unicorn/prefer-add-event-listener": "error", + "unicorn/no-instanceof-builtins": "error", + "unicorn/no-accessor-recursion": "error", + "unicorn/consistent-function-scoping": "error", + "unicorn/prefer-number-properties": "error", + "unicorn/prefer-node-protocol": "error", + "unicorn/prefer-modern-math-apis": "error", + "unicorn/no-useless-error-capture-stack-trace": "error", + "unicorn/no-magic-array-flat-depth": "error", + "unicorn/no-unnecessary-slice-end": "error", + "unicorn/no-array-for-each": "error", + "unicorn/no-anonymous-default-export": "error", + "unicorn/no-abusive-eslint-disable": "error", + "unicorn/prefer-array-flat-map": "error", + "unicorn/prefer-array-find": "error", + "unicorn/no-useless-iterator-to-array": "error", + "unicorn/consistent-assert": "error", + "unicorn/consistent-empty-array-spread": "error", + "unicorn/explicit-length-check": "error", + "unicorn/new-for-builtins": "error", + "unicorn/no-hex-escape": "error", + "unicorn/no-immediate-mutation": "error", + "unicorn/no-lonely-if": "error", + "unicorn/no-negation-in-equality-check": "error", + "unicorn/no-new-buffer": "error", + "unicorn/no-object-as-default-parameter": "error", + "unicorn/no-typeof-undefined": "error", + "unicorn/no-unnecessary-array-splice-count": "error", + "unicorn/no-unreadable-iife": "error", + "unicorn/no-useless-promise-resolve-reject": "error", + "unicorn/prefer-array-flat": "error", + "unicorn/prefer-array-some": "error", + "unicorn/prefer-blob-reading-methods": "error", + "unicorn/prefer-code-point": "error", + "unicorn/prefer-dom-node-dataset": "error", + "unicorn/prefer-dom-node-append": "error", + "unicorn/prefer-dom-node-remove": "error", + "unicorn/prefer-event-target": "error", + "unicorn/prefer-import-meta-properties": "error", + "unicorn/prefer-math-trunc": "error", + "unicorn/prefer-native-coercion-functions": "error", + "unicorn/prefer-query-selector": "error", + "unicorn/prefer-regexp-test": "error", + "unicorn/prefer-string-replace-all": "error", + "unicorn/prefer-string-slice": "error", + "unicorn/prefer-top-level-await": "error", + "unicorn/prefer-type-error": "error", + "unicorn/require-number-to-fixed-digits-argument": "error", + + // Import + "import/no-self-import": "error", + "import/no-named-as-default": "error", + "import/no-empty-named-blocks": "error", + "import/no-absolute-path": "error", + "import/no-cycle": "error", + + // Promise + "promise/no-promise-in-callback": "error", + "promise/no-multiple-resolved": "error", + "promise/always-return": "error", + "promise/no-new-statics": "error", + + // Node + "node/no-path-concat": "error", + "node/handle-callback-err": "error", + + // Vitest + "vitest/no-disabled-tests": "error", + "vitest/no-conditional-tests": "error", + "vitest/no-conditional-expect": "error", + "vitest/expect-expect": "error", + + // License Header + "license-header/header": [ + "error", + [ + "/**", + " * Copyright (c) Statsify", + " *", + " * This source code is licensed under the GNU GPL v3 license found in the", + " * LICENSE file in the root directory of this source tree.", + " * https://github.com/Statsify/statsify/blob/main/LICENSE", + " */", + ], + ], + }, +} diff --git a/.vscode/settings.json b/.vscode/settings.json index cfb9504fe..2a1f89365 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,8 @@ { - "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "editor.defaultFormatter": "oxc.oxc-vscode", "editor.tabSize": 2, "editor.formatOnSave": true, - "editor.codeActionsOnSave": [ - "source.fixAll.eslint" - ], + "editor.codeActionsOnSave": ["source.fixAll.oxc"], "typescript.tsdk": "node_modules/typescript/lib", "files.exclude": { // "**/dist/**": true, @@ -13,28 +11,20 @@ "**/.pnpm-store/**": true }, "[js][ts][tsx]": { - "editor.defaultFormatter": "dbaeumer.vscode-eslint" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[handlebars][json][jsonc][css][scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, - "i18n-ally.localesPaths": [ - "locales" - ], + "i18n-ally.localesPaths": ["locales"], "i18n-ally.sourceLanguage": "en-US", "i18n-ally.displayLanguage": "en-US", - "i18n-ally.ignoredLocales": [ - "en" - ], + "i18n-ally.ignoredLocales": ["en"], "i18n-ally.keystyle": "nested", "todo-tree.tree.scanMode": "workspace only", "testing.automaticallyOpenPeekView": "never", "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer" }, - "tailwindCSS.classAttributes": [ - "className", - "containerClass", - "contentClass" - ] -} \ No newline at end of file + "tailwindCSS.classAttributes": ["className", "containerClass", "contentClass"] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f4de247c4..71045f20a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,9 +4,7 @@ { "type": "shell", "command": "pnpm", - "args": [ - "build" - ], + "args": ["build"], "label": "build", "group": "build", "presentation": { @@ -23,9 +21,7 @@ { "type": "shell", "command": "pnpm", - "args": [ - "build:watch" - ], + "args": ["build:watch"], "label": "build:watch", "presentation": { "echo": true, @@ -42,37 +38,25 @@ { "type": "shell", "command": "pnpm", - "args": [ - "test" - ], + "args": ["test"], "label": "test", "group": "test", - "dependsOn": [ - "build" - ], + "dependsOn": ["build"], "detail": "Tests monorepo using turbo" }, { "type": "shell", "command": "pnpm", - "args": [ - "test:types" - ], - "label": "test:types", - "dependsOn": [ - "build" - ] + "args": ["typecheck"], + "label": "typecheck", + "dependsOn": ["build"] }, { "type": "shell", "command": "pnpm", - "args": [ - "test:coverage" - ], + "args": ["test:coverage"], "label": "test:coverage", - "dependsOn": [ - "build" - ], + "dependsOn": ["build"] } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 59846f0db..d1982a2aa 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ $ pnpm lint $ pnpm test # Type Testing -$ pnpm test:types +$ pnpm typecheck ``` ## 💁 Contributing diff --git a/apps/api/eslint.config.js b/apps/api/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/api/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/api/package.json b/apps/api/package.json index 122cae83f..81d7ec0c9 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@fastify/static": "^8.2.0", @@ -27,7 +28,7 @@ "@statsify/schemas": "workspace:^", "@statsify/skin-renderer": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "class-transformer": "0.5.1", "class-validator": "^0.14.1", @@ -38,11 +39,11 @@ "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "toad-scheduler": "^3.0.1" }, "devDependencies": { - "@nestjs/testing": "^11.1.6", + "@nestjs/testing": "^11.1.24", "@types/luxon": "^3.4.2" }, "imports": { @@ -99,4 +100,4 @@ "default": "./dist/redis/index.js" } } -} \ No newline at end of file +} diff --git a/apps/api/src/auth/auth.guard.ts b/apps/api/src/auth/auth.guard.ts index c85dbddb2..4581e2af5 100644 --- a/apps/api/src/auth/auth.guard.ts +++ b/apps/api/src/auth/auth.guard.ts @@ -35,7 +35,7 @@ export class AuthGuard implements CanActivate { const weight = this.reflector.get("auth-weight", handler); const role = this.reflector.get("auth-role", handler); - if (!weight || role == undefined) return true; + if (!weight || role === undefined) return true; const req = context.switchToHttp().getRequest(); diff --git a/apps/api/src/dtos/guild-leaderboard.dto.ts b/apps/api/src/dtos/guild-leaderboard.dto.ts index bdb8e5b5c..483977c3a 100644 --- a/apps/api/src/dtos/guild-leaderboard.dto.ts +++ b/apps/api/src/dtos/guild-leaderboard.dto.ts @@ -7,7 +7,7 @@ */ import { ApiProperty } from "@nestjs/swagger"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { IsEnum, IsInt, @@ -19,7 +19,7 @@ import { } from "class-validator"; import { Transform } from "class-transformer"; -const fields = LeaderboardScanner.getLeaderboardFields(Guild).map(([key]) => key); +const fields = getLeaderboardFields(Guild).map(([key]) => key); export class GuildLeaderboardDto { @IsEnum(fields) diff --git a/apps/api/src/dtos/guild-rankings.dto.ts b/apps/api/src/dtos/guild-rankings.dto.ts index bc287b5f8..bb3b8f798 100644 --- a/apps/api/src/dtos/guild-rankings.dto.ts +++ b/apps/api/src/dtos/guild-rankings.dto.ts @@ -7,10 +7,10 @@ */ import { ApiProperty } from "@nestjs/swagger"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { IsEnum, IsString, MaxLength, MinLength } from "class-validator"; -const fields = LeaderboardScanner.getLeaderboardFields(Guild).map(([key]) => key); +const fields = getLeaderboardFields(Guild).map(([key]) => key); export class GuildRankingDto { @ApiProperty({ enum: fields, type: [String] }) diff --git a/apps/api/src/dtos/player-leaderboard.dto.ts b/apps/api/src/dtos/player-leaderboard.dto.ts index 8b8706757..0e39b70ed 100644 --- a/apps/api/src/dtos/player-leaderboard.dto.ts +++ b/apps/api/src/dtos/player-leaderboard.dto.ts @@ -8,11 +8,11 @@ import { ApiProperty, PartialType } from "@nestjs/swagger"; import { IsEnum, IsInt, IsOptional, Min } from "class-validator"; -import { LeaderboardScanner, Player } from "@statsify/schemas"; +import { Player, getLeaderboardFields } from "@statsify/schemas"; import { PlayerDto } from "./player.dto.js"; import { Transform } from "class-transformer"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); export class PlayerLeaderboardDto extends PartialType(PlayerDto) { @IsEnum(fields) diff --git a/apps/api/src/dtos/player-rankings.dto.ts b/apps/api/src/dtos/player-rankings.dto.ts index 71058292d..8f29c9010 100644 --- a/apps/api/src/dtos/player-rankings.dto.ts +++ b/apps/api/src/dtos/player-rankings.dto.ts @@ -8,10 +8,10 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsEnum } from "class-validator"; -import { LeaderboardScanner, Player } from "@statsify/schemas"; +import { Player, getLeaderboardFields } from "@statsify/schemas"; import { UuidDto } from "./uuid.dto.js"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); export class PlayerRankingsDto extends UuidDto { @ApiProperty({ enum: fields, type: [String] }) diff --git a/apps/api/src/guild/guild.service.ts b/apps/api/src/guild/guild.service.ts index a13129c3d..e81e74686 100644 --- a/apps/api/src/guild/guild.service.ts +++ b/apps/api/src/guild/guild.service.ts @@ -39,7 +39,6 @@ export class GuildService { type: GuildQuery, cache: CacheLevel ): Promise { - // eslint-disable-next-line prefer-const let [cachedGuild, tag, displayName] = await this.getCachedGuild(inputtedTag, type); if (cachedGuild && this.hypixelService.shouldCache(cachedGuild.expiresAt, cache)) { @@ -94,16 +93,12 @@ export class GuildService { }; // Add all the days to the guild total exp history - Object.entries(combinedExpHistory) - .sort() - .toReversed() - .slice(0, 30) - .forEach(([day, exp], index) => { - member.expHistory[index] = exp; - member.expHistoryDays[index] = day; - guildExpHistory[day] = guildExpHistory[day] ? guildExpHistory[day] + exp : exp; - member.monthly += exp; - }); + for (const [index, [day, exp]] of Object.entries(combinedExpHistory).toSorted().toReversed().slice(0, 30).entries()) { + member.expHistory[index] = exp; + member.expHistoryDays[index] = day; + guildExpHistory[day] = guildExpHistory[day] ? guildExpHistory[day] + exp : exp; + member.monthly += exp; + } guild.questParticipation = guild.questParticipation + member.questParticipation; @@ -118,30 +113,26 @@ export class GuildService { .exec(); // Get scaled gexp - Object.entries(guildExpHistory) - .sort() - .toReversed() - .slice(0, 30) - .forEach(([day, exp], index) => { - const scaled = this.scaleGexp(exp); - - guild.expHistory[index] = exp; - guild.expHistoryDays[index] = day; - guild.scaledExpHistory[index] = scaled; - - if (index === 0) { - guild.daily = exp; - guild.scaledDaily = scaled; - } - - if (index < 7) { - guild.weekly += exp; - guild.scaledWeekly += scaled; - } - - guild.monthly += exp; - guild.scaledMonthly += scaled; - }); + for (const [index, [day, exp]] of Object.entries(guildExpHistory).toSorted().toReversed().slice(0, 30).entries()) { + const scaled = this.scaleGexp(exp); + + guild.expHistory[index] = exp; + guild.expHistoryDays[index] = day; + guild.scaledExpHistory[index] = scaled; + + if (index === 0) { + guild.daily = exp; + guild.scaledDaily = scaled; + } + + if (index < 7) { + guild.weekly += exp; + guild.scaledWeekly += scaled; + } + + guild.monthly += exp; + guild.scaledMonthly += scaled; + } // Cache guilds responses for 10 minutes guild.expiresAt = Date.now() + 600_000; diff --git a/apps/api/src/hypixel/hypixel.service.ts b/apps/api/src/hypixel/hypixel.service.ts index ce7398c04..426ad3e22 100644 --- a/apps/api/src/hypixel/hypixel.service.ts +++ b/apps/api/src/hypixel/hypixel.service.ts @@ -32,7 +32,7 @@ export class HypixelService { public shouldCache(expirey: number, cache: CacheLevel): boolean { return ( cache !== CacheLevel.LIVE && - (cache == CacheLevel.CACHE_ONLY || Date.now() < expirey) + (cache === CacheLevel.CACHE_ONLY || Date.now() < expirey) ); } diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 2451ba57c..bce208af1 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -22,7 +22,7 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { mkdir } from "node:fs/promises"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("api"); const handleError = logger.error.bind(logger); @@ -91,7 +91,7 @@ const redoc = new DocumentBuilder() // Fastify template renderer for Redoc app.setViewEngine({ engine: { handlebars }, - templates: join(__dirname, "..", "views"), + templates: join(directory, "..", "views"), }); const document = SwaggerModule.createDocument(app, redoc); diff --git a/apps/api/src/leaderboards/leaderboard.service.ts b/apps/api/src/leaderboards/leaderboard.service.ts index fd054864b..58a15af98 100644 --- a/apps/api/src/leaderboards/leaderboard.service.ts +++ b/apps/api/src/leaderboards/leaderboard.service.ts @@ -11,7 +11,7 @@ import { Constructor, Flatten } from "@statsify/util"; import { DateTime } from "luxon"; import { InjectRedis } from "#redis"; import { Injectable, InternalServerErrorException } from "@nestjs/common"; -import { LeaderboardEnabledMetadata, LeaderboardScanner } from "@statsify/schemas"; +import { type LeaderboardEnabledMetadata, getLeaderboardField, getLeaderboardFields } from "@statsify/schemas"; import { LeaderboardQuery } from "@statsify/api-client"; import { Redis } from "ioredis"; @@ -37,7 +37,7 @@ export abstract class LeaderboardService { idField: keyof T, remove = false ) { - const fields = LeaderboardScanner.getLeaderboardFields(constructor); + const fields = getLeaderboardFields(constructor); const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); const child = transaction?.startChild({ @@ -88,7 +88,7 @@ export abstract class LeaderboardService { sort, name, hidden, - } = LeaderboardScanner.getLeaderboardField( + } = getLeaderboardField( constructor, field ) as LeaderboardEnabledMetadata; @@ -128,11 +128,11 @@ export abstract class LeaderboardService { ); const additionalFieldMetadata = additionalFields.map((k) => - LeaderboardScanner.getLeaderboardField(constructor, k, false) + getLeaderboardField(constructor, k, false) ); const extraDisplayMetadata = extraDisplay ? - LeaderboardScanner.getLeaderboardField(constructor, extraDisplay, false) : + getLeaderboardField(constructor, extraDisplay, false) : undefined; const additionalStats = await this.getAdditionalStats( @@ -206,8 +206,8 @@ export abstract class LeaderboardService { const leaderboardFields: LeaderboardEnabledMetadata[] = []; - fields.forEach((field) => { - const metadata = LeaderboardScanner.getLeaderboardField(constructor, field); + for (const field of fields) { + const metadata = getLeaderboardField(constructor, field); leaderboardFields.push(metadata); const key = `${constructorName}.${field}`; @@ -219,7 +219,7 @@ export abstract class LeaderboardService { } else { pipeline.zrevrank(key, id); } - }); + } const responses = await pipeline.exec(); diff --git a/apps/api/src/player/player.controller.ts b/apps/api/src/player/player.controller.ts index 1d47e9524..552b8c0df 100644 --- a/apps/api/src/player/player.controller.ts +++ b/apps/api/src/player/player.controller.ts @@ -15,7 +15,12 @@ import { } from "@nestjs/swagger"; import { Auth, AuthRole } from "#auth"; import { Body, Controller, Delete, Get, Post, Query } from "@nestjs/common"; -import { CachedPlayerDto, PlayerDto, PlayerGroupDto, UpdatePlayerDto } from "#dtos"; +import { + CachedPlayerDto, + PlayerDto, + PlayerGroupDto, + UpdatePlayerDto, +} from "#dtos"; import { DeletePlayerResponse, ErrorResponse, @@ -72,7 +77,7 @@ export class PlayerController { const deleted = await this.playerService.delete(player); return { - success: !!deleted, + success: deleted, }; } diff --git a/apps/api/src/player/player.service.ts b/apps/api/src/player/player.service.ts index d2ee45b35..0d5ad6218 100644 --- a/apps/api/src/player/player.service.ts +++ b/apps/api/src/player/player.service.ts @@ -6,21 +6,27 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type APIData, type Circular, type Flatten, flatten } from "@statsify/util"; import { - CacheLevel, - StatusNotFoundException, -} from "@statsify/api-client"; + type APIData, + type Circular, + type Flatten, + flatten, +} from "@statsify/util"; +import { CacheLevel, StatusNotFoundException } from "@statsify/api-client"; import { HypixelService } from "#hypixel"; -import { Inject, Injectable, NotFoundException, forwardRef } from "@nestjs/common"; -import { InjectModel } from "@m8a/nestjs-typegoose"; import { - Player, - deserialize, - serialize, -} from "@statsify/schemas"; + Inject, + Injectable, + NotFoundException, + forwardRef, +} from "@nestjs/common"; +import { InjectModel } from "@m8a/nestjs-typegoose"; +import { Player, deserialize, serialize } from "@statsify/schemas"; import { PlayerLeaderboardService } from "./leaderboards/player-leaderboard.service.js"; -import { PlayerSearchService, RedisPlayer } from "./search/player-search.service.js"; +import { + PlayerSearchService, + RedisPlayer, +} from "./search/player-search.service.js"; import type { ReturnModelType } from "@typegoose/typegoose"; type PlayerModel = ReturnModelType; @@ -55,7 +61,9 @@ export class PlayerService { return deserialize(Player, mongoPlayer); } - const player = await this.hypixelService.getPlayer(mongoPlayer?.uuid ?? tag); + const player = await this.hypixelService.getPlayer( + mongoPlayer?.uuid ?? tag + ); if (player) { player.expiresAt = Date.now() + 120_000; @@ -137,13 +145,20 @@ export class PlayerService { public async delete(tag: string) { const player = await this.findMongoDocument(tag, {}); - if (!player) return null; + if (!player) return false; await Promise.all([ this.playerModel.deleteOne({ uuid: player.uuid }).exec(), this.playerSearchService.delete(player.username), - this.playerLeaderboardService.addLeaderboards(Player, player, "uuid", true), + this.playerLeaderboardService.addLeaderboards( + Player, + player, + "uuid", + true + ), ]); + + return true; } public async saveOne(player: Player, registerAutocomplete: boolean) { @@ -155,7 +170,12 @@ export class PlayerService { this.playerModel .replaceOne({ uuid: player.uuid }, serializedPlayer, { upsert: true }) .exec(), - this.playerLeaderboardService.addLeaderboards(Player, flatPlayer, "uuid", false), + this.playerLeaderboardService.addLeaderboards( + Player, + flatPlayer, + "uuid", + false + ), ]; if (registerAutocomplete) diff --git a/apps/api/src/skin/skin.service.ts b/apps/api/src/skin/skin.service.ts index b96b85cd3..36ef51cd1 100644 --- a/apps/api/src/skin/skin.service.ts +++ b/apps/api/src/skin/skin.service.ts @@ -7,7 +7,7 @@ */ import { HttpService } from "@nestjs/axios"; -import { type Image } from "skia-canvas"; +import type { Image } from "skia-canvas"; import { InjectModel } from "@m8a/nestjs-typegoose"; import { Injectable, InternalServerErrorException } from "@nestjs/common"; import { PlayerNotFoundException } from "@statsify/api-client"; diff --git a/apps/api/src/user/user.service.ts b/apps/api/src/user/user.service.ts index f5d8cbe02..aca63eb5e 100644 --- a/apps/api/src/user/user.service.ts +++ b/apps/api/src/user/user.service.ts @@ -25,12 +25,12 @@ export class UserService { ) {} public get(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); return this.userModel.findOne().where(type).equals(tag).lean().exec(); } public update(idOrUuid: string, user: Partial): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); return this.userModel .findOneAndUpdate({ [type]: tag }, { $set: flatten(user) }) @@ -39,7 +39,7 @@ export class UserService { } public async getBadge(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel.findOne().where(type).equals(tag).lean().exec(); if (!user) throw new NotFoundException("user"); @@ -47,7 +47,7 @@ export class UserService { let badgePath: string | undefined = undefined; if (user.hasBadge && User.isGold(user)) { - badgePath = this.getBadgePath(user.id); + badgePath = getBadgePath(user.id); } else if (user.tier) { badgePath = getLogoPath(user); } else if (user.uuid) { @@ -60,7 +60,7 @@ export class UserService { } public async updateBadge(idOrUuid: string, badge: Buffer): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel.findOne().where(type).equals(tag).lean().exec(); if (!user) throw new NotFoundException("user"); @@ -72,11 +72,11 @@ export class UserService { .lean() .exec(); - await writeFile(this.getBadgePath(user.id), badge); + await writeFile(getBadgePath(user.id), badge); } public async deleteBadge(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel .findOneAndUpdate({ hasBadge: false }) @@ -87,13 +87,16 @@ export class UserService { if (!user) throw new NotFoundException("user"); - await rm(this.getBadgePath(user.id)); + await rm(getBadgePath(user.id)); } - public async verifyUser(uuidOrCode: string, id: string): Promise { + public async verifyUser( + uuidOrCode: string, + id: string, + ): Promise { const uuid = uuidOrCode.length >= 32 ? - uuidOrCode.replace(/-/g, "") : + uuidOrCode.replaceAll("-", "") : await this.getUuidFromCode(uuidOrCode); // Unverify anyone previously linked to this UUID @@ -116,13 +119,13 @@ export class UserService { } public async unverifyUser(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel .findOneAndUpdate( { [type]: tag }, { $unset: { uuid: "" }, unverifiedAt: Date.now() }, - { new: true } + { new: true }, ) .lean() .exec(); @@ -142,15 +145,13 @@ export class UserService { return verifyCode.uuid; } +} - private parseTag(tag: string): [tag: string, type: string] { - tag = tag.replaceAll("-", ""); - const type = tag.length >= 32 ? "uuid" : "id"; +const parseTag = (tag: string): [tag: string, type: string] => { + const normalizedTag = tag.replaceAll("-", ""); + const type = normalizedTag.length >= 32 ? "uuid" : "id"; - return [tag, type]; - } + return [normalizedTag, type]; +}; - private getBadgePath(id: string) { - return `${mediaRoute}/badges/${id}.png`; - } -} +const getBadgePath = (id: string) => `${mediaRoute}/badges/${id}.png`; diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/discord-bot/eslint.config.js b/apps/discord-bot/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/discord-bot/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/discord-bot/package.json b/apps/discord-bot/package.json index e81f21f5b..7fb74f2e5 100644 --- a/apps/discord-bot/package.json +++ b/apps/discord-bot/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -20,7 +21,7 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "axios": "1.11.0", "discord-api-types": "^0.38.22", @@ -28,7 +29,7 @@ "luxon": "^3.5.0", "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "typedi": "^0.10.0" }, @@ -61,4 +62,4 @@ "default": "./dist/lib/*.js" } } -} \ No newline at end of file +} diff --git a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx index db404d1c4..0ef43ddd5 100644 --- a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx +++ b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type ArcadeModes, type Dropper, DropperMaps, MetadataScanner, type SubModeForMode } from "@statsify/schemas"; +import { type ArcadeModes, type Dropper, DropperMaps, type SubModeForMode, scanMetadata } from "@statsify/schemas"; import { Historical, If, Table } from "#components"; import { arrayGroup, formatRaceTime, formatTime } from "@statsify/util"; import type { LocalizeFunction } from "@statsify/discord"; @@ -46,7 +46,7 @@ export const DropperTable = ({ stats, submode, t, time }: DropperTableProps) => }; // This will return the leaderboard names for each dropper map, we only want the map names -const DROPPER_MAPS = MetadataScanner.scan(DropperMaps) +const DROPPER_MAPS = scanMetadata(DropperMaps) .filter(([key]) => key.endsWith(".bestTime")) .map(([key, metadata]) => [ key.replace(".bestTime", ""), diff --git a/apps/discord-bot/src/commands/base.hypixel-command.ts b/apps/discord-bot/src/commands/base.hypixel-command.ts index 5020e4ba6..3d32a4f2e 100644 --- a/apps/discord-bot/src/commands/base.hypixel-command.ts +++ b/apps/discord-bot/src/commands/base.hypixel-command.ts @@ -13,7 +13,7 @@ import { LocalizationString, LocalizeFunction, Page, - PaginateService, + paginate, PlayerArgument, SubPage, } from "@statsify/discord"; @@ -62,11 +62,9 @@ export interface BaseHypixelCommand { }) export abstract class BaseHypixelCommand { protected readonly apiService: ApiService; - protected readonly paginateService: PaginateService; public constructor(protected readonly modes: GameModes) { this.apiService = Container.get(ApiService); - this.paginateService = Container.get(PaginateService); } public async run(context: CommandContext) { @@ -159,7 +157,7 @@ export abstract class BaseHypixelCommand["api"], "overall">, MetadataEntry[]> = { - ARCADE: MetadataScanner.scan(ArcadeChallenges), - ARENA_BRAWL: MetadataScanner.scan(ArenaBrawlChallenges), - BEDWARS: MetadataScanner.scan(BedWarsChallenges), - BLITZSG: MetadataScanner.scan(BlitzSGChallenges), - BUILD_BATTLE: MetadataScanner.scan(BuildBattleChallenges), - COPS_AND_CRIMS: MetadataScanner.scan(CopsAndCrimsChallenges), - DUELS: MetadataScanner.scan(DuelsChallenges), - MEGAWALLS: MetadataScanner.scan(MegaWallsChallenges), - MURDER_MYSTERY: MetadataScanner.scan(MurderMysteryChallenges), - PAINTBALL: MetadataScanner.scan(PaintballChallenges), - QUAKE: MetadataScanner.scan(QuakeChallenges), - SKYWARS: MetadataScanner.scan(SkyWarsChallenges), - SMASH_HEROES: MetadataScanner.scan(SmashHeroesChallenges), - SPEED_UHC: MetadataScanner.scan(SpeedUHCChallenges), - TNT_GAMES: MetadataScanner.scan(TNTGamesChallenges), - TURBO_KART_RACERS: MetadataScanner.scan(TurboKartRacersChallenges), - UHC: MetadataScanner.scan(UHCChallenges), - VAMPIREZ: MetadataScanner.scan(VampireZChallenges), - WALLS: MetadataScanner.scan(WallsChallenges), - WARLORDS: MetadataScanner.scan(WarlordsChallenges), - WOOLGAMES: MetadataScanner.scan(WoolGamesChallenges), + ARCADE: scanMetadata(ArcadeChallenges), + ARENA_BRAWL: scanMetadata(ArenaBrawlChallenges), + BEDWARS: scanMetadata(BedWarsChallenges), + BLITZSG: scanMetadata(BlitzSGChallenges), + BUILD_BATTLE: scanMetadata(BuildBattleChallenges), + COPS_AND_CRIMS: scanMetadata(CopsAndCrimsChallenges), + DUELS: scanMetadata(DuelsChallenges), + MEGAWALLS: scanMetadata(MegaWallsChallenges), + MURDER_MYSTERY: scanMetadata(MurderMysteryChallenges), + PAINTBALL: scanMetadata(PaintballChallenges), + QUAKE: scanMetadata(QuakeChallenges), + SKYWARS: scanMetadata(SkyWarsChallenges), + SMASH_HEROES: scanMetadata(SmashHeroesChallenges), + SPEED_UHC: scanMetadata(SpeedUHCChallenges), + TNT_GAMES: scanMetadata(TNTGamesChallenges), + TURBO_KART_RACERS: scanMetadata(TurboKartRacersChallenges), + UHC: scanMetadata(UHCChallenges), + VAMPIREZ: scanMetadata(VampireZChallenges), + WALLS: scanMetadata(WallsChallenges), + WARLORDS: scanMetadata(WarlordsChallenges), + WOOLGAMES: scanMetadata(WoolGamesChallenges), }; const GameTable = ({ gameChallenges, mode, t }: GameTableProps) => { diff --git a/apps/discord-bot/src/commands/config/theme.command.tsx b/apps/discord-bot/src/commands/config/theme.command.tsx index b82730f68..59043bf3e 100644 --- a/apps/discord-bot/src/commands/config/theme.command.tsx +++ b/apps/discord-bot/src/commands/config/theme.command.tsx @@ -129,7 +129,7 @@ export class ThemeCommand { public message(context: CommandContext) { const message = convertColorCodes( context.option("message") - ).replace(/§\^\d\^/g, ""); + ).replaceAll(/§\^\d\^/g, ""); const length = removeFormatting(message).length; diff --git a/apps/discord-bot/src/commands/events/events.command.tsx b/apps/discord-bot/src/commands/events/events.command.tsx index 6f388cccc..a8af305f0 100644 --- a/apps/discord-bot/src/commands/events/events.command.tsx +++ b/apps/discord-bot/src/commands/events/events.command.tsx @@ -10,7 +10,7 @@ import { ApiService, Command, CommandContext, - PaginateService, + scrollingPagination, PlayerArgument, } from "@statsify/discord"; import { EVENT_TYPES, GENERAL_MODES } from "@statsify/schemas"; @@ -23,10 +23,7 @@ import { render } from "@statsify/rendering"; @Command({ description: (t) => t("commands.events"), args: [PlayerArgument] }) export class EventsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const user = context.getUser(); @@ -40,7 +37,7 @@ export class EventsCommand { this.apiService.getUserBadge(player.uuid), ]); - return this.paginateService.scrollingPagination( + return scrollingPagination( context, arrayGroup(EVENT_TYPES, 4).map((events) => async () => { const background = await getBackground( diff --git a/apps/discord-bot/src/commands/gamecounts.command.ts b/apps/discord-bot/src/commands/gamecounts.command.ts index e6dc06ab0..d72a13965 100644 --- a/apps/discord-bot/src/commands/gamecounts.command.ts +++ b/apps/discord-bot/src/commands/gamecounts.command.ts @@ -12,7 +12,7 @@ import { CommandContext, EmbedBuilder, Page, - PaginateService, + paginate, } from "@statsify/discord"; import { FormattedGame, GameId, GamePlayers } from "@statsify/schemas"; import { STATUS_COLORS } from "@statsify/logger"; @@ -23,10 +23,7 @@ import { removeFormatting } from "@statsify/util"; description: (t) => t("commands.game-counts"), }) export class GameCountsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const t = context.t(); @@ -87,7 +84,7 @@ export class GameCountsCommand { ...subGameGenerators, ]; - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private formatGameCount(name: string, count: string, emoji?: string) { diff --git a/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx b/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx index 5c1fe41ca..0a4a08d2b 100644 --- a/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx +++ b/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx @@ -18,7 +18,7 @@ export class GTBHelperCommand { const hint = context.option("hint"); const words = findSolutions(hint); - if (!words.length) { + if (words.length === 0) { throw new ErrorMessage( (t) => t("errors.noGTBSolutions.title"), (t) => t("errors.noGTBSolutions.description") @@ -31,9 +31,9 @@ export class GTBHelperCommand { const groups = arrayGroup(words, Math.ceil(words.length / 3)); - groups.forEach((solutions) => - embed.field("\u200b", solutions.map((s) => `\`•\` ${s}`).join("\n"), true) - ); + for (const solutions of groups) { + embed.field("\u200b", solutions.map((s) => `\`•\` ${s}`).join("\n"), true); + } return { embeds: [embed] }; } diff --git a/apps/discord-bot/src/commands/guild/guild-list.profile.tsx b/apps/discord-bot/src/commands/guild/guild-list.profile.tsx index 3e8574ceb..011812b8d 100644 --- a/apps/discord-bot/src/commands/guild/guild-list.profile.tsx +++ b/apps/discord-bot/src/commands/guild/guild-list.profile.tsx @@ -39,10 +39,10 @@ export const GuildListProfile = ({ // Hypixel does not always return all the ranks in `guild.ranks` so a special rank map is needed const rankMap: Record = {}; - guild.members.forEach((member) => { + for (const member of guild.members) { rankMap[member.rank] = rankMap[member.rank] ?? []; rankMap[member.rank].push(member.displayName ?? "ERROR"); - }); + } // A map of the all the ranks in the guild const guildRankMap = guild.ranks.reduce((acc, rank) => { diff --git a/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx b/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx index 7f11d5231..0a6056772 100644 --- a/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx +++ b/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx @@ -80,14 +80,14 @@ export class GuildTopSubCommand extends GuildLeaderboardSubCommand { const dropdown = new SelectMenuBuilder(); - modes.forEach(([key, title], index) => + for (const [index, [key, title]] of modes.entries()) { dropdown.option( new SelectMenuOptionBuilder() .label(title) .value(`${key}`) .default(index === 0) - ) - ); + ); + } const components = [new ActionRowBuilder().component(dropdown)]; @@ -146,7 +146,7 @@ export class GuildTopSubCommand extends GuildLeaderboardSubCommand { dropdown.getCustomId(), changePage((interaction) => { const value = interaction.getData().values[0] as GuildTopKey; - return { modeIndex: modes.findIndex((m) => m[0] == value) }; + return { modeIndex: modes.findIndex((m) => m[0] === value) }; }) ); diff --git a/apps/discord-bot/src/commands/guild/guild.command.tsx b/apps/discord-bot/src/commands/guild/guild.command.tsx index 119fd19c0..fa6b39fed 100644 --- a/apps/discord-bot/src/commands/guild/guild.command.tsx +++ b/apps/discord-bot/src/commands/guild/guild.command.tsx @@ -13,7 +13,7 @@ import { ErrorMessage, GuildArgument, IMessage, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -29,10 +29,7 @@ import { render } from "@statsify/rendering"; @Command({ description: (t) => t("commands.guild") }) export class GuildCommand extends GuildTopSubCommand { - public constructor( - protected readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) { + public constructor(protected readonly apiService: ApiService,) { super(apiService); } @@ -69,7 +66,7 @@ export class GuildCommand extends GuildTopSubCommand { gameIcons, }; - return this.paginateService.paginate(context, [ + return paginate(context, [ { label: "Overall", generator: () => diff --git a/apps/discord-bot/src/commands/historical/session.command.tsx b/apps/discord-bot/src/commands/historical/session.command.tsx index c4e23aaaa..9d69cbd76 100644 --- a/apps/discord-bot/src/commands/historical/session.command.tsx +++ b/apps/discord-bot/src/commands/historical/session.command.tsx @@ -44,7 +44,7 @@ import { CommandContext, EmbedBuilder, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, SubPage, @@ -88,10 +88,7 @@ import type { HistoricalTimeData } from "#components"; @Command({ description: "session stats" }) export class SessionCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.session-arcade"), args: [PlayerArgument] }) public arcade(context: CommandContext) { @@ -478,6 +475,6 @@ export class SessionCommand { }; }); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } } diff --git a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts index 4ad5179ae..bdcf57ed7 100644 --- a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts +++ b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts @@ -12,10 +12,10 @@ import { ApplicationCommandOptionType, } from "discord-api-types/v10"; import { AbstractArgument, CommandContext, LocalizationString } from "@statsify/discord"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { removeFormatting } from "@statsify/util"; -const list = LeaderboardScanner.getLeaderboardFields(Guild).map( +const list = getLeaderboardFields(Guild).map( ([key, { leaderboard }]) => ({ value: key, name: removeFormatting(leaderboard.name), diff --git a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts index 8feccd180..b45f58c4e 100644 --- a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts +++ b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts @@ -25,7 +25,7 @@ export class GuildLeaderboardSubCommand extends BaseLeaderboardCommand { public async leaderboard(context: CommandContext) { const leaderboard = context.option("leaderboard"); - const field = leaderboard.replace(/ /g, "."); + const field = leaderboard.replaceAll(' ', "."); const background = await getBackground("hypixel", "overall"); return this.createLeaderboard({ diff --git a/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts b/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts index a6c2e730e..789608b36 100644 --- a/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts +++ b/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts @@ -14,9 +14,9 @@ import { import { AbstractArgument, CommandContext, LocalizationString } from "@statsify/discord"; import { ClassMetadata, - LeaderboardScanner, METADATA_KEY, PlayerStats, + getLeaderboardFields, } from "@statsify/schemas"; import { removeFormatting } from "@statsify/util"; @@ -34,13 +34,14 @@ const FUSE_OPTIONS = { }; const fields = entries.reduce((acc, [prefix, value]) => { - const list = LeaderboardScanner.getLeaderboardFields(value.type.type).map( + const list = getLeaderboardFields(value.type.type).map( ([key, { leaderboard }]) => ({ value: key, name: removeFormatting(leaderboard.name) }) ); const fuse = new Fuse(list, FUSE_OPTIONS); + acc[prefix as keyof PlayerStats] = [fuse, list]; - return { ...acc, [prefix]: [fuse, list] }; + return acc; }, {} as Record, APIApplicationCommandOptionChoice[]]>); export class PlayerLeaderboardArgument extends AbstractArgument { diff --git a/apps/discord-bot/src/commands/minecraft/cape.command.ts b/apps/discord-bot/src/commands/minecraft/cape.command.ts index 52204e542..501e9ca71 100644 --- a/apps/discord-bot/src/commands/minecraft/cape.command.ts +++ b/apps/discord-bot/src/commands/minecraft/cape.command.ts @@ -12,7 +12,7 @@ import { CommandContext, ErrorMessage, MojangPlayerArgument, - PaginateService, + paginate } from "@statsify/discord"; import { Image, loadImage } from "skia-canvas"; import { createCanvas } from "@statsify/rendering"; @@ -20,10 +20,7 @@ import type { Skin } from "@statsify/schemas"; @Command({ description: (t) => t("commands.cape"), args: [MojangPlayerArgument] }) export class CapeCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const user = context.getUser(); @@ -45,13 +42,13 @@ export class CapeCommand { generator: () => this.renderCape(c.image as Image), })); - if (!pages.length) + if (pages.length === 0) return new ErrorMessage( (t) => t("errors.noCape.title"), (t) => t("errors.noCape.description", { username: player.username }) ); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private async getOptifineCape(username: string) { diff --git a/apps/discord-bot/src/commands/minecraft/colors.command.ts b/apps/discord-bot/src/commands/minecraft/colors.command.ts index c7fdb6836..c8bf5de6a 100644 --- a/apps/discord-bot/src/commands/minecraft/colors.command.ts +++ b/apps/discord-bot/src/commands/minecraft/colors.command.ts @@ -21,11 +21,11 @@ export class ColorsCommand { "embeds.colors.shadowHex" )}**\n`; - minecraftColors.forEach((color) => { + for (const color of minecraftColors) { desc += `${t(`emojis:colors.${[color.code.slice(1)]}`)} \`${color.code}\` • \`${ color.hex }\` • \`${mcShadow(color.hex)}\`\n`; - }); + } desc += "\n"; desc += `${t("emojis:colors.k")} \`§k\` • ${t("embeds.colors.obfuscated")}\n`; diff --git a/apps/discord-bot/src/commands/minecraft/server/server.argument.ts b/apps/discord-bot/src/commands/minecraft/server/server.argument.ts index 62ad196b9..7aec94027 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.argument.ts +++ b/apps/discord-bot/src/commands/minecraft/server/server.argument.ts @@ -38,6 +38,8 @@ export class ServerArgument extends AbstractArgument { threshold: 0.3, ignoreLocation: true, }); + + return undefined; }); } diff --git a/apps/discord-bot/src/commands/minecraft/server/server.command.tsx b/apps/discord-bot/src/commands/minecraft/server/server.command.tsx index e33ef3743..af4fca612 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.command.tsx +++ b/apps/discord-bot/src/commands/minecraft/server/server.command.tsx @@ -30,6 +30,7 @@ export class ServerCommand { getServerMappings().then((mappings) => { this.mappings = mappings; + return undefined; }); } diff --git a/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx b/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx index 525bd366f..92d4a1756 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx +++ b/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx @@ -49,7 +49,7 @@ export const ServerProfile = ({ >
- {server.motd.raw.map((m) => m.replace(/\s{2,}/g, "")).join("\n")} + {server.motd.raw.map((m) => m.replaceAll(/\s{2,}/g, "")).join("\n")}
diff --git a/apps/discord-bot/src/commands/quests/quests.command.tsx b/apps/discord-bot/src/commands/quests/quests.command.tsx index 9dc277bc1..3d640798d 100644 --- a/apps/discord-bot/src/commands/quests/quests.command.tsx +++ b/apps/discord-bot/src/commands/quests/quests.command.tsx @@ -11,7 +11,7 @@ import { Command, CommandContext, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -26,10 +26,7 @@ import { render } from "@statsify/rendering"; export class QuestsCommand { private readonly modes = QUEST_MODES; - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.quests-overall"), @@ -85,7 +82,7 @@ export class QuestsCommand { let modes = this.modes.getModes(); // Currently only SkyWars has a monthly quest so it is useless to show other modes - if (time == QuestTime.Monthly) { + if (time === QuestTime.Monthly) { // Filter for objects with more than 1 field (the total field) modes = modes.filter((mode) => mode.api === "overall" || Object.entries(quests.monthly[mode.api]).length > 1); } @@ -115,6 +112,6 @@ export class QuestsCommand { }, })); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } } diff --git a/apps/discord-bot/src/commands/quests/quests.profile.tsx b/apps/discord-bot/src/commands/quests/quests.profile.tsx index a94762f72..961f59484 100644 --- a/apps/discord-bot/src/commands/quests/quests.profile.tsx +++ b/apps/discord-bot/src/commands/quests/quests.profile.tsx @@ -16,13 +16,13 @@ import { GameQuests, GenericQuestInstance, METADATA_KEY, - MetadataScanner, OverallQuests, QuestModes, QuestTime, User, UserPalette, WeeklyQuests, + scanMetadata, } from "@statsify/schemas"; import { Container, @@ -49,7 +49,7 @@ function getQuestMetadata(constructor: Constructor) { const metadata = entries.map(([key, data]) => [ key, - Object.fromEntries(MetadataScanner.scan(data.type.type)), + Object.fromEntries(scanMetadata(data.type.type)), ]); return Object.fromEntries(metadata); diff --git a/apps/discord-bot/src/commands/rankings/rankings.command.tsx b/apps/discord-bot/src/commands/rankings/rankings.command.tsx index 2aa88ac6f..15966236e 100644 --- a/apps/discord-bot/src/commands/rankings/rankings.command.tsx +++ b/apps/discord-bot/src/commands/rankings/rankings.command.tsx @@ -17,7 +17,6 @@ import { DUELS_MODES, GENERAL_MODES, GameModes, - LeaderboardScanner, MEGAWALLS_MODES, MURDER_MYSTERY_MODES, PAINTBALL_MODES, @@ -38,6 +37,7 @@ import { WALLS_MODES, WARLORDS_MODES, WOOLGAMES_MODES, + getLeaderboardFields, } from "@statsify/schemas"; import { ApiService, @@ -46,7 +46,7 @@ import { Command, CommandContext, ErrorMessage, - PaginateService, + scrollingPagination, PlayerArgument, SubCommand, type SubCommandOptions, @@ -60,7 +60,7 @@ import { getBackground, getLogo } from "@statsify/assets"; import { getTheme } from "#themes"; import { render } from "@statsify/rendering"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); const choices = games.map((g) => [g.name, g.key] as Choice); choices.unshift(["All", "all"]); @@ -77,10 +77,7 @@ const options: Partial = { preview: "rankings.png", }) export class RankingsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ ...options, @@ -322,7 +319,7 @@ export class RankingsCommand { const rankings = await this.apiService.getPlayerRankings(filteredFields, player.uuid); - if (!rankings.length) + if (rankings.length === 0) throw new ErrorMessage( (t) => t("errors.noRankings.title"), (t) => @@ -347,7 +344,7 @@ export class RankingsCommand { games.find((g) => g.key === game)?.formatted : undefined; - return this.paginateService.scrollingPagination( + return scrollingPagination( context, groups.map( (group) => () => diff --git a/apps/discord-bot/src/commands/ratios/ratios.command.tsx b/apps/discord-bot/src/commands/ratios/ratios.command.tsx index bdd522891..854c04db9 100644 --- a/apps/discord-bot/src/commands/ratios/ratios.command.tsx +++ b/apps/discord-bot/src/commands/ratios/ratios.command.tsx @@ -39,7 +39,7 @@ import { Command, CommandContext, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -59,10 +59,7 @@ const args = [PlayerArgument]; @Command({ description: (t) => t("commands.ratios") }) export class RatiosCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.ratios-arcade"), args }) public arcade(context: CommandContext) { @@ -244,11 +241,11 @@ export class RatiosCommand { }, })); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private getModeStats(game: PlayerStats[keyof PlayerStats], mode: GameModeWithSubModes) { - if (mode.submodes.length !== 0) { + if (mode.submodes.length > 0) { let stats = game[mode.api as keyof typeof game]; stats = stats[mode.submodes[0].api as keyof typeof game]; return mode.submodes[0].api === "overall" ? stats || game : stats; @@ -289,7 +286,7 @@ export class RatiosCommand { return numeratorType === Number && denominatorType === Number; }); - if (!ratios.length) continue; + if (ratios.length === 0) continue; ratioModes.push([mode, ratios]); } diff --git a/apps/discord-bot/src/components/Header/Header.tsx b/apps/discord-bot/src/components/Header/Header.tsx index cf07c8570..86e14b43c 100644 --- a/apps/discord-bot/src/components/Header/Header.tsx +++ b/apps/discord-bot/src/components/Header/Header.tsx @@ -53,7 +53,7 @@ export const Header = (props: HeaderProps) => { const sidebar = "sidebar" in props && - props.sidebar.length && + props.sidebar.length > 0 && (props.time === "LIVE" ? true : props.historicalSidebar) ? : <>; diff --git a/apps/discord-bot/src/components/List.tsx b/apps/discord-bot/src/components/List.tsx index 947132ff1..a20b4adc3 100644 --- a/apps/discord-bot/src/components/List.tsx +++ b/apps/discord-bot/src/components/List.tsx @@ -16,14 +16,14 @@ export const List = ({ width = "100%", items }: ListProps) => { const remainingColumns: number[] = []; for (const [i, item] of items.entries()) { - (item as unknown as JSX.Element[]).forEach((child, index) => { + for (const [index, child] of (item as unknown as JSX.Element[]).entries()) { if (i === 0 && child.x.size === "remaining") remainingColumns.push(index); child.x.size = "100%"; if (columns[index]) columns[index].push(child); else columns[index] = [child]; - }); + } } return ( diff --git a/apps/discord-bot/src/index.ts b/apps/discord-bot/src/index.ts index d899f2006..49f54df9f 100644 --- a/apps/discord-bot/src/index.ts +++ b/apps/discord-bot/src/index.ts @@ -8,7 +8,7 @@ import * as Sentry from "@sentry/node"; import { CommandListener } from "#lib/command.listener"; -import { CommandLoader, CommandPoster, I18nLoaderService } from "@statsify/discord"; +import { CommandPoster, I18nLoaderService, loadCommands } from "@statsify/discord"; import { Container } from "typedi"; import { FontLoaderService } from "#services"; import { InteractionServer, RestClient, WebsocketShard } from "tiny-discord"; @@ -18,7 +18,7 @@ import { config } from "@statsify/util"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("discord-bot"); const handleError = logger.error.bind(logger); @@ -45,7 +45,7 @@ await Promise.all( const rest = new RestClient({ token: await config("discordBot.token"), timeout: 60 * 1000 }); Container.set(RestClient, rest); -const commands = await CommandLoader.load(join(__dirname, "./commands")); +const commands = await loadCommands(join(directory, "./commands")); const poster = Container.get(CommandPoster); diff --git a/apps/discord-bot/src/lib/command.listener.ts b/apps/discord-bot/src/lib/command.listener.ts index b75a71e1a..d42bbf4f6 100644 --- a/apps/discord-bot/src/lib/command.listener.ts +++ b/apps/discord-bot/src/lib/command.listener.ts @@ -127,8 +127,7 @@ export class CommandListener extends AbstractCommandListener { const newCooldown = now + command.cooldown * 1000 * reduction; if (!cooldownForCommand) { - const cooldownForCommand = new Map(); - cooldownForCommand.set(userId, newCooldown); + const cooldownForCommand = new Map([[userId, newCooldown]]); this.cooldowns.set(command.name, cooldownForCommand); return; @@ -168,7 +167,7 @@ export class CommandListener extends AbstractCommandListener { (t) => !t.disabled?.includes(commandName) && !t.uneligible?.(user) ); - if (!useableTips.length) return undefined; + if (useableTips.length === 0) return undefined; const tip = useableTips[Math.floor(Math.random() * useableTips.length)]; return tip.message; diff --git a/apps/discord-bot/src/lib/convert-color-codes.ts b/apps/discord-bot/src/lib/convert-color-codes.ts index 46cc58f35..42cc5ec74 100644 --- a/apps/discord-bot/src/lib/convert-color-codes.ts +++ b/apps/discord-bot/src/lib/convert-color-codes.ts @@ -8,6 +8,6 @@ export const convertColorCodes = (content: string) => content .replaceAll(String.raw`\&`, "󰀀") - .replace(/&\S/g, (m) => m.replace("&", "§")) + .replaceAll(/&\S/g, (m) => m.replace("&", "§")) .replaceAll("󰀀", "&"); diff --git a/apps/discord-bot/tsconfig.json b/apps/discord-bot/tsconfig.json index 10c536c56..558014558 100644 --- a/apps/discord-bot/tsconfig.json +++ b/apps/discord-bot/tsconfig.json @@ -1,11 +1,7 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "jsx": "preserve", - "baseUrl": "./src", + "jsx": "preserve" }, - "include": [ - "src", - "eslint.config.js" - ] -} \ No newline at end of file + "include": ["src"] +} diff --git a/apps/scripts/eslint.config.js b/apps/scripts/eslint.config.js deleted file mode 100644 index 8e6c07b81..000000000 --- a/apps/scripts/eslint.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import globals from "globals"; -import { defineConfig } from "../../eslint.config.js"; - -export default [ - { languageOptions: { globals: globals.node } }, - ...defineConfig({ tsconfigDirName: import.meta.dirname }), -]; diff --git a/apps/scripts/package.json b/apps/scripts/package.json index d883f2577..8315ef054 100644 --- a/apps/scripts/package.json +++ b/apps/scripts/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "lint": "eslint", + "lint": "oxlint", + "lint:ci": "oxlint --format=github", "api-key": "node src/api-key.js", "delete-sessions": "node src/delete-sessions.js", "limit-redis": "node src/limit-redis.js", @@ -20,19 +21,17 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/core": "^1.13.5", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "chalk": "^5.6.0", "discord-bot": "workspace:^", "inquirer": "^10.1.8", "ioredis": "^5.7.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "toad-scheduler": "^3.0.1", "zod": "^4.1.5" }, "devDependencies": { - "@types/inquirer": "^9.0.7", - "globals": "^16.3.0" + "@types/inquirer": "^9.0.7" } -} \ No newline at end of file +} diff --git a/apps/scripts/src/api-key.js b/apps/scripts/src/api-key.js index 12f6ae367..e9bf2f39c 100644 --- a/apps/scripts/src/api-key.js +++ b/apps/scripts/src/api-key.js @@ -50,9 +50,9 @@ const getKeys = async () => { const pipeline = redis.pipeline(); - keys.forEach((key) => { + for (const key of keys) { pipeline.hgetall(key); - }); + } const keyValues = await pipeline.exec(); @@ -104,7 +104,7 @@ const keyManager = async () => { const availableMethods = ["create"]; - if ((await getKeyNames()).length) availableMethods.push("delete", "edit", "list"); + if ((await getKeyNames()).length > 0) availableMethods.push("delete", "edit", "list"); const { method } = await inquirer.prompt([ { @@ -194,6 +194,7 @@ const deleteKey = async () => { let currentKey = activeKeys[key]; if (currentKey.name === deletedKey) { + // oxlint-disable-next-line no-await-in-loop await redis.del(`key:${key}`); inquirerLogger( "Deleted Key!", @@ -263,4 +264,4 @@ const editKey = async () => { await redis.hset(`key:${currentHash}`, field, Object.values(newValue)[0]); }; -keyManager(); +await keyManager(); diff --git a/apps/scripts/src/limit-redis.js b/apps/scripts/src/limit-redis.js index ffe35f1df..6919d3212 100644 --- a/apps/scripts/src/limit-redis.js +++ b/apps/scripts/src/limit-redis.js @@ -8,7 +8,7 @@ import Redis from "ioredis"; import { CurrentHistoricalType } from "@statsify/api-client"; -import { Guild, MetadataScanner, Player } from "@statsify/schemas"; +import { Guild, scanMetadata, Player } from "@statsify/schemas"; import { Logger } from "@statsify/logger"; import { SimpleIntervalJob, Task } from "toad-scheduler"; @@ -16,19 +16,20 @@ const logger = new Logger("Redis Limiter"); const redis = new Redis(process.env.REDIS_URL); const runLimit = async (constructors, prefixes) => { - constructors.forEach(async (constructor, i) => { + for (const [i, constructor] of constructors.entries()) { const oldLeaderboardPipeline = redis.pipeline(); const limitLeaderboardPipeline = redis.pipeline(); const name = constructor.name.toLowerCase(); - const fields = MetadataScanner.scan(constructor); + const fields = scanMetadata(constructor); - fields.forEach(([key, value]) => { + for (const [key, value] of fields) { const path = prefixes ? `${prefixes[i]}:${name}.${key}` : `${name}.${key}`; if (!value.leaderboard.enabled || (prefixes ? !value.historical.enabled : false)) oldLeaderboardPipeline.del(path); - }); + } + // oxlint-disable-next-line no-await-in-loop await oldLeaderboardPipeline.exec(); const leaderboards = prefixes ? @@ -37,11 +38,11 @@ const runLimit = async (constructors, prefixes) => { let memberCount = 0; - leaderboards.forEach(([key, value]) => { + for (const [key, value] of leaderboards) { const path = `${name}.${key}`; const { sort } = value.leaderboard; let { limit } = value.leaderboard; - if (limit === Number.POSITIVE_INFINITY) return; + if (limit === Number.POSITIVE_INFINITY) continue; // Reduce historical leaderboard max size if (prefixes) limit = Math.floor(limit / 10); @@ -53,8 +54,9 @@ const runLimit = async (constructors, prefixes) => { } else { limitLeaderboardPipeline.zremrangebyrank(path, limit, -1); } - }); + } + // oxlint-disable-next-line no-await-in-loop await limitLeaderboardPipeline.exec(); logger.log(`Limited ${leaderboards.length} ${name} leaderboards`); @@ -63,8 +65,8 @@ const runLimit = async (constructors, prefixes) => { prefixes ? prefixes[i].toLowerCase() : "lifetime" } ${name} leaderboards` ); - }); -}; + } +} const limit = async () => { await Promise.all([ diff --git a/apps/scripts/src/purge.js b/apps/scripts/src/purge.js index c95bd6e4e..caa6bfa4d 100644 --- a/apps/scripts/src/purge.js +++ b/apps/scripts/src/purge.js @@ -9,13 +9,11 @@ import inquirer from "inquirer"; import { ROOT, fetchWorkspaces, inquirerConfirmation, inquirerLogger } from "./utils.js"; import { exec as _exec } from "node:child_process"; -import { dirname, join, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join, resolve } from "node:path"; import { promisify } from "node:util"; import { rm } from "node:fs/promises"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +const dirname = import.meta.dirname; /** * @@ -25,7 +23,7 @@ const exec = (script) => promisify(_exec)(script, { shell: true, stdio: "inherit", - cwd: resolve(__dirname, "../../../"), + cwd: resolve(dirname, "../../../"), }); const workspaces = [ @@ -124,4 +122,4 @@ const purge = async () => { process.exit(0); }; -purge(); +await purge(); diff --git a/apps/scripts/src/rank-emojis.js b/apps/scripts/src/rank-emojis.js index 79b8707b4..5147fc6c7 100644 --- a/apps/scripts/src/rank-emojis.js +++ b/apps/scripts/src/rank-emojis.js @@ -79,14 +79,12 @@ const drawRank = async (formatted) => { renderer.fillText(textCtx, nodes, 0, 0); const imageCount = Math.ceil(width / SIZE); - const images = []; - - for (let x = 0; x < imageCount; x++) { + const images = await Promise.all(Array.from({ length: imageCount }).map((_, x) => { const canvas = createCanvas(SIZE, SIZE); const ctx = canvas.getContext("2d"); ctx.drawImage(textCanvas, SIZE * x, 0, SIZE, SIZE, 0, 0, SIZE, SIZE); - images.push(await canvas.toDataURL("png")); - } + return canvas.toDataURL("png"); + })); return images; }; @@ -116,7 +114,7 @@ const drawColorChanger = async (rank, prefixIndex) => { )), ]; - Object.entries(sharedImages).forEach(([index, image]) => { + for (const [index, image] of Object.entries(sharedImages).entries()) { emojis.push({ buffer: image, rank, @@ -124,9 +122,9 @@ const drawColorChanger = async (rank, prefixIndex) => { index, name: `${prefixIndex}${index}`, }); - }); + } - coloredEmojis.forEach(async (images, index) => { + for (const [index, images] of coloredEmojis) { const color = minecraftColors[index]; for (const [i, image] of images.entries()) { @@ -140,7 +138,7 @@ const drawColorChanger = async (rank, prefixIndex) => { name: `${prefixIndex}${color.code[1]}${i}`, }); } - }); + } }; /** @@ -151,9 +149,9 @@ const drawColorChanger = async (rank, prefixIndex) => { const drawNonColorChanger = async (rank, prefixIndex) => { const images = await drawRank(rankMap[rank]()); - images.forEach((image, index) => { + for (const [index, image] of images.entries()) { emojis.push({ buffer: image, rank, index, name: `${prefixIndex}${index}` }); - }); + } }; // Create all the emojis @@ -175,13 +173,16 @@ const json = {}; const client = new RestClient({ token }); +// For ratelimiting purposes it is better to run these requests serially for (let i = 0; i < serverCount; i++) { + // oxlint-disable-next-line no-await-in-loop const guild = await client .post("/guilds", { name: `Statsify Ranks ${i + 1}` }) .then((res) => res.body.json); const channel = guild.system_channel_id; + // oxlint-disable-next-line no-await-in-loop const invite = await client .post(`/channels/${channel}/invites`, { type: 1 }) .then((res) => res.body.json); @@ -194,6 +195,7 @@ for (let i = 0; i < serverCount; i++) { const emoji = emojis[index]; + // oxlint-disable-next-line no-await-in-loop const emojiResolved = await client .post(`/guilds/${guild.id}/emojis`, { name: emoji.name, @@ -217,12 +219,12 @@ for (let i = 0; i < serverCount; i++) { } } -RANKS.filter((rank) => !COLOR_CHANGERS.includes(rank)).forEach((rank) => { +for (const rank of RANKS.filter((rank) => !COLOR_CHANGERS.includes(rank))) { json[rank] = json[rank].join(""); -}); +} -COLOR_CHANGERS.forEach((rank) => { - minecraftColors.forEach((color) => { +for (const rank of COLOR_CHANGERS) { + for (const color of minecraftColors) { const body = { ...json[rank]["SHARED"], ...json[rank][color.id], @@ -233,10 +235,10 @@ COLOR_CHANGERS.forEach((rank) => { .map((key) => body[key]) .filter(Boolean) .join(""); - }); + } - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + // oxlint-disable-next-line no-dynamic-delete delete json[rank]; -}); +} writeFileSync("../discord-bot/emojis.json", JSON.stringify(json, null, 2)); diff --git a/apps/scripts/src/timestamp.js b/apps/scripts/src/timestamp.js index 7c337d73c..f0c419016 100644 --- a/apps/scripts/src/timestamp.js +++ b/apps/scripts/src/timestamp.js @@ -70,25 +70,28 @@ const setTimestamps = async (collectionName) => { const bulkOperations = []; - players.forEach((pm) => { - const nextReset = getNextResetTime(pm.resetMinute, collectionName); - const lastReset = getLastResetTime(pm.resetMinute, collectionName); + for (const player of players) { + const nextReset = getNextResetTime(player.resetMinute, collectionName); + const lastReset = getLastResetTime(player.resetMinute, collectionName); bulkOperations.push({ updateOne: { - filter: { _id: pm._id }, + // mongodb object id's have a leading underscore + // oxlint-disable-next-line no-underscore-dangle + filter: { _id: player._id }, update: { $set: { nextReset, lastReset } }, }, }); - }); + } - if (!bulkOperations.length) + if (bulkOperations.length === 0) return console.log(`No players to update for ${collectionName}.`); - collection.bulkWrite(bulkOperations).then((res) => { - console.log( - `Updated ${res.modifiedCount}/${players.length} players for ${collectionName}.` - ); - }); + + const repsonse = await collection.bulkWrite(bulkOperations); + + console.log( + `Updated ${repsonse.modifiedCount}/${players.length} players for ${collectionName}.` + ); }; await setTimestamps("daily"); diff --git a/apps/scripts/src/validate-commands.js b/apps/scripts/src/validate-commands.js index 21ff23bc1..19d7c097c 100644 --- a/apps/scripts/src/validate-commands.js +++ b/apps/scripts/src/validate-commands.js @@ -52,20 +52,22 @@ const commandSchema = z.object({ type: z.optional(toEnum(1, 2, 3)), }); -Object.entries(commands.commands).forEach(([commandName, command]) => { +for (const [commandName, command] of Object.entries(commands.commands)) { try { commandSchema.parse(command); } catch (e) { console.error(e); console.log(command); - e.errors.forEach((e) => { - console.error(e.message); - console.error(`${command.name}.${e.path.join(".")}`); - }); + + for (const error of e.errors) { + console.error(error.message); + console.error(`${command.name}.${error.path.join(".")}`); + } + console.error(`Command "${commandName}" is invalid.`); process.exit(1); } -}); +} const commandChars = {}; diff --git a/apps/scripts/tsconfig.json b/apps/scripts/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/scripts/tsconfig.json +++ b/apps/scripts/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/site/.oxlintrc.jsonc b/apps/site/.oxlintrc.jsonc new file mode 100644 index 000000000..6d2bfedd8 --- /dev/null +++ b/apps/site/.oxlintrc.jsonc @@ -0,0 +1,72 @@ +{ + "$schema": "../../node_modules/oxlint/configuration_schema.json", + "extends": ["../../.oxlintrc.jsonc"], + "plugins": [ + "eslint", + "typescript", + "unicorn", + "oxc", + "import", + "node", + "promise", + "vitest", + "react", + "react-perf", + "jsx-a11y", + "nextjs", + ], + "rules": { + // React + "react/no-unstable-nested-components": "error", + "react/jsx-no-script-url": "error", + "react/jsx-no-comment-textnodes": "error", + "react/iframe-missing-sandbox": "error", + "react/no-unknown-property": "error", + "react/no-clone-element": "error", + "react/button-has-type": "error", + "react/no-object-type-as-default-prop": "error", + "react/jsx-no-constructed-context-values": "error", + "react/void-dom-elements-no-children": "error", + "react/no-children-prop": "error", + "react/jsx-key": "error", + "react/exhaustive-deps": "error", + "react/jsx-no-target-blank": "error", + "react/checked-requires-onchange-or-readonly": "error", + "react/jsx-no-useless-fragment": "error", + "react/no-unescaped-entities": "error", + "react/rules-of-hooks": "error", + + // Jsx A11y + "jsx-a11y/anchor-ambiguous-text": "error", + "jsx-a11y/tabindex-no-positive": "error", + "jsx-a11y/scope": "error", + "jsx-a11y/role-supports-aria-props": "error", + "jsx-a11y/role-has-required-aria-props": "error", + "jsx-a11y/no-static-element-interactions": "error", + "jsx-a11y/no-redundant-roles": "error", + "jsx-a11y/no-noninteractive-element-to-interactive-role": "error", + "jsx-a11y/no-noninteractive-element-interactions": "error", + "jsx-a11y/no-interactive-element-to-noninteractive-role": "error", + "jsx-a11y/no-autofocus": "error", + "jsx-a11y/no-aria-hidden-on-focusable": "error", + "jsx-a11y/mouse-events-have-key-events": "error", + "jsx-a11y/lang": "error", + "jsx-a11y/interactive-supports-focus": "error", + "jsx-a11y/img-redundant-alt": "error", + "jsx-a11y/iframe-has-title": "error", + "jsx-a11y/html-has-lang": "error", + "jsx-a11y/control-has-associated-label": "error", + "jsx-a11y/click-events-have-key-events": "error", + "jsx-a11y/autocomplete-valid": "error", + "jsx-a11y/aria-proptypes": "error", + "jsx-a11y/aria-props": "error", + "jsx-a11y/aria-activedescendant-has-tabindex": "error", + "jsx-a11y/anchor-has-content": "error", + "jsx-a11y/no-noninteractive-tabindex": "error", + "jsx-a11y/alt-text": "error", + + // Next Js + "nextjs/no-styled-jsx-in-document": "error", + "nextjs/no-html-link-for-pages": "error", + }, +} diff --git a/apps/site/app/(home)/session-animation.tsx b/apps/site/app/(home)/session-animation.tsx index cca8a1ba7..225290517 100644 --- a/apps/site/app/(home)/session-animation.tsx +++ b/apps/site/app/(home)/session-animation.tsx @@ -44,18 +44,18 @@ export function SessionAnimation() { ]); return () => controls.cancel(); - } else { - const controls = animate([ - ...typingRefs.current.map( - (ref) => [ref, { y: 10, opacity: 0 }, { duration: 0 }] satisfies ObjectSegmentWithTransition + } + + const controls = animate([ + ...typingRefs.current.map( + (ref) => [ref, { y: 10, opacity: 0 }, { duration: 0 }] satisfies ObjectSegmentWithTransition ), [profileRef.current, { opacity: 0, y: 20, filter: "blur(5px)" }, { duration: 0 }], [searchRef.current, { opacity: 1 }, { duration: 0 }], [daysBack, 0, { duration: 0 }], ]); - return () => controls.cancel(); - } + return () => controls.cancel(); }, [inView, animate, daysBack]); return ( diff --git a/apps/site/app/api/skin/head/route.ts b/apps/site/app/api/skin/head/route.ts index 8d3725cc6..a36dfc350 100644 --- a/apps/site/app/api/skin/head/route.ts +++ b/apps/site/app/api/skin/head/route.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; import { env } from "~/app/env"; export async function GET( diff --git a/apps/site/app/api/skin/render/route.ts b/apps/site/app/api/skin/render/route.ts index 51046ca49..2d24a9f05 100644 --- a/apps/site/app/api/skin/render/route.ts +++ b/apps/site/app/api/skin/render/route.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; import { env } from "~/app/env"; export async function GET( diff --git a/apps/site/app/players/[slug]/context.tsx b/apps/site/app/players/[slug]/context.tsx index 522cff124..b86eeb06d 100644 --- a/apps/site/app/players/[slug]/context.tsx +++ b/apps/site/app/players/[slug]/context.tsx @@ -8,29 +8,32 @@ "use client"; -import { type ReactNode, createContext, use } from "react"; +import { type ReactNode, createContext, use, useMemo } from "react"; import type { Player } from "@statsify/schemas"; const PlayerContext = createContext<{ player: Player | undefined }>({ player: undefined, }); -export const PlayerProvider = ({ player, children }: { +export const PlayerProvider = ({ + player, + children, +}: { player: Player; children: ReactNode; -}) => ( - - {children} - -); +}) => { + const value = useMemo(() => ({ player }), [player]); + return {children}; +}; export function usePlayer() { const { player } = use(PlayerContext); if (!player) { - throw new Error("Either usePlayer isn't being used in a PlayerContext or the player doesn't exist"); + throw new Error( + "Either usePlayer isn't being used in a PlayerContext or the player doesn't exist", + ); } return player; } - diff --git a/apps/site/app/players/[slug]/general/bingo/bingo.tsx b/apps/site/app/players/[slug]/general/bingo/bingo.tsx index a42c2c3c7..f8dc9bc9c 100644 --- a/apps/site/app/players/[slug]/general/bingo/bingo.tsx +++ b/apps/site/app/players/[slug]/general/bingo/bingo.tsx @@ -107,7 +107,8 @@ function CategoryOverview({ category, icon }: { category: Category; icon: Static

{FormattedCategories[category]} Bingo Cards

-

{ setCategory(category); @@ -117,8 +118,9 @@ function CategoryOverview({ category, icon }: { category: Category; icon: Static Easy:{" "} {easyCompletion} /16 completed -

-

+

); diff --git a/apps/site/app/players/search.tsx b/apps/site/app/players/search.tsx index 96b25b7ad..64383e338 100644 --- a/apps/site/app/players/search.tsx +++ b/apps/site/app/players/search.tsx @@ -90,31 +90,6 @@ export function Search({ console.log(`Redirecting to ${playerUrl(query)}`); router.push(playerUrl(query)); }} - onKeyDown={(event) => { - if (event.key === "Enter") { - ref.current?.requestSubmit(); - } - - if (suggestions.isPending || suggestions.isError) return; - - switch (event.key) { - case "Escape": - setSelected(undefined); - break; - - case "ArrowDown": { - const newSelected = ((selected ?? -1) + 1) % suggestions.data.length; - onSelectionChange(newSelected); - break; - } - - case "ArrowUp": { - const newSelected = selected ? selected - 1 : suggestions.data.length - 1; - onSelectionChange(newSelected); - break; - } - } - }} >
@@ -127,10 +102,36 @@ export function Search({ setQuery(event.target.value); setInput(event.target.value); }} + onKeyDown={(event) => { + if (event.key === "Enter") { + ref.current?.requestSubmit(); + } + + if (suggestions.isPending || suggestions.isError) return; + + switch (event.key) { + case "Escape": + setSelected(undefined); + break; + + case "ArrowDown": { + const newSelected = ((selected ?? -1) + 1) % suggestions.data.length; + onSelectionChange(newSelected); + break; + } + + case "ArrowUp": { + const newSelected = selected ? selected - 1 : suggestions.data.length - 1; + onSelectionChange(newSelected); + break; + } + } + }} spellCheck={false} autoComplete="off" disabled={disabled} onFocus={() => setFocused(true)} + aria-label="Search players" />
{/* Crossfade between oldBackground and currentBackground */} - {oldBackground.current && oldBackground.current != background && ( + {oldBackground.current && oldBackground.current !== background && ( = BoxOnlyPro keyof BoxOnlyProps >; +const DEFAULT_BORDER_RADIUS_PROP: BoxBorderRadius = {}; + export function Box({ - borderRadius: partialBorderRadius = {}, + borderRadius: partialBorderRadius = DEFAULT_BORDER_RADIUS_PROP, shadow = 8, className, variant = "default", diff --git a/apps/site/components/ui/carousel.tsx b/apps/site/components/ui/carousel.tsx index b76d7161b..c2d670f4e 100644 --- a/apps/site/components/ui/carousel.tsx +++ b/apps/site/components/ui/carousel.tsx @@ -116,6 +116,8 @@ export function Carousel({ children, className }: { children: ReactNode; classNa {cards.map((_, index) => ( ); } diff --git a/apps/site/components/ui/minecraft-text.tsx b/apps/site/components/ui/minecraft-text.tsx index f7d59bc13..82f364cc5 100644 --- a/apps/site/components/ui/minecraft-text.tsx +++ b/apps/site/components/ui/minecraft-text.tsx @@ -68,7 +68,7 @@ export function MinecraftText({ children, className }: { children: string | stri } } - if (!text.length) return undefined; + if (text.length === 0) return undefined; return {text}; }).filter((element) => element !== undefined); diff --git a/apps/site/components/ui/tabs.tsx b/apps/site/components/ui/tabs.tsx index f4be6eae8..02468ee8c 100644 --- a/apps/site/components/ui/tabs.tsx +++ b/apps/site/components/ui/tabs.tsx @@ -9,7 +9,7 @@ "use client"; import { Box } from "~/components/ui/box"; -import { type ComponentProps, createContext, use, useState } from "react"; +import { type ComponentProps, createContext, use, useState, useMemo, useCallback } from "react"; import { SkeletonBox } from "./skeleton-box"; import { cn } from "~/lib/util"; @@ -41,15 +41,17 @@ export function Tabs({ }: TabsProps) { const [internalTab, setInternalTab] = useState(defaultTab as T); - function onTabChange(tab: T) { + const onTabChange = useCallback((tab: T) => { setInternalTab(tab); externalOnTabChange?.(tab); - } + }, [externalOnTabChange]); const tab = externalTab ?? internalTab; + const value = useMemo(() => ({ tab, onTabChange: onTabChange as (tab: string | number) => void }), [tab, onTabChange]); + return ( - void }}> +
(ref: RefObject) { const [size, setSize] = useState({ width: 0, height: 0 }); // This must check for window since ResizeObserver only exists on the web - // eslint-disable-next-line unicorn/prefer-global-this const observer = useMemo(() => typeof window !== "undefined" && window.ResizeObserver ? new ResizeObserver((entries) => setSize(entries[0].contentRect)) : undefined, []); useEffect(() => { diff --git a/apps/site/package.json b/apps/site/package.json index 9f20e87c8..c70cfefcc 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -6,7 +6,8 @@ "dev": "next dev --turbopack -p 5000", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@radix-ui/react-popover": "^1.1.15", @@ -20,21 +21,18 @@ "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", - "tailwind-merge": "^3.4.0", + "tailwind-merge": "^3.6.0", "zod": "^4.1.5" }, "devDependencies": { - "@eslint/eslintrc": "^3.2.0", "@statsify/api-client": "workspace:^", - "@tailwindcss/postcss": "4.1.17", - "@types/node": "^24.3.0", - "@types/react": "^19.2.7", + "@tailwindcss/postcss": "4.3.0", + "@types/node": "^25.9.1", + "@types/react": "^19.2.16", "@types/react-dom": "^19.2.3", - "eslint": "^9.19.0", - "eslint-config-next": "15.5.2", "mongoose": "^8.18.0", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.17", - "typescript": "^5.7.3" + "postcss": "^8.5.15", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3" } -} \ No newline at end of file +} diff --git a/apps/support-bot/package.json b/apps/support-bot/package.json index 5f953fc9a..dab026189 100644 --- a/apps/support-bot/package.json +++ b/apps/support-bot/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -19,14 +20,14 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "axios": "1.11.0", "discord-api-types": "^0.38.22", "luxon": "^3.5.0", "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "toad-scheduler": "^3.0.1", "typedi": "^0.10.0" @@ -48,4 +49,4 @@ "default": "./dist/lib/index.js" } } -} \ No newline at end of file +} diff --git a/apps/support-bot/src/commands/commands.command.ts b/apps/support-bot/src/commands/commands.command.ts index f63534aac..c532e7457 100644 --- a/apps/support-bot/src/commands/commands.command.ts +++ b/apps/support-bot/src/commands/commands.command.ts @@ -12,7 +12,7 @@ import { CommandContext, EmbedBuilder, ErrorMessage, - PaginateService, + scrollingPagination, TextArgument, } from "@statsify/discord"; import { STATUS_COLORS } from "@statsify/logger"; @@ -28,10 +28,7 @@ const COMMANDS_PER_PAGE = 25; userCommand: false, }) export class CommandsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const commands = await this.apiService.getCommandUsage(); @@ -44,7 +41,7 @@ export class CommandsCommand { const commandList = Object.entries(commands).sort((a, b) => b[1] - a[1]); const groups = arrayGroup(commandList, COMMANDS_PER_PAGE); - return this.paginateService.scrollingPagination( + return scrollingPagination( context, groups.map( (group, index) => () => diff --git a/apps/support-bot/src/events/guild-member-add.event.tsx b/apps/support-bot/src/events/guild-member-add.event.tsx index e3c9db69a..7113a42ac 100644 --- a/apps/support-bot/src/events/guild-member-add.event.tsx +++ b/apps/support-bot/src/events/guild-member-add.event.tsx @@ -70,7 +70,7 @@ export class GuildMemberAddEventListener extends AbstractEventListener { - const avatar = member.user?.avatar ?? member.avatar; - - if (avatar) - return loadImage( - `https://cdn.discordapp.com/avatars/${member.user!.id}/${avatar}.png?size=96` - ); - - return loadImage( - `https://cdn.discordapp.com/embed/avatars/${ - Number(member.user!.discriminator) % 5 - }.png?size=96` - ); - } - private async sendVerifiedMessage(member: APIGuildMember): Promise { await this.roleService.addRole(GUILD_ID, member.user!.id, MEMBER_ROLE); await this.apiService.updateUser(member.user!.id, { serverMember: true }); const embed = new EmbedBuilder() - .description(`<@${member.user!.id}> ${this.randomJoinMessage()}`) + .description(`<@${member.user!.id}> ${randomJoinMessage()}`) .image("attachment://welcome.png") .color(STATUS_COLORS.info); @@ -127,14 +112,27 @@ export class GuildMemberAddEventListener extends AbstractEventListener ${this.randomJoinMessage()}`) + .description(`<@${member.user!.id}> ${randomJoinMessage()}`) .image("attachment://welcome.png") .color(STATUS_COLORS.info); return { embeds: [embed] }; } +} - private randomJoinMessage() { - return JOIN_MESSAGES[Math.floor(Math.random() * JOIN_MESSAGES.length)]; - } +function getDiscordAvatar(member: APIGuildMember): Promise { + const avatar = member.user?.avatar ?? member.avatar; + + if (avatar) + return loadImage( + `https://cdn.discordapp.com/avatars/${member.user!.id}/${avatar}.png?size=96` + ); + + return loadImage( + `https://cdn.discordapp.com/embed/avatars/${ + Number(member.user!.discriminator) % 5 + }.png?size=96` + ); } + +const randomJoinMessage = () => JOIN_MESSAGES[Math.floor(Math.random() * JOIN_MESSAGES.length)]; \ No newline at end of file diff --git a/apps/support-bot/src/events/guild-member-update.event.ts b/apps/support-bot/src/events/guild-member-update.event.ts index f4c396568..35a5128bf 100644 --- a/apps/support-bot/src/events/guild-member-update.event.ts +++ b/apps/support-bot/src/events/guild-member-update.event.ts @@ -123,11 +123,11 @@ export class GuildMemberUpdateEventListener extends AbstractEventListener { + for (const user of users) { if (user.tier in this.tiers) this.tiers[user.tier as PremiumTier].add(user.id); if (user.patreon) this.patreons.add(user.id); if (user.serverBooster) this.serverBoosters.add(user.id); - }); + } } private findTier(memberId: string) { diff --git a/apps/support-bot/src/index.ts b/apps/support-bot/src/index.ts index 0e080f671..59a2f43e9 100644 --- a/apps/support-bot/src/index.ts +++ b/apps/support-bot/src/index.ts @@ -9,10 +9,10 @@ import * as Sentry from "@sentry/node"; import { CommandListener } from "#lib"; import { - CommandLoader, CommandPoster, - EventLoader, I18nLoaderService, + loadCommands, + loadEvents, } from "@statsify/discord"; import { Container } from "typedi"; import { @@ -25,12 +25,11 @@ import { GatewayIntentBits } from "discord-api-types/v10"; import { Logger } from "@statsify/logger"; import { RestClient, WebsocketShard } from "tiny-discord"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; import { setGlobalOptions } from "@typegoose/typegoose"; import "reflect-metadata"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("support-bot"); const handleError = logger.error.bind(logger); @@ -61,10 +60,12 @@ await Promise.all( ) ); -const commands = await CommandLoader.load(join(__dirname, "./commands")); +const commands = await loadCommands(join(directory, "./commands")); const tags = await Container.get(TagService).fetch(); -tags.forEach((tag) => commands.set(tag.name, tag)); +for (const tag of tags) { + commands.set(tag.name, tag); +} const poster = Container.get(CommandPoster); @@ -83,7 +84,7 @@ const websocket = new WebsocketShard({ GatewayIntentBits.MessageContent, }); -await EventLoader.load(websocket, join(__dirname, "./events")); +await loadEvents(websocket, join(directory, "./events")); const listener = CommandListener.create(websocket, rest, commands); Container.get(TicketService).init(); diff --git a/apps/support-bot/src/services/mongo-loader.service.ts b/apps/support-bot/src/services/mongo-loader.service.ts index dbcc1f250..028bbfde5 100644 --- a/apps/support-bot/src/services/mongo-loader.service.ts +++ b/apps/support-bot/src/services/mongo-loader.service.ts @@ -19,9 +19,9 @@ export class MongoLoaderService { const models = [Ticket, Tag, User]; - models.forEach((modelClass) => { + for (const modelClass of models) { const model = getModelForClass(modelClass, { existingConnection: connection }); Container.set(modelClass, model); - }); + } } } diff --git a/apps/support-bot/src/services/ticket.service.ts b/apps/support-bot/src/services/ticket.service.ts index 7f74f27d9..519656503 100644 --- a/apps/support-bot/src/services/ticket.service.ts +++ b/apps/support-bot/src/services/ticket.service.ts @@ -88,7 +88,7 @@ export class TicketService { // Add hooks for all tickets in the database since they may have been created before the bot was started const tickets = await this.ticketModel.find().select({ channel: true }).lean().exec(); - tickets.forEach((ticket) => { + for (const ticket of tickets) { listener.addHook(ticket.channel, (interaction) => this.close(interaction.getChannelId()!, "channel", interaction.getUserId()) ); @@ -97,7 +97,7 @@ export class TicketService { this.copyUsernameButtonId(ticket.channel), this.copyUsername.bind(this) ); - }); + } } public async create(guildId: string, user: APIUser, username: string, issue: string) { @@ -202,12 +202,11 @@ export class TicketService { listener.removeHook(this.copyUsernameButtonId(ticket.channel)); // A list of people who talked in the ticket - const participants: Set = new Set(); - participants.add(`<@${ticket.owner}>`); + const participants: Set = new Set(`<@${ticket.owner}>`); const logs: string[] = []; - messages.forEach((m) => { + for (const m of messages) { if (!m.author.bot) participants.add(`<@${m.author.id}>`); const message = [ @@ -216,7 +215,7 @@ export class TicketService { ].join("\n"); logs.push(message); - }); + } const embed = new EmbedBuilder() .title("Ticket Resolved") diff --git a/apps/support-bot/tsconfig.json b/apps/support-bot/tsconfig.json index 1522cd368..042ff5467 100644 --- a/apps/support-bot/tsconfig.json +++ b/apps/support-bot/tsconfig.json @@ -3,8 +3,5 @@ "compilerOptions": { "jsx": "preserve", }, - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/verify-server/eslint.config.js b/apps/verify-server/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/verify-server/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/verify-server/package.json b/apps/verify-server/package.json index 208f341e8..5503fdbc0 100644 --- a/apps/verify-server/package.json +++ b/apps/verify-server/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -16,9 +17,9 @@ "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "minecraft-protocol": "^1.61.0", "mongoose": "^8.5.2" } -} \ No newline at end of file +} diff --git a/apps/verify-server/src/generate-code.ts b/apps/verify-server/src/generate-code.ts index 31dacf1f8..9ddc95c0e 100644 --- a/apps/verify-server/src/generate-code.ts +++ b/apps/verify-server/src/generate-code.ts @@ -9,14 +9,16 @@ import type { ReturnModelType } from "@typegoose/typegoose"; import type { VerifyCode } from "@statsify/schemas"; -const createCode = () => Math.floor(Math.random() * (9999 - 1000 + 1) + 1000).toString(); +const createCode = () => + Math.floor(Math.random() * (9999 - 1000 + 1) + 1000).toString(); export const generateCode = async ( - verifyCodesModel: ReturnModelType + verifyCodesModel: ReturnModelType, ) => { let code = createCode(); - // Make sure the code is unique + // Make sure the code is unique by serially checking if each generated code already exists + // oxlint-disable-next-line no-await-in-loop while (await verifyCodesModel.exists({ code }).lean().exec()) { code = createCode(); } diff --git a/apps/verify-server/tsconfig.json b/apps/verify-server/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/verify-server/tsconfig.json +++ b/apps/verify-server/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/assets/private b/assets/private index 1ed6d877f..38a97e46e 160000 --- a/assets/private +++ b/assets/private @@ -1 +1 @@ -Subproject commit 1ed6d877fe5cc3bc80ade9d7654752edc8ba0a3e +Subproject commit 38a97e46ee32b939b0f617bfd66a8833c7c6e619 diff --git a/assets/public b/assets/public index 25cf23500..cf87904f4 160000 --- a/assets/public +++ b/assets/public @@ -1 +1 @@ -Subproject commit 25cf2350076387df9e8a37388ae48f4a931e9966 +Subproject commit cf87904f476e88e8bb31fa47f4dc2a569628ddbd diff --git a/compose.dev.yml b/compose.dev.yml new file mode 100644 index 000000000..f17507185 --- /dev/null +++ b/compose.dev.yml @@ -0,0 +1,21 @@ +services: + redis: + image: docker.io/redis/redis-stack:latest + restart: unless-stopped + ports: + - "127.0.0.1:8001:8001" + - "127.0.0.1:6379:6379" + volumes: + - "./data/redis:/data" + environment: + REDIS_ARGS: "--requirepass statsify" + mongodb: + image: mongo:latest + restart: unless-stopped + ports: + - "27017:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: statsify + MONGO_INITDB_ROOT_PASSWORD: statsify + volumes: + - "./data/mongodb:/data/db" diff --git a/config.schema.js b/config.schema.js index e4f31c328..4317d8ae2 100644 --- a/config.schema.js +++ b/config.schema.js @@ -11,8 +11,8 @@ */ export default { database: { - mongoUri: "", - redisUrl: "", + mongoUri: "mongodb://statsify:statsify@localhost:27017/statsify?authSource=admin", + redisUrl: "redis://:statsify@localhost:6379", }, hypixelApi: { key: "", diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 4ea4ffe24..000000000 --- a/eslint.config.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import eslint from "@eslint/js"; -import licenseHeader from "eslint-plugin-license-header"; -import sortImports from "@j4cobi/eslint-plugin-sort-imports"; -import stylistic from "@stylistic/eslint-plugin"; -import tseslint from "typescript-eslint"; -import unusedImports from "eslint-plugin-unused-imports"; -import unicorn from "eslint-plugin-unicorn"; -import { join } from "node:path"; - -/** - * - * @param {{ tsconfigDirName: string }} config - * @returns workspace eslint config - */ -export function defineConfig({ tsconfigDirName }) { - return tseslint.config( - { ignores: ["dist", "node_modules", ".next", "pkg"] }, - eslint.configs.recommended, - ...tseslint.configs.strict, - { - languageOptions: { - parserOptions: { - project: [join(tsconfigDirName, "./tsconfig.json")], - tsconfigDirName - } - }, - rules: { - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "minimumDescriptionLength": 3, - "ts-check": true, - "ts-expect-error": "allow-with-description", - "ts-ignore": "allow-with-description", - "ts-nocheck": true, - }, - ], - "@typescript-eslint/default-param-last": "error", - "@typescript-eslint/explicit-member-accessibility": "error", - "@typescript-eslint/member-ordering": [ - "error", - { - default: [ - "signature", - "public-instance-field", - "protected-instance-field", - "private-instance-field", - "instance-field", - "public-static-field", - "protected-static-field", - "private-static-field", - "static-field", - "public-constructor", - "protected-constructor", - "private-constructor", - "constructor", - "public-instance-method", - "protected-instance-method", - "private-instance-method", - "instance-method", - "public-static-method", - "protected-static-method", - "private-static-method", - "static-method", - ], - }, - ], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-unsafe-declaration-merging": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-extraneous-class": "off" - } - }, - unicorn.configs["flat/recommended"], - { - rules: { - "unicorn/better-regex": "off", - "unicorn/catch-error-name": "off", - "unicorn/consistent-destructuring": "off", - "unicorn/escape-case": "off", - "unicorn/explicit-length-check": "off", - "unicorn/filename-case": "off", - "unicorn/import-style": [ - "error", - { - styles: { - "node:path": { - named: true, - default: false, - }, - }, - }, - ], - "unicorn/no-array-callback-reference": "off", - "unicorn/no-array-for-each": "off", - "unicorn/no-array-reduce": "off", - "unicorn/no-await-expression-member": "off", - "unicorn/no-null": "off", - "unicorn/no-object-as-default": "off", - "unicorn/no-process-exit": "off", - "unicorn/no-static-only-class": "off", - "unicorn/no-useless-switch-case": "off", - "unicorn/no-useless-undefined": "off", - "unicorn/number-literal-case": "off", - "unicorn/numeric-separators-style": [ - "error", - { - onlyIfContainsSeparator: true, - number: { - minimumDigits: 5, - groupLength: 3, - onlyIfContainsSeparator: false, - }, - }, - ], - "unicorn/prefer-at": "error", - "unicorn/prefer-string-replace-all": "off", - "unicorn/prevent-abbreviations": "off", - "unicorn/relative-url-style": ["error", "always"], - "unicorn/switch-case-braces": ["error", "avoid"], - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "error", - { - vars: "all", - varsIgnorePattern: "^_", - args: "after-used", - argsIgnorePattern: "^_", - }, - ], - } - }, - stylistic.configs.customize({ - jsx: true, - semi: true, - quotes: "double", - quoteProps: "consistent-as-needed", - braceStyle: "1tbs", - arrowParens: "always", - }), - { - rules: { - "@stylistic/no-extra-semi": "error", - "@stylistic/no-floating-decimal": "error", - "@stylistic/quote-props": ["error", "consistent-as-needed"], - "@stylistic/no-multiple-empty-lines": ["error", { max: 1, maxEOF: 1 }], - "@stylistic/comma-dangle": [ - "error", - { - arrays: "always-multiline", - objects: "always-multiline", - imports: "always-multiline", - exports: "always-multiline", - functions: "never", - }, - ], - "@stylistic/generator-star-spacing": ["error", { before: false, after: true }], - "@stylistic/indent": ["error", 2, { SwitchCase: 1 }], - "@stylistic/max-len": [ - "error", - { - code: 120, - tabWidth: 2, - ignoreComments: true, - ignoreTrailingComments: true, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreRegExpLiterals: true, - }, - ], - "@stylistic/type-generic-spacing": "error", - "@stylistic/yield-star-spacing": ["error", { before: false, after: true }], - "@stylistic/jsx-one-expression-per-line": "off", - "@stylistic/operator-linebreak": ["error", "after"] - } - }, - { - plugins: { - "license-header": licenseHeader, - "sort-imports": sortImports, - "unused-imports": unusedImports, - }, - rules: { - "arrow-body-style": ["error", "as-needed"], - "license-header/header": [ - "error", - [ - "/**", - " * Copyright (c) Statsify", - " *", - " * This source code is licensed under the GNU GPL v3 license found in the", - " * LICENSE file in the root directory of this source tree.", - " * https://github.com/Statsify/statsify/blob/main/LICENSE", - " */", - ], - ], - "import/no-anonymous-default-export": "off", - "no-constant-binary-expression": "error", - "no-constructor-return": "error", - "no-duplicate-imports": "error", - "no-lonely-if": "error", - "object-shorthand": ["error", "always"], - "one-var": ["error", "never"], - "prefer-template": "error", - "sort-imports/sort-imports": [ - "error", - { - ignoreCase: false, - ignoreMemberSort: false, - memberSyntaxSortOrder: [ - "all", - "single", - "multiple", - "none", - ], - }, - ] - } - } - ); -} \ No newline at end of file diff --git a/package.json b/package.json index 4b886a783..2184e656b 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,15 @@ "url": "git+https://github.com/Statsify/statsify.git" }, "scripts": { - "build": "turbo run build --filter=!site --parallel --cache-dir='.turbo'", + "build": "turbo run build --filter=!site --cache-dir='.turbo'", "build:watch": "turbo watch build --filter=!site", - "test:types": "turbo run test:types --cache-dir='.turbo'", + "typecheck": "turbo run typecheck --cache-dir='.turbo'", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "lint": "turbo run lint --parallel --cache-dir='.turbo'", - "pre-commit": "pnpm lint && pnpm test:types && pnpm test:coverage && git add .", - "commit": "pnpm pre-commit && git cz", + "lint": "turbo run lint --cache-dir='.turbo'", + "lint:ci": "turbo run lint:ci --cache-dir='.turbo'", + "fmt": "turbo run fmt --cache-dir='.turbo'", "api": "pnpm --filter api", "discord-bot": "pnpm --filter discord-bot", "support-bot": "pnpm --filter support-bot", @@ -26,46 +26,23 @@ "verify-server": "pnpm --filter verify-server" }, "packageManager": "pnpm@10.15.0", - "pnpm": { - "overrides": { - "skia-canvas": "3.0.8" - } - }, "devDependencies": { - "@commitlint/cli": "^19.6.1", - "@commitlint/config-conventional": "^19.6.0", - "@eslint/js": "^9.19.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", - "@napi-rs/cli": "^3.1.5", + "@napi-rs/cli": "^3.7.0", "@rollup/pluginutils": "^5.1.0", - "@stylistic/eslint-plugin": "^5.2.3", - "@swc/cli": "^0.7.8", - "@swc/core": "1.13.5", - "@types/eslint__js": "^9.14.0", - "@types/node": "^24.3.0", - "@vitest/coverage-v8": "^3.0.4", - "@vitest/ui": "^3.0.4", - "commitizen": "^4.3.1", - "cz-conventional-changelog": "^3.3.0", - "eslint": "^9.19.0", - "eslint-plugin-license-header": "^0.8.0", - "eslint-plugin-unicorn": "^60.0.0", - "eslint-plugin-unused-imports": "^4.1.4", + "@swc/cli": "^0.8.1", + "@swc/core": "1.15.40", + "@types/node": "^25.9.1", + "@typescript/native-preview": "7.0.0-dev.20260601.1", + "@vitest/coverage-v8": "^4.1.8", + "@vitest/ui": "^4.1.8", + "eslint-plugin-license-header": "^0.9.0", + "oxfmt": "^0.53.0", + "oxlint": "^1.68.0", "pm2": "^6.0.8", - "turbo": "^2.4.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.22.0", - "unplugin": "^2.1.2", - "vitest": "^3.0.4" - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } + "turbo": "^2.9.16", + "typescript": "^6.0.3", + "unplugin": "^3.0.0", + "vitest": "^4.1.8" } -} \ No newline at end of file +} diff --git a/packages/api-client/eslint.config.js b/packages/api-client/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/api-client/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/api-client/package.json b/packages/api-client/package.json index 791a0f748..d911fa1fb 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -6,8 +6,9 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@nestjs/common": "^11.1.6", @@ -16,7 +17,7 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "^1.11.0" }, "imports": { @@ -29,4 +30,4 @@ "default": "./dist/responses/index.js" } } -} \ No newline at end of file +} diff --git a/packages/api-client/src/api.service.ts b/packages/api-client/src/api.service.ts index b2d1d7677..f43108367 100644 --- a/packages/api-client/src/api.service.ts +++ b/packages/api-client/src/api.service.ts @@ -7,7 +7,7 @@ */ import * as Sentry from "@sentry/node"; -import Axios, { AxiosInstance, AxiosRequestHeaders, Method, ResponseType } from "axios"; +import axios, { AxiosInstance, AxiosRequestHeaders, Method, ResponseType } from "axios"; import { CacheLevel, GuildQuery, @@ -55,7 +55,7 @@ export class ApiService { private axios: AxiosInstance; public constructor(private apiRoute: string, private apiKey: string) { - this.axios = Axios.create({ + this.axios = axios.create({ baseURL: this.apiRoute, headers: { "x-api-key": this.apiKey, diff --git a/packages/api-client/tsconfig.json b/packages/api-client/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/packages/api-client/tsconfig.json +++ b/packages/api-client/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/packages/assets/eslint.config.js b/packages/assets/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/assets/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/assets/package.json b/packages/assets/package.json index e68ff387f..9956e5ed3 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -6,14 +6,15 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "1.11.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz" + "skia-canvas": "3.0.8" } -} \ No newline at end of file +} diff --git a/packages/assets/src/index.ts b/packages/assets/src/index.ts index dae04fd37..6f4d43896 100644 --- a/packages/assets/src/index.ts +++ b/packages/assets/src/index.ts @@ -30,8 +30,8 @@ const getImage = (path: string) => loadImage(getAssetPath(path)); * @returns the full path to the texture */ export const getMinecraftTexturePath = (texturePath: string, pack = "default") => { - if (!hasPrivateAssets) pack = "default"; - return join(getAssetPath(`minecraft-textures/${pack}/assets/minecraft/`), texturePath); + const effectivePack = !hasPrivateAssets ? "default" : pack; + return join(getAssetPath(`minecraft-textures/${effectivePack}/assets/minecraft/`), texturePath); }; export const getAllGameIcons = async () => { diff --git a/packages/assets/tsconfig.json b/packages/assets/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/packages/assets/tsconfig.json +++ b/packages/assets/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/packages/discord/eslint.config.js b/packages/discord/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/discord/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/discord/package.json b/packages/discord/package.json index 2e4cb9919..eae37fb57 100644 --- a/packages/discord/package.json +++ b/packages/discord/package.json @@ -6,8 +6,9 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -16,13 +17,13 @@ "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "^1.11.0", "discord-api-types": "^0.38.22", "i18next": "^21.10.0", "i18next-fs-backend": "^2.3.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "typedi": "^0.10.0" }, @@ -59,4 +60,4 @@ "default": "./dist/util/*.js" } } -} \ No newline at end of file +} diff --git a/packages/discord/src/arguments/player.argument.ts b/packages/discord/src/arguments/player.argument.ts index 281c6d663..89aa0bab0 100644 --- a/packages/discord/src/arguments/player.argument.ts +++ b/packages/discord/src/arguments/player.argument.ts @@ -41,7 +41,7 @@ export class PlayerArgument extends AbstractArgument { let results = players.map((p) => ({ name: p, value: p })); - if (query && (!players.length || !players.some((p) => p.toLowerCase() === query))) { + if (query && (players.length === 0 || !players.some((p) => p.toLowerCase() === query))) { results = results.slice(0, 24); results.push(searched); } diff --git a/packages/discord/src/command/abstract-command.listener.ts b/packages/discord/src/command/abstract-command.listener.ts index 64a460791..90527fdb1 100644 --- a/packages/discord/src/command/abstract-command.listener.ts +++ b/packages/discord/src/command/abstract-command.listener.ts @@ -98,7 +98,7 @@ export abstract class AbstractCommandListener { data: any, name = command.name ): [command: CommandResolvable, data: any, name: string] { - if (!data.options || !data.options.length) return [command, data, name]; + if (!data.options || data.options.length === 0) return [command, data, name]; const firstOption = data.options[0]; @@ -132,7 +132,9 @@ export abstract class AbstractCommandListener { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); try { - preconditions.forEach((precondition) => precondition()); + for (const precondition of preconditions) { + precondition(); + } const response = await command.execute(context); @@ -285,7 +287,6 @@ export abstract class AbstractCommandListener { this.logger.error(err); }); - // @ts-ignore Discord supports sending a blank object as a response client.on("interaction", async (event) => { const interaction = new Interaction(this.rest, event.interaction, this.applicationId); const response = await this.onInteraction(interaction); diff --git a/packages/discord/src/command/command.builder.ts b/packages/discord/src/command/command.builder.ts index 8dcbe9e13..b54d4ab84 100644 --- a/packages/discord/src/command/command.builder.ts +++ b/packages/discord/src/command/command.builder.ts @@ -9,58 +9,62 @@ import { ApplicationIntegrationType } from "discord-api-types/v9"; import { CommandResolvable } from "./command.resolvable.js"; import { InteractionContextType } from "discord-api-types/v10"; -import type { CommandMetadata, SubCommandMetadata } from "./command.interface.js"; +import type { + CommandMetadata, + SubCommandMetadata, +} from "./command.interface.js"; import type { Constructor } from "@statsify/util"; -export class CommandBuilder { - public static scan(target: T, constructor: Constructor) { - const commandMetadata = Reflect.getMetadata( - "statsify:command", - constructor - ) as CommandMetadata; - - if (!commandMetadata) { - throw new Error(`Command metadata not found on ${constructor.name}`); - } - - const commandResolvable = new CommandResolvable(commandMetadata, target); +export function scanCommands( + target: T, + constructor: Constructor, +) { + const commandMetadata = Reflect.getMetadata( + "statsify:command", + constructor, + ) as CommandMetadata; + + if (!commandMetadata) { + throw new Error(`Command metadata not found on ${constructor.name}`); + } - const subcommandMetadata = Reflect.getMetadata( - "statsify:subcommand", - target - ) as Record; + const commandResolvable = new CommandResolvable(commandMetadata, target); - if (!subcommandMetadata) return commandResolvable; + const subcommandMetadata = Reflect.getMetadata( + "statsify:subcommand", + target, + ) as Record; - const groups: Record = {}; + if (!subcommandMetadata) return commandResolvable; - for (const subcommand of Object.values(subcommandMetadata)) { - const subcommandResolvable = new CommandResolvable(subcommand, target); + const groups: Record = {}; - let addSubCommandTo: CommandResolvable = commandResolvable; + for (const subcommand of Object.values(subcommandMetadata)) { + const subcommandResolvable = new CommandResolvable(subcommand, target); - if (subcommand.group && subcommand.group in groups) { - addSubCommandTo = groups[subcommand.group]; - } else if (subcommand.group) { - const options = { - name: subcommand.group, - methodName: "run", - description: "group", - }; + let addSubCommandTo: CommandResolvable = commandResolvable; - addSubCommandTo = new CommandResolvable(options, target); - groups[options.name] = addSubCommandTo; - } + if (subcommand.group && subcommand.group in groups) { + addSubCommandTo = groups[subcommand.group]; + } else if (subcommand.group) { + const options = { + name: subcommand.group, + methodName: "run", + description: "group", + }; - addSubCommandTo.addCommand(subcommandResolvable.asSubCommand()); + addSubCommandTo = new CommandResolvable(options, target); + groups[options.name] = addSubCommandTo; } - for (const group of Object.values(groups)) { - commandResolvable.addCommand(group.asSubCommandGroup()); - } + addSubCommandTo.addCommand(subcommandResolvable.asSubCommand()); + } - return commandResolvable; + for (const group of Object.values(groups)) { + commandResolvable.addCommand(group.asSubCommandGroup()); } + + return commandResolvable; } if (import.meta.vitest) { @@ -68,14 +72,17 @@ if (import.meta.vitest) { const { Command } = await import("./command.decorator.js"); const { SubCommand } = await import("./subcommand.decorator.js"); - const { AbstractArgument } = await import("../arguments/abstract.argument.js"); + const { AbstractArgument } = + await import("../arguments/abstract.argument.js"); - const { ApplicationCommandOptionType, ApplicationCommandType } = await import( - "discord-api-types/v10" - ); + const { ApplicationCommandOptionType, ApplicationCommandType } = + await import("discord-api-types/v10"); - suite("CommandBuilder", () => { - const integration_types = [ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall]; + suite("Command Builder", () => { + const integration_types = [ + ApplicationIntegrationType.GuildInstall, + ApplicationIntegrationType.UserInstall, + ]; const contexts = [ InteractionContextType.Guild, @@ -87,7 +94,7 @@ if (import.meta.vitest) { @Command({ description: "test" }) class TestCommand {} - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, @@ -107,7 +114,7 @@ if (import.meta.vitest) { } } - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, @@ -147,7 +154,7 @@ if (import.meta.vitest) { } } - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", type: ApplicationCommandType.ChatInput, @@ -217,7 +224,7 @@ if (import.meta.vitest) { @Command({ description: "test", args: [Arg] }) class TestCommand {} - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, diff --git a/packages/discord/src/command/command.loader.ts b/packages/discord/src/command/command.loader.ts index e644107df..3648a9c56 100644 --- a/packages/discord/src/command/command.loader.ts +++ b/packages/discord/src/command/command.loader.ts @@ -6,72 +6,70 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { CommandBuilder } from "./command.builder.js"; import { Container } from "typedi"; import { Logger } from "@statsify/logger"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; import type { CommandResolvable } from "./command.resolvable.js"; +import { scanCommands } from "./command.builder.js"; -export class CommandLoader { - private static readonly logger = new Logger("CommandLoader"); +const logger = new Logger("CommandLoader"); - public static async load(dir: string) { - const commands = new Map(); - const files = await this.getCommandFiles(dir); +export async function loadCommands(dir: string) { + const files = await getCommandFiles(dir); + const commands = await Promise.all(files.map(importCommand)); - for (const file of files) { - const imports = await this.importCommand(file); - - for (const command of imports) { - if (!command) continue; - commands.set(command.name, command); - } - } - - return commands; - } + return new Map( + commands + .flat() + .filter((command) => command !== undefined) + .map((command) => [command.name, command] as const), + ); +} - private static async importCommand(file: string) { - const command = await import(file); +async function importCommand(file: string) { + const command = await import(file); - return Object.keys(command) - .filter((key) => key !== "default") - .filter((key) => { - const value = command[key]; - // try to filter out function exports since classes will not have a writeable prototype. - return typeof value === "function" && !(Object.getOwnPropertyDescriptor(value, "prototype")?.writable); - }) - .map((key) => { - try { - const constructor = command[key]; - const instance = Container.get(constructor); + return Object.keys(command) + .filter((key) => key !== "default") + .filter((key) => { + const value = command[key]; + // try to filter out function exports since classes will not have a writeable prototype. + return ( + typeof value === "function" && + !Object.getOwnPropertyDescriptor(value, "prototype")?.writable + ); + }) + .map((key) => { + try { + const constructor = command[key]; + const instance = Container.get(constructor); - return CommandBuilder.scan(instance, constructor); - } catch (err) { - this.logger.error(`Failed to load command in ${file} with import ${key}`); - this.logger.error(err); - } - }); - } + return scanCommands(instance, constructor); + } catch (err) { + logger.error(`Failed to load command in ${file} with import ${key}`); + logger.error(err); + return undefined; + } + }); +} - private static async getCommandFiles(dir: string): Promise { - const toLoad: string[] = []; +async function getCommandFiles(dir: string): Promise { + const toLoad: string[] = []; - const files = await readdir(dir); + const files = await readdir(dir); - await Promise.all( - files.map(async (file) => { - const path = `${dir}/${file}`; + await Promise.all( + files.map(async (file) => { + const path = `${dir}/${file}`; - if (statSync(path).isDirectory()) { - toLoad.push(...(await this.getCommandFiles(path))); - } else if (file.endsWith(".command.js")) { - toLoad.push(path); - } - }) - ); + if (statSync(path).isDirectory()) { + toLoad.push(...(await getCommandFiles(path))); + } else if (file.endsWith(".command.js")) { + toLoad.push(path); + } + }), + ); - return toLoad; - } + return toLoad; } diff --git a/packages/discord/src/event/event.loader.ts b/packages/discord/src/event/event.loader.ts index 830bf1752..40f752559 100644 --- a/packages/discord/src/event/event.loader.ts +++ b/packages/discord/src/event/event.loader.ts @@ -14,60 +14,56 @@ import { WebsocketShard } from "tiny-discord"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; -export class EventLoader { - private static readonly logger = new Logger("EventLoader"); +const logger = new Logger("EventLoader"); - public static async load(websocket: WebsocketShard, dir: string) { - const events = new Map>(); - const files = await this.getEventFiles(dir); +export async function loadEvents(websocket: WebsocketShard, dir: string) { + const files = await getEventFiles(dir); + const events = await Promise.all(files.map(importEvent)); + const eventsMap = new Map>(events.flat().map((event) => [event.event, event])); - for (const file of files) { - const imports = await this.importEvent(file); - for (const event of imports) events.set(event.event, event); - } - - websocket.on("event", (event) => { - const listener = events.get(event.t as GatewayDispatchEvents); - if (listener) listener.onEvent(event.d); - }); - } + websocket.on("event", (event) => { + const listener = eventsMap.get(event.t as GatewayDispatchEvents); + if (listener) listener.onEvent(event.d); + }); +} - private static async importEvent(file: string): Promise[]> { - const event = await import(file); +async function importEvent( + file: string, +): Promise[]> { + const event = await import(file); - return Object.keys(event) - .filter((key) => key !== "default") - .map((key) => { - try { - const constructor = event[key]; - const instance = Container.get>(constructor); - return instance; - } catch (err) { - this.logger.error(`Failed to load event in ${file} with import ${key}`); - this.logger.error(err); - return null; - } - }) - .filter(Boolean) as AbstractEventListener[]; - } + return Object.keys(event) + .filter((key) => key !== "default") + .map((key) => { + try { + const constructor = event[key]; + const instance = Container.get>(constructor); + return instance; + } catch (err) { + logger.error(`Failed to load event in ${file} with import ${key}`); + logger.error(err); + return null; + } + }) + .filter(Boolean) as AbstractEventListener[]; +} - private static async getEventFiles(dir: string): Promise { - const toLoad: string[] = []; +async function getEventFiles(dir: string): Promise { + const toLoad: string[] = []; - const files = await readdir(dir); + const files = await readdir(dir); - await Promise.all( - files.map(async (file) => { - const path = `${dir}/${file}`; + await Promise.all( + files.map(async (file) => { + const path = `${dir}/${file}`; - if (statSync(path).isDirectory()) { - toLoad.push(...(await this.getEventFiles(path))); - } else if (file.endsWith(".event.js")) { - toLoad.push(path); - } - }) - ); + if (statSync(path).isDirectory()) { + toLoad.push(...(await getEventFiles(path))); + } else if (file.endsWith(".event.js")) { + toLoad.push(path); + } + }), + ); - return toLoad; - } + return toLoad; } diff --git a/packages/discord/src/messages/components/parse-emoji.ts b/packages/discord/src/messages/components/parse-emoji.ts index f68cc3802..0c7a2b37b 100644 --- a/packages/discord/src/messages/components/parse-emoji.ts +++ b/packages/discord/src/messages/components/parse-emoji.ts @@ -15,7 +15,7 @@ export function parseEmoji( ): APIMessageComponentEmoji { const emoji = translateField(locale, emote); const animated = emoji.startsWith("/g, ""); + const name = emoji.replaceAll(/<:|/g, ""); const id = name.split(":")[1]; return { name: name.replace(id, ""), animated, id }; diff --git a/packages/discord/src/messages/embed.ts b/packages/discord/src/messages/embed.ts index 4894bace8..3de82c248 100644 --- a/packages/discord/src/messages/embed.ts +++ b/packages/discord/src/messages/embed.ts @@ -73,7 +73,9 @@ export class EmbedBuilder { } public fields(...fields: Field[]): this { - fields.forEach((field) => this.field(...field)); + for (const field of fields) { + this.field(...field); + } return this; } diff --git a/packages/discord/src/services/api.service.ts b/packages/discord/src/services/api.service.ts index 5aaef0a1d..bc0fd6c5a 100644 --- a/packages/discord/src/services/api.service.ts +++ b/packages/discord/src/services/api.service.ts @@ -128,14 +128,21 @@ export class ApiService extends StatsifyApiService { let input: string; let playerType: PlayerTag; - if (!type) { - if (!tag || this.isDiscordId(tag)) type = GuildQuery.PLAYER; - else if (GUILD_ID_REGEX.test(tag)) type = GuildQuery.ID; - else if (tag.includes(" ") || tag.length > 16) type = GuildQuery.NAME; - else type = GuildQuery.NAME; + let resolvedType: GuildQuery; + + if (type) { + resolvedType = type; + } else if (!tag || this.isDiscordId(tag)) { + resolvedType = GuildQuery.PLAYER; + } else if (GUILD_ID_REGEX.test(tag)) { + resolvedType = GuildQuery.ID; + } else if (tag.includes(" ") || tag.length > 16) { + resolvedType = GuildQuery.NAME; + } else { + resolvedType = GuildQuery.NAME; } - if (type === GuildQuery.PLAYER) { + if (resolvedType === GuildQuery.PLAYER) { const [formattedTag, type] = this.parseTag(tag); playerType = type; input = await this.resolveTag(formattedTag, type, user); @@ -143,7 +150,7 @@ export class ApiService extends StatsifyApiService { input = tag; } - return super.getGuild(input, type).catch((err) => { + return super.getGuild(input, resolvedType).catch((err) => { if (!err.response || !err.response.data) throw this.unknownError(); const error = err.response.data as GuildNotFoundException | PlayerNotFoundException; @@ -226,9 +233,9 @@ export class ApiService extends StatsifyApiService { } public emojiDisplayName(t: LocalizeFunction, displayName: string, space = true) { - displayName = displayName.replaceAll("_", String.raw`\_`); + const escapedDisplayName = displayName.replaceAll("_", String.raw`\_`); - const [rank, name] = displayName.replace(/\[|\]/g, "").split(" "); + const [rank, name] = escapedDisplayName.replaceAll(/\[|\]/g, "").split(" "); // They don't have a rank if (!name) return removeFormatting(displayName); @@ -260,7 +267,7 @@ export class ApiService extends StatsifyApiService { if (length >= 32 && length <= 36) return [tag.replaceAll("-", ""), "uuid"]; if (length <= 16) return [tag, "username"]; - if (this.isDiscordId(tag)) return [tag.replace(/<@|!|>/g, ""), "discordId"]; + if (this.isDiscordId(tag)) return [tag.replaceAll(/<@|!|>/g, ""), "discordId"]; throw new ErrorMessage("errors.invalidSearch"); } diff --git a/packages/discord/src/services/i18n-loader.service.ts b/packages/discord/src/services/i18n-loader.service.ts index c73d6863a..f576166b3 100644 --- a/packages/discord/src/services/i18n-loader.service.ts +++ b/packages/discord/src/services/i18n-loader.service.ts @@ -1,70 +1,70 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import Backend from "i18next-fs-backend"; -import i18next from "i18next"; -import { Service } from "typedi"; -import { abbreviationNumber } from "@statsify/util"; -import { readdir } from "node:fs/promises"; - -const DEFAULT_LANGUAGE = "en-US"; - -@Service() -export class I18nLoaderService { - private languages: string[] = []; - private namespaces: string[] = []; - - public async init() { - this.languages = await readdir("../../locales"); - this.namespaces = (await readdir(`../../locales/${DEFAULT_LANGUAGE}/`)).map((p) => - p.replace(".json", "") - ); - - await i18next.use(Backend).init({ - backend: { - loadPath: "../../locales/{{lng}}/{{ns}}.json", - }, - debug: false, - fallbackLng: DEFAULT_LANGUAGE, - lng: DEFAULT_LANGUAGE, - supportedLngs: this.languages, - ns: this.namespaces, - load: "all", - preload: this.languages, - initImmediate: false, - defaultNS: "default", - interpolation: { - format: this.format, - escapeValue: false, - }, - }); - } - - private format(value: any, format?: string | undefined, lng?: string): string { - switch (format) { - case "number": { - const hasDecimals = value >= 1_000_000 || !Number.isInteger(+value); - const digits = hasDecimals ? 2 : 0; - - const formatOptions = { - maximumFractionDigits: digits, - minimumFractionDigits: digits, - }; - - if ((value as number) >= 1_000_000) { - const [number, suffix] = abbreviationNumber(value); - return `${Intl.NumberFormat(lng, formatOptions).format(number)}${suffix}`; - } - - return Intl.NumberFormat(lng, formatOptions).format(value as number); - } - } - - return value; - } -} +/** + * Copyright (c) Statsify + * + * This source code is licensed under the GNU GPL v3 license found in the + * LICENSE file in the root directory of this source tree. + * https://github.com/Statsify/statsify/blob/main/LICENSE + */ + +import Backend from "i18next-fs-backend"; +import i18next from "i18next"; +import { Service } from "typedi"; +import { abbreviationNumber } from "@statsify/util"; +import { readdir } from "node:fs/promises"; + +const DEFAULT_LANGUAGE = "en-US"; + +@Service() +export class I18nLoaderService { + private languages: string[] = []; + private namespaces: string[] = []; + + public async init() { + this.languages = await readdir("../../locales"); + this.namespaces = (await readdir(`../../locales/${DEFAULT_LANGUAGE}/`)).map((p) => + p.replace(".json", "") + ); + + await i18next.use(Backend).init({ + backend: { + loadPath: "../../locales/{{lng}}/{{ns}}.json", + }, + debug: false, + fallbackLng: DEFAULT_LANGUAGE, + lng: DEFAULT_LANGUAGE, + supportedLngs: this.languages, + ns: this.namespaces, + load: "all", + preload: this.languages, + initImmediate: false, + defaultNS: "default", + interpolation: { + format, + escapeValue: false, + }, + }); + } +} + +function format(value: any, format?: string | undefined, lng?: string): string { + switch (format) { + case "number": { + const hasDecimals = value >= 1_000_000 || !Number.isInteger(+value); + const digits = hasDecimals ? 2 : 0; + + const formatOptions = { + maximumFractionDigits: digits, + minimumFractionDigits: digits, + }; + + if ((value as number) >= 1_000_000) { + const [number, suffix] = abbreviationNumber(value); + return `${Intl.NumberFormat(lng, formatOptions).format(number)}${suffix}`; + } + + return Intl.NumberFormat(lng, formatOptions).format(value as number); + } + } + + return value; +} \ No newline at end of file diff --git a/packages/discord/src/services/member.service.ts b/packages/discord/src/services/member.service.ts index c00d4d51a..5575fa6d5 100644 --- a/packages/discord/src/services/member.service.ts +++ b/packages/discord/src/services/member.service.ts @@ -15,10 +15,7 @@ export class MemberService { public constructor(private readonly rest: RestClient) {} public async addRole(guildId: string, userId: string, roleId: string) { - const response = await this.rest.put( - `/guilds/${guildId}/members/${userId}/roles/${roleId}`, undefined - ); - + const response = await this.rest.put(`/guilds/${guildId}/members/${userId}/roles/${roleId}`, {}); return parseDiscordResponse(response); } diff --git a/packages/discord/src/services/paginate.service.ts b/packages/discord/src/services/paginate.service.ts index d53215e53..ac7295d12 100644 --- a/packages/discord/src/services/paginate.service.ts +++ b/packages/discord/src/services/paginate.service.ts @@ -1,300 +1,367 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { ButtonStyle } from "discord-api-types/v10"; -import { Canvas } from "skia-canvas"; -import { Service } from "typedi"; - -import { - ActionRowBuilder, - ButtonBuilder, - EmbedBuilder, - type IMessage, - type LocalizationString, - type LocalizeFunction, - Message, - SelectMenuBuilder, - SelectMenuOptionBuilder, -} from "#messages"; -import { Interaction } from "#interaction"; -import type { AbstractCommandListener, CommandContext, InteractionHook } from "#command"; - -type PaginateInteractionContent = IMessage | Message | EmbedBuilder | Canvas; - -type PaginateInteractionContentGenerator = ( - t: LocalizeFunction -) => PaginateInteractionContent | Promise; - -export type Page = PageInput & ({ subPages: SubPage[] } | { generator: PaginateInteractionContentGenerator }); -export type SubPage = PageInput & { generator: PaginateInteractionContentGenerator }; - -interface PageInput { - label: LocalizationString; - emoji?: LocalizationString | false; -} - -type PageId = `${number}|${number}`; - -@Service() -export class PaginateService { - /** - * - * @param context The context of the command - * @param pages The array of pages to paginate against - * @param timeout When to stop the pagination (ms), defaults to 300000 - */ - public async paginate(context: CommandContext, pages: Page[], timeout = 300_000) { - const cache = new Map(); - const t = context.t(); - - const getMessage = async (index: number, subIndex: number) => { - const pageId: PageId = `${index}|${subIndex}`; - if (cache.has(pageId)) return cache.get(pageId)!; - - const page = pages[index]; - let content: PaginateInteractionContent; - - if ("subPages" in page) { - const subPage = page.subPages[subIndex]; - content = await subPage.generator(t); - } else { - content = await page.generator(t); - } - - const message = await this.toMessage(content); - cache.set(pageId, message); - - return message; - }; - - // If there is only one page with no sub pages, return the message immediately without pagination - if (pages.length === 1 && "generator" in pages[0]) return getMessage(0, 0); - - const userId = context.getInteraction().getUserId(); - const listener = context.getListener(); - - let currentIndex = 0; - let currentSubIndex = 0; - - const mainController = new PageController(pages, currentIndex); - - const page = pages[currentIndex]; - let subController = "subPages" in page && page.subPages.length > 1 ? new PageController(page.subPages, currentSubIndex) : undefined; - - mainController.register(listener, (interaction, index) => handler(interaction, index, 0)); - subController?.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); - - async function handler(interaction: Interaction, index: number, subIndex: number) { - interaction.setLocale(t.locale); - - // Send an ephemeral preview if the user is not the one who initiated the interaction - if (interaction.getUserId() !== userId) { - const message = await getMessage(index, subIndex); - return interaction.sendFollowup({ ...message, components: [], ephemeral: true }); - } - - if (index !== currentIndex) { - subController?.unregister(listener); - mainController.switchPage(index); - - currentIndex = index; - currentSubIndex = 0; - - if ("subPages" in pages[index] && pages[index].subPages.length > 1) { - subController = new PageController(pages[index].subPages, currentSubIndex); - subController.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); - } else { - subController = undefined; - } - } else if (subIndex !== currentSubIndex) { - subController?.switchPage(subIndex); - currentSubIndex = subIndex; - } - - const message = await getMessage(index, subIndex); - - message.components = [mainController.getActionRow(), subController?.getActionRow()] - .filter((row) => row !== undefined); - - return context.reply(message); - } - - function onTimeout() { - mainController.unregister(listener); - subController?.unregister(listener); - cache.clear(); - return context.reply({ components: [] }); - } - - setTimeout(onTimeout, timeout); - - const message = await getMessage(currentIndex, currentSubIndex); - message.components = [mainController.getActionRow(), subController?.getActionRow()] - .filter((row) => row !== undefined); - - return message; - } - - /** - * - * @param context The context of the command - * @param pages The array of pages to paginate against - * @param forwardButton The button to use for forward pagination - * @param backwardButton The button to use for back pagination - * @param invertButtons Whether to invert the buttons (backward becomes forward, forward becomes backward) - * @param startingIndex The starting page - * @param timeout When to stop the pagination (ms), defaults to 300000 - */ - public async scrollingPagination( - context: CommandContext, - pages: PaginateInteractionContentGenerator[], - forwardButton?: ButtonBuilder, - backwardButton?: ButtonBuilder, - invertButtons = false, - startingIndex = 0, - timeout = 300_000 - ) { - const currentIndex = startingIndex; - const cache = new Map(); - const t = context.t(); - - const getMessage = async (index: number) => { - if (cache.has(index)) return cache.get(index)!; - - const content = await pages[index](t); - const message = await this.toMessage(content); - cache.set(index, message); - - return message; - }; - - if (pages.length === 1) return getMessage(currentIndex); - - const userId = context.getInteraction().getUserId(); - - const controller = [ - backwardButton ?? new ButtonBuilder().emoji(t("emojis:backward")), - forwardButton ?? new ButtonBuilder().emoji(t("emojis:forward")), - ]; - - if (invertButtons) controller.reverse(); - - const listener = context.getListener(); - - controller.forEach((component, i) => { - listener.addHook(component.getCustomId(), async (interaction) => { - interaction.setLocale(t.locale); - - let page: number; - - if (i === 0) { - // Backwards - page = startingIndex == 0 ? pages.length - 1 : startingIndex - 1; - } else { - // Forwards - page = startingIndex == pages.length - 1 ? 0 : startingIndex + 1; - } - - const message = await getMessage(page); - - if (interaction.getUserId() === userId) { - startingIndex = page; - message.components = [new ActionRowBuilder(controller)]; - return context.reply(message); - } - - return interaction.sendFollowup({ ...message, components: [], ephemeral: true }); - }); - }); - - function onTimeout() { - controller.forEach((component) => listener.removeHook(component.getCustomId())); - context.reply({ components: [] }); - cache.clear(); - } - - setTimeout(onTimeout, timeout); - - const message = await getMessage(startingIndex); - message.components = [new ActionRowBuilder(controller)]; - - return message; - } - - private async toMessage(content: PaginateInteractionContent): Promise { - if (content instanceof Message) return content; - if (content instanceof EmbedBuilder) return new Message({ embeds: [content] }); - if (content instanceof Canvas) return new Message({ - files: [{ name: "image.png", data: await content.toBuffer("png"), type: "image/png" }], - attachments: [], - }); - - return new Message(content); - } -} - -class PageController { - #menu: SelectMenuBuilder | ButtonBuilder[]; - - public constructor(pages: PageInput[], selected: number) { - if (pages.length > 5) { - const menu = new SelectMenuBuilder(); - - pages.forEach((page, index) => { - const option = new SelectMenuOptionBuilder().label(page.label).value(`${index}`); - if (page.emoji) option.emoji(page.emoji); - menu.option(option); - }); - - menu.activeOption(selected); - this.#menu = menu; - } else { - this.#menu = pages.map((page, index) => { - const button = new ButtonBuilder().label(page.label).style(ButtonStyle.Secondary); - if (page.emoji) button.emoji(page.emoji); - if (index === selected) button.style(ButtonStyle.Primary); - return button; - }); - } - } - - public switchPage(index: number) { - if (this.#menu instanceof SelectMenuBuilder) { - this.#menu.activeOption(index); - return; - } - - this.#menu.forEach((button, i) => button.style(i === index ? ButtonStyle.Primary : ButtonStyle.Secondary)); - } - - public getActionRow(): ActionRowBuilder { - if (this.#menu instanceof SelectMenuBuilder) return new ActionRowBuilder([this.#menu]); - return new ActionRowBuilder(this.#menu); - } - - public register( - listener: AbstractCommandListener, - handler: (interaction: Interaction, index: number) => ReturnType - ) { - if (this.#menu instanceof SelectMenuBuilder) { - return listener.addHook(this.#menu.getCustomId(), (interaction) => { - const index = Number(interaction.getData().values[0]); - return handler(interaction, index); - }); - } - - this.#menu.forEach((button, index) => { - listener.addHook(button.getCustomId(), (interaction) => handler(interaction, index)); - }); - } - - public unregister(listener: AbstractCommandListener) { - if (this.#menu instanceof SelectMenuBuilder) listener.removeHook(this.#menu.getCustomId()); - else this.#menu.forEach((button) => listener.removeHook(button.getCustomId())); - } -} +/** + * Copyright (c) Statsify + * + * This source code is licensed under the GNU GPL v3 license found in the + * LICENSE file in the root directory of this source tree. + * https://github.com/Statsify/statsify/blob/main/LICENSE + */ + +import { ButtonStyle } from "discord-api-types/v10"; +import { Canvas } from "skia-canvas"; + +import { + ActionRowBuilder, + ButtonBuilder, + EmbedBuilder, + type IMessage, + type LocalizationString, + type LocalizeFunction, + Message, + SelectMenuBuilder, + SelectMenuOptionBuilder, +} from "#messages"; +import { Interaction } from "#interaction"; +import type { + AbstractCommandListener, + CommandContext, + InteractionHook, +} from "#command"; + +type PaginateInteractionContent = IMessage | Message | EmbedBuilder | Canvas; + +type PaginateInteractionContentGenerator = ( + t: LocalizeFunction, +) => PaginateInteractionContent | Promise; + +export type Page = PageInput & + ( + | { subPages: SubPage[] } + | { generator: PaginateInteractionContentGenerator } + ); +export type SubPage = PageInput & { + generator: PaginateInteractionContentGenerator; +}; + +interface PageInput { + label: LocalizationString; + emoji?: LocalizationString | false; +} + +type PageId = `${number}|${number}`; + +/** + * + * @param context The context of the command + * @param pages The array of pages to paginate against + * @param timeout When to stop the pagination (ms), defaults to 300000 + */ +export async function paginate( + context: CommandContext, + pages: Page[], + timeout = 300_000, +) { + const cache = new Map(); + const t = context.t(); + + const getMessage = async (index: number, subIndex: number) => { + const pageId: PageId = `${index}|${subIndex}`; + if (cache.has(pageId)) return cache.get(pageId)!; + + const page = pages[index]; + let content: PaginateInteractionContent; + + if ("subPages" in page) { + const subPage = page.subPages[subIndex]; + content = await subPage.generator(t); + } else { + content = await page.generator(t); + } + + const message = await contentToMessage(content); + cache.set(pageId, message); + + return message; + }; + + // If there is only one page with no sub pages, return the message immediately without pagination + if (pages.length === 1 && "generator" in pages[0]) return getMessage(0, 0); + + const userId = context.getInteraction().getUserId(); + const listener = context.getListener(); + + let currentIndex = 0; + let currentSubIndex = 0; + + const mainController = new PageController(pages, currentIndex); + + const page = pages[currentIndex]; + let subController = + "subPages" in page && page.subPages.length > 1 + ? new PageController(page.subPages, currentSubIndex) + : undefined; + + mainController.register(listener, (interaction, index) => + handler(interaction, index, 0), + ); + subController?.register(listener, (interaction, subIndex) => + handler(interaction, currentIndex, subIndex), + ); + + async function handler( + interaction: Interaction, + index: number, + subIndex: number, + ) { + interaction.setLocale(t.locale); + + // Send an ephemeral preview if the user is not the one who initiated the interaction + if (interaction.getUserId() !== userId) { + const message = await getMessage(index, subIndex); + return interaction.sendFollowup({ + ...message, + components: [], + ephemeral: true, + }); + } + + if (index !== currentIndex) { + subController?.unregister(listener); + mainController.switchPage(index); + + currentIndex = index; + currentSubIndex = 0; + + if ("subPages" in pages[index] && pages[index].subPages.length > 1) { + subController = new PageController( + pages[index].subPages, + currentSubIndex, + ); + subController.register(listener, (interaction, subIndex) => + handler(interaction, currentIndex, subIndex), + ); + } else { + subController = undefined; + } + } else if (subIndex !== currentSubIndex) { + subController?.switchPage(subIndex); + currentSubIndex = subIndex; + } + + const message = await getMessage(index, subIndex); + + message.components = [ + mainController.getActionRow(), + subController?.getActionRow(), + ].filter((row) => row !== undefined); + + return context.reply(message); + } + + function onTimeout() { + mainController.unregister(listener); + subController?.unregister(listener); + cache.clear(); + return context.reply({ components: [] }); + } + + setTimeout(onTimeout, timeout); + + const message = await getMessage(currentIndex, currentSubIndex); + message.components = [ + mainController.getActionRow(), + subController?.getActionRow(), + ].filter((row) => row !== undefined); + + return message; +} + +/** + * + * @param context The context of the command + * @param pages The array of pages to paginate against + * @param forwardButton The button to use for forward pagination + * @param backwardButton The button to use for back pagination + * @param invertButtons Whether to invert the buttons (backward becomes forward, forward becomes backward) + * @param startingIndex The starting page + * @param timeout When to stop the pagination (ms), defaults to 300000 + */ +export async function scrollingPagination( + context: CommandContext, + pages: PaginateInteractionContentGenerator[], + forwardButton?: ButtonBuilder, + backwardButton?: ButtonBuilder, + invertButtons = false, + startingIndex = 0, + timeout = 300_000, +) { + let currentIndex = startingIndex; + const cache = new Map(); + const t = context.t(); + + const getMessage = async (index: number) => { + if (cache.has(index)) return cache.get(index)!; + + const content = await pages[index](t); + const message = await contentToMessage(content); + cache.set(index, message); + + return message; + }; + + if (pages.length === 1) return getMessage(currentIndex); + + const userId = context.getInteraction().getUserId(); + + const controller = [ + backwardButton ?? new ButtonBuilder().emoji(t("emojis:backward")), + forwardButton ?? new ButtonBuilder().emoji(t("emojis:forward")), + ]; + + if (invertButtons) controller.reverse(); + + const listener = context.getListener(); + + for (const [index, component] of controller.entries()) { + listener.addHook(component.getCustomId(), async (interaction) => { + interaction.setLocale(t.locale); + + let page: number; + + if (index === 0) { + // Backwards + page = currentIndex === 0 ? pages.length - 1 : currentIndex - 1; + } else { + // Forwards + page = currentIndex === pages.length - 1 ? 0 : currentIndex + 1; + } + + const message = await getMessage(page); + + if (interaction.getUserId() === userId) { + currentIndex = page; + message.components = [new ActionRowBuilder(controller)]; + return context.reply(message); + } + + return interaction.sendFollowup({ + ...message, + components: [], + ephemeral: true, + }); + }); + } + + function onTimeout() { + for (const component of controller) { + listener.removeHook(component.getCustomId()); + } + context.reply({ components: [] }); + cache.clear(); + } + + setTimeout(onTimeout, timeout); + + const message = await getMessage(currentIndex); + message.components = [new ActionRowBuilder(controller)]; + + return message; +} + +async function contentToMessage( + content: PaginateInteractionContent, +): Promise { + if (content instanceof Message) return content; + if (content instanceof EmbedBuilder) + return new Message({ embeds: [content] }); + if (content instanceof Canvas) + return new Message({ + files: [ + { + name: "image.png", + data: await content.toBuffer("png"), + type: "image/png", + }, + ], + attachments: [], + }); + + return new Message(content); +} + +class PageController { + #menu: SelectMenuBuilder | ButtonBuilder[]; + + public constructor(pages: PageInput[], selected: number) { + if (pages.length > 5) { + const menu = new SelectMenuBuilder(); + + for (const [index, page] of pages.entries()) { + const option = new SelectMenuOptionBuilder() + .label(page.label) + .value(`${index}`); + if (page.emoji) option.emoji(page.emoji); + menu.option(option); + } + + menu.activeOption(selected); + this.#menu = menu; + } else { + this.#menu = pages.map((page, index) => { + const button = new ButtonBuilder() + .label(page.label) + .style(ButtonStyle.Secondary); + if (page.emoji) button.emoji(page.emoji); + if (index === selected) button.style(ButtonStyle.Primary); + return button; + }); + } + } + + public switchPage(index: number) { + if (this.#menu instanceof SelectMenuBuilder) { + this.#menu.activeOption(index); + return; + } + + for (const [i, button] of this.#menu.entries()) { + button.style(i === index ? ButtonStyle.Primary : ButtonStyle.Secondary); + } + } + + public getActionRow(): ActionRowBuilder { + if (this.#menu instanceof SelectMenuBuilder) + return new ActionRowBuilder([this.#menu]); + return new ActionRowBuilder(this.#menu); + } + + public register( + listener: AbstractCommandListener, + handler: ( + interaction: Interaction, + index: number, + ) => ReturnType, + ) { + if (this.#menu instanceof SelectMenuBuilder) { + return listener.addHook(this.#menu.getCustomId(), (interaction) => { + const index = Number(interaction.getData().values[0]); + return handler(interaction, index); + }); + } + + for (const [index, button] of this.#menu.entries()) { + listener.addHook(button.getCustomId(), (interaction) => + handler(interaction, index), + ); + } + } + + public unregister(listener: AbstractCommandListener) { + if (this.#menu instanceof SelectMenuBuilder) { + listener.removeHook(this.#menu.getCustomId()); + } else { + for (const button of this.#menu) { + listener.removeHook(button.getCustomId()); + } + } + } +} diff --git a/packages/discord/src/util/error.message.ts b/packages/discord/src/util/error.message.ts index 2858d0744..09c64741f 100644 --- a/packages/discord/src/util/error.message.ts +++ b/packages/discord/src/util/error.message.ts @@ -31,7 +31,7 @@ export class ErrorMessage extends Message { public constructor( title: LocalizationString, description: LocalizationString, - options?: ErrorMessageOptions + options?: ErrorMessageOptions, ); public constructor( titleOrKey: LocalizationString, @@ -41,7 +41,7 @@ export class ErrorMessage extends Message { thumbnail, buttons = [], color = STATUS_COLORS.error, - }: ErrorMessageOptions = {} + }: ErrorMessageOptions = {}, ) { const embed = new EmbedBuilder().color(color); @@ -59,16 +59,15 @@ export class ErrorMessage extends Message { if (image) { data.files = [image]; - embed.image(`attachment://${data.files[0].name}`); } else if (thumbnail) { data.files = [thumbnail]; - embed.thumbnail(`attachment://${data.files[0].name}`); } else { const errorIcon = readFileSync(getLogoPath("error", 52)); data.files = [{ name: "error.png", data: errorIcon, type: "image/png" }]; - embed.thumbnail(`attachment://${data.files[0].name}`); } + embed.thumbnail(`attachment://${data.files[0].name}`); + super(data); } } diff --git a/packages/discord/src/util/parse-discord-error.ts b/packages/discord/src/util/parse-discord-error.ts index 86f89bf46..2b5c1cce4 100644 --- a/packages/discord/src/util/parse-discord-error.ts +++ b/packages/discord/src/util/parse-discord-error.ts @@ -12,10 +12,9 @@ import type { RestClient } from "tiny-discord"; export const parseDiscordResponse = (response: RestClient.RequestResult): T => { if (response.headers["content-type"] !== "application/json") return noop(); - // @ts-ignore tiny-discord doesn't have a proper types yet + // @ts-expect-error tiny-discord doesn't have a proper types yet if (response.status >= 200 && response.status < 300) return response.body.json as T; - // @ts-ignore tiny-discord doesn't have a proper types yet const body = response.body.json as Record; let message = body.message; @@ -30,7 +29,7 @@ export const parseDiscordResponse = (response: RestClient.RequestResult): T = export const parseDiscordError = (error: any = {}, errorKey = ""): string => { if (typeof error.message === "string") - return `${errorKey.length ? `${errorKey} - ${error.code}` : `${error.code}`}: ${ + return `${errorKey.length > 0 ? `${errorKey} - ${error.code}` : `${error.code}`}: ${ error.message }`.trim(); @@ -47,8 +46,13 @@ export const parseDiscordError = (error: any = {}, errorKey = ""): string => { } if (typeof value === "string") message += value; - else if ("_errors" in value) - for (const error of value._errors) message += parseDiscordError(error, nextKey); + else if ("_errors" in value) { + // Discord's api uses dangling underscores when reporting errors + // oxlint-disable-next-line no-underscore-dangle + for (const error of value._errors) { + message += parseDiscordError(error, nextKey); + } + } else message += parseDiscordError(value, nextKey); } diff --git a/packages/discord/tsconfig.json b/packages/discord/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/discord/tsconfig.json +++ b/packages/discord/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/logger/eslint.config.js b/packages/logger/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/logger/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/logger/package.json b/packages/logger/package.json index c15f89f7c..f40ff474e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -6,13 +6,14 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "chalk": "5.6.0", "luxon": "^3.5.0" }, @@ -20,4 +21,4 @@ "@nestjs/common": "^11.1.6", "@types/luxon": "^3.4.2" } -} \ No newline at end of file +} diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index 1d9975ed6..d2f715e65 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -23,6 +23,15 @@ export const STATUS_COLORS = { fatal: 0x81181A, } as const; +const ColorByLogLevel: Record = { + debug: STATUS_COLORS.debug, + warn: STATUS_COLORS.warn, + error: STATUS_COLORS.error, + verbose: STATUS_COLORS.info, + log: STATUS_COLORS.success, + fatal: STATUS_COLORS.fatal, +}; + const isProduction = await config("environment") === "prod"; /** @@ -59,7 +68,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "log"); + Logger.printMessage(messages, context, "log"); } public error(message: any, context?: string): void; @@ -69,20 +78,22 @@ export class Logger implements LoggerService { return; } + let normalizedMessage = message; + if (message instanceof Error) { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); transaction?.setStatus("internal_error"); Sentry.captureException(message); - message = message.stack; + normalizedMessage = message.stack; } const { messages, context } = this.getContextAndMessages([ - message, + normalizedMessage, ...optionalParameters, ]); - this.printMessage(messages, context, "error", "stderr", "📉"); + Logger.printMessage(messages, context, "error", "stderr", "📉"); } public warn(message: any, context?: string): void; @@ -97,7 +108,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "warn"); + Logger.printMessage(messages, context, "warn"); } public debug(message: any, context?: string): void; @@ -112,7 +123,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "debug"); + Logger.printMessage(messages, context, "debug"); } public verbose(message: any, context?: string): void; @@ -127,7 +138,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "verbose"); + Logger.printMessage(messages, context, "verbose"); } public fatal(message: any, context?: string): void; @@ -137,20 +148,22 @@ export class Logger implements LoggerService { return; } + let normalizedMessage = message; + if (message instanceof Error) { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); transaction?.setStatus("internal_error"); Sentry.captureException(message); - message = message.stack; + normalizedMessage = message.stack; } const { messages, context } = this.getContextAndMessages([ - message, + normalizedMessage, ...optionalParameters, ]); - this.printMessage(messages, context, "fatal", "stderr", "📉"); + Logger.printMessage(messages, context, "fatal", "stderr", "📉"); } public setLogLevels(levels: LogLevel[]) { @@ -187,29 +200,7 @@ export class Logger implements LoggerService { return { messages, context: this.context }; } - private getColorByLogLevel(logLevel: LogLevel) { - switch (logLevel) { - case "debug": - return STATUS_COLORS.debug; - - case "warn": - return STATUS_COLORS.warn; - - case "error": - return STATUS_COLORS.error; - - case "verbose": - return STATUS_COLORS.info; - - case "log": - return STATUS_COLORS.success; - - case "fatal": - return STATUS_COLORS.fatal; - } - } - - private getTimeStamp() { + private static getTimeStamp() { if (isProduction) return DateTime.now().toFormat("h:mma"); const now = Date.now(); @@ -225,18 +216,18 @@ export class Logger implements LoggerService { return diff; } - private printMessage( + private static printMessage( messages: unknown[], context = "Default", logLevel: LogLevel = "log", writeStreamType: "stdout" | "stderr" = "stdout", icon = "📈" ) { - const color = this.getColorByLogLevel(logLevel); + const color = ColorByLogLevel[logLevel]; for (const message of messages) { const output = typeof message === "object" ? JSON.stringify(message) : message; - const timeStamp = this.getTimeStamp(); + const timeStamp = Logger.getTimeStamp(); const computedMessage = `${chalk.bold(`${icon}`)} ${chalk.hex(color.toString(16))( context @@ -247,6 +238,8 @@ export class Logger implements LoggerService { } } + + if (import.meta.vitest) { const { suite, it, expect, vi } = import.meta.vitest; diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/math/eslint.config.js b/packages/math/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/math/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/math/package.json b/packages/math/package.json index b7e1ae322..7f4d1b280 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -6,11 +6,12 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12" + "@swc/helpers": "^0.5.23" } -} \ No newline at end of file +} diff --git a/packages/math/src/index.ts b/packages/math/src/index.ts index 6a7dac212..1dbf1fa83 100644 --- a/packages/math/src/index.ts +++ b/packages/math/src/index.ts @@ -33,9 +33,9 @@ export const ratio = (n1 = 0, n2 = 0, multiply = 1) => { return roundTo(result * multiply); } else if (n1 === 0 && n2 === 0) { return 0; - } else { - return roundTo(n1 * multiply) || 0; } + return roundTo(n1 * multiply) || 0; + }; export const add = (...args: number[]): number => diff --git a/packages/math/tsconfig.json b/packages/math/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/math/tsconfig.json +++ b/packages/math/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/rendering/eslint.config.js b/packages/rendering/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/rendering/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/rendering/package.json b/packages/rendering/package.json index 8acf09b38..1a56658c8 100644 --- a/packages/rendering/package.json +++ b/packages/rendering/package.json @@ -15,16 +15,17 @@ }, "scripts": { "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", "@statsify/assets": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "1.11.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "typedi": "^0.10.0" }, "imports": { @@ -49,4 +50,4 @@ "default": "./dist/jsx/index.js" } } -} \ No newline at end of file +} diff --git a/packages/rendering/src/colors/index.ts b/packages/rendering/src/colors/index.ts index af00d401d..17f3681e8 100644 --- a/packages/rendering/src/colors/index.ts +++ b/packages/rendering/src/colors/index.ts @@ -44,7 +44,7 @@ export const parseColor = (color: string): RGBA => { .split(")")[0] .split(",") .map((o) => +o) as RGBA; - } else { - return [0, 0, 0, 0]; } + + return [0, 0, 0, 0]; }; diff --git a/packages/rendering/src/font/font-renderer.ts b/packages/rendering/src/font/font-renderer.ts index bd5d6d775..ab54eacb4 100644 --- a/packages/rendering/src/font/font-renderer.ts +++ b/packages/rendering/src/font/font-renderer.ts @@ -8,10 +8,10 @@ import _positions from "../../positions.json" with { type: "json" }; import _sizes from "../../sizes.json" with { type: "json" }; -import { - type Canvas, - type CanvasRenderingContext2D, - type ImageData, +import type { + Canvas, + CanvasRenderingContext2D, + ImageData, } from "skia-canvas"; import { type TextNode, type Token, tokens } from "./tokens.js"; import { createCanvas } from "../canvas.js"; @@ -47,11 +47,13 @@ export class FontRenderer { public async loadImages(fontPath: string) { const files = await readdir(fontPath); - const pictures = files.filter((file) => file.endsWith(".png")); - - for (const file of pictures) { + const pictures = await Promise.all(files.filter((file) => file.endsWith(".png")).map(async (file) => { const image = await loadImage(join(fontPath, file)); + const id = file.replace("unicode_page_", "").replace(".png", ""); + return [id, image] as const; + })); + for (const [id, image] of pictures) { const canvas = createCanvas(image.width, image.height); const ctx = canvas.getContext("2d"); @@ -62,15 +64,12 @@ export class FontRenderer { this.canvases.set(ctx, canvas); this.scales.set(ctx, image.width / 256); - this.images.set( - file.replace("unicode_page_", "").replace(".png", ""), - ctx - ); + this.images.set(id, ctx); } } public measureText(nodes: TextNode[]): { width: number; height: number } { - if (!nodes.length) return { width: 0, height: 0 }; + if (nodes.length === 0) return { width: 0, height: 0 }; let width = 0; let largestSize = nodes[0].size; @@ -143,7 +142,7 @@ export class FontRenderer { const nodes: TextNode[] = []; for (const part of parts) { - if (!part.length) continue; + if (part.length === 0) continue; let token: Token | null = null; let matches: RegExpMatchArray | null = null; @@ -168,9 +167,9 @@ export class FontRenderer { if (matches) text = text.slice(matches[0].length); - state = { ...state, ...effect }; + Object.assign(state, effect); - if (!text.length) continue; + if (text.length === 0) continue; const node: TextNode = { ...state, @@ -268,7 +267,7 @@ export class FontRenderer { bold: boolean ) { // Minecraft has weird spacing for the space - let gap = size * (width + (char == " " ? -2 : 2) * scale); + let gap = size * (width + (char === " " ? -2 : 2) * scale); if (bold) { gap += scale * size; diff --git a/packages/rendering/src/hooks/useGradient.ts b/packages/rendering/src/hooks/useGradient.ts index 3e6b377f2..09fb2f7bf 100644 --- a/packages/rendering/src/hooks/useGradient.ts +++ b/packages/rendering/src/hooks/useGradient.ts @@ -34,7 +34,9 @@ export function useGradient( ctx.createLinearGradient(x, y, x + width, y) : ctx.createLinearGradient(x, y, x, y + height); - colors.forEach(([offset, color]) => gradient.addColorStop(offset, color)); + for (const [offset, color] of colors) { + gradient.addColorStop(offset, color); + } return gradient; }; diff --git a/packages/rendering/src/index.ts b/packages/rendering/src/index.ts index 1d20f2e01..64b7c22cf 100644 --- a/packages/rendering/src/index.ts +++ b/packages/rendering/src/index.ts @@ -6,7 +6,6 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -/* eslint-disable @typescript-eslint/no-namespace */ export * from "./colors/index.js"; export * from "./canvas.js"; export * from "./font/index.js"; @@ -18,10 +17,8 @@ import type * as JSXInternal from "./jsx/index.js"; declare global { namespace JSX { - // @ts-ignore Typescript for the love of god won't let me override this interface type IntrinsicElements = JSXInternal.IntrinsicProps; - // @ts-ignore Typescript for the love of god won't let me override this interface type Element = JSXInternal.ElementNode; type Children = JSXInternal.Children; diff --git a/packages/rendering/src/intrinsics/Box.ts b/packages/rendering/src/intrinsics/Box.ts index e375c0994..d65393802 100644 --- a/packages/rendering/src/intrinsics/Box.ts +++ b/packages/rendering/src/intrinsics/Box.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type CanvasRenderingContext2D } from "skia-canvas"; +import type { CanvasRenderingContext2D } from "skia-canvas"; import type * as JSX from "#jsx"; import type { DeferredGradient } from "#hooks"; diff --git a/packages/rendering/src/jsx-runtime/convert.ts b/packages/rendering/src/jsx-runtime/convert.ts index efe2a58b0..1b5747906 100644 --- a/packages/rendering/src/jsx-runtime/convert.ts +++ b/packages/rendering/src/jsx-runtime/convert.ts @@ -156,7 +156,7 @@ export const elementToNode = ( let nodeOtherLength = 0; - node.children.forEach((child) => { + for (const child of node.children) { sideData = gatherSideData(child, side, sideData); if (typeof child[other].size === "string" && child[other].size !== "remaining") { @@ -170,7 +170,7 @@ export const elementToNode = ( const childOtherLength = getTotalSize(child[other]); if (childOtherLength > nodeOtherLength) nodeOtherLength = childOtherLength; } - }); + } node[other].minSize = nodeOtherLength; node[side].minSize = processSideData(sideData); diff --git a/packages/rendering/src/jsx/create-instructions.ts b/packages/rendering/src/jsx/create-instructions.ts index cdfb7c8dc..b5e268c1e 100644 --- a/packages/rendering/src/jsx/create-instructions.ts +++ b/packages/rendering/src/jsx/create-instructions.ts @@ -67,7 +67,7 @@ export const createInstructions = ( node.children[i] = createInstructions(child, child.component ?? component); } - if (!remaining.length) return node as Instruction; + if (remaining.length === 0) return node as Instruction; const remainingSideLength = remainingSide / remaining.length; diff --git a/packages/rendering/src/jsx/render.ts b/packages/rendering/src/jsx/render.ts index 2dea261d8..b1e3a1e1b 100644 --- a/packages/rendering/src/jsx/render.ts +++ b/packages/rendering/src/jsx/render.ts @@ -7,7 +7,7 @@ */ import * as Sentry from "@sentry/node"; -import { type Canvas, type CanvasRenderingContext2D } from "skia-canvas"; +import type { Canvas, CanvasRenderingContext2D } from "skia-canvas"; import { Container } from "typedi"; import { FontRenderer } from "#font"; import { IntrinsicRenders, intrinsicRenders } from "./instrinsics.js"; @@ -22,7 +22,7 @@ import type { Theme, } from "./types.js"; -const _render = ( +const renderRecursive = ( ctx: CanvasRenderingContext2D, context: ComputedThemeContext, intrinsicElements: IntrinsicRenders, @@ -81,7 +81,7 @@ const _render = ( applyDelta(getPositionalDelta(instruction, side), side); - instruction.children.forEach((child) => { + for (const child of instruction.children) { const size = getTotalSize(child[side]); switch (child.style.align) { @@ -92,12 +92,12 @@ const _render = ( const centerDelta = (instruction[oppositeSide].size - oppositeSize) / 2; applyDelta(centerDelta, oppositeSide); - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); applyDelta(-centerDelta, oppositeSide); break; } case "left": - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); break; case "right": { const oppositeSide = side === "x" ? "y" : "x"; @@ -108,14 +108,14 @@ const _render = ( child[oppositeSide].padding2); applyDelta(delta, oppositeSide); - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); applyDelta(-delta, oppositeSide); break; } } applyDelta(size, side); - }); + } }; export function render(node: ElementNode, theme?: Theme): Canvas { @@ -151,7 +151,7 @@ export function render(node: ElementNode, theme?: Theme): Canvas { if (!context.renderer) context.renderer = Container.get(FontRenderer); - _render( + renderRecursive( ctx, context, { ...intrinsicRenders, ...theme?.elements }, diff --git a/packages/rendering/tsconfig.json b/packages/rendering/tsconfig.json index ffd6d6582..6e5689bdc 100644 --- a/packages/rendering/tsconfig.json +++ b/packages/rendering/tsconfig.json @@ -6,7 +6,6 @@ "include": [ "src", "tests", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/schemas/eslint.config.js b/packages/schemas/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/schemas/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 5aac15176..bf915c65a 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -6,15 +6,16 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths --copy-files", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@nestjs/swagger": "^11.2.0", "@statsify/logger": "workspace:^", "@statsify/math": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "class-validator": "^0.14.1", "luxon": "^3.5.0" @@ -52,4 +53,4 @@ "default": "./dist/player/gamemodes/prefixes.js" } } -} \ No newline at end of file +} diff --git a/packages/schemas/src/game/game-modes.ts b/packages/schemas/src/game/game-modes.ts index e499b8486..ff214e21e 100644 --- a/packages/schemas/src/game/game-modes.ts +++ b/packages/schemas/src/game/game-modes.ts @@ -53,7 +53,7 @@ export class GameModes { this.hypixelModes = Object.fromEntries( modes .map((m) => { - if (typeof m.hypixel !== "string") return undefined; + if (typeof m.hypixel !== "string") return; const formatted = m.formatted ?? prettify((m as { api: string }).api); return [m.hypixel, formatted] as const; }).filter((entry) => entry !== undefined) diff --git a/packages/schemas/src/guild/index.ts b/packages/schemas/src/guild/index.ts index 4642a47db..33c427164 100644 --- a/packages/schemas/src/guild/index.ts +++ b/packages/schemas/src/guild/index.ts @@ -113,7 +113,8 @@ export class Guild { public cached?: boolean; public constructor(data: APIData = {}) { - this.id = data._id; + // oxlint-disable-next-line no-underscore-dangle + this.id = data._id; // Hypixel uses MongoDB which has object id fields that start with an underscore this.name = data.name; this.nameToLower = this.name?.toLowerCase(); this.description = data.description; diff --git a/packages/schemas/src/guild/member.ts b/packages/schemas/src/guild/member.ts index b736413d4..2664a8f5f 100644 --- a/packages/schemas/src/guild/member.ts +++ b/packages/schemas/src/guild/member.ts @@ -62,14 +62,12 @@ export class GuildMember { this.weekly = 0; this.monthly = 0; - Object.entries(data.expHistory as Record).forEach( - ([day, exp], index) => { + for (const [index, [day, exp]] of Object.entries(data.expHistory as Record).entries()) { this.expHistory[index] = exp; this.expHistoryDays[index] = day; if (index === 0) this.daily = exp; this.weekly += exp; - } - ); + } } public static isGuildMaster(member: GuildMember): boolean { diff --git a/packages/schemas/src/guild/util.ts b/packages/schemas/src/guild/util.ts index a885376e6..df31f70c5 100644 --- a/packages/schemas/src/guild/util.ts +++ b/packages/schemas/src/guild/util.ts @@ -22,9 +22,7 @@ export const getLevel = (exp: number) => { let level = 0; for (let i = 0; i <= 1000; i += 1) { - let need = 0; - - need = i >= REQUIRED_GEXP.length ? REQUIRED_GEXP.at(-1)! : REQUIRED_GEXP[i]; + const need = i >= REQUIRED_GEXP.length ? REQUIRED_GEXP.at(-1)! : REQUIRED_GEXP[i]; if (exp - need < 0) return { diff --git a/packages/schemas/src/metadata/deserialize.ts b/packages/schemas/src/metadata/deserialize.ts index 4ad72b48d..ef4ee5852 100644 --- a/packages/schemas/src/metadata/deserialize.ts +++ b/packages/schemas/src/metadata/deserialize.ts @@ -7,14 +7,17 @@ */ import { type Constructor, type Flatten, unflatten } from "@statsify/util"; -import { MetadataScanner } from "./metadata-scanner.js"; +import { scanMetadata } from "./metadata-scanner.js"; import { roundTo } from "@statsify/math"; import type { FieldMetadata } from "./metadata.interface.js"; -export const deserialize = (constructor: Constructor, instance: Flatten): T => { - const metadataEntries = MetadataScanner.scan(constructor) as [ +export const deserialize = ( + constructor: Constructor, + instance: Flatten, +): T => { + const metadataEntries = scanMetadata(constructor) as [ keyof Flatten, - FieldMetadata + FieldMetadata, ][]; const deserialized: Flatten = {} as Flatten; @@ -35,7 +38,9 @@ export const deserialize = (constructor: Constructor, instance: Flatten // If the value is numimercal round it to 2 digits of precision if (typeof deserialized[key] === "number") - deserialized[key] = roundTo(deserialized[key] as unknown as number) as any; + deserialized[key] = roundTo( + deserialized[key] as unknown as number, + ) as any; } // Unflatten the object to return the original type diff --git a/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts b/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts index b82181c49..4f10a81b1 100644 --- a/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts +++ b/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts @@ -13,7 +13,10 @@ import type { LeaderboardMetadata, TypeMetadata, } from "../metadata.interface.js"; -import type { HistoricalOptions, LeaderboardOptions } from "../field.options.js"; +import type { + HistoricalOptions, + LeaderboardOptions, +} from "../field.options.js"; const getLeaderboardName = (field: string) => { const ratioIndex = RATIOS.indexOf(field); @@ -55,9 +58,10 @@ export const getLeaderboardMetadata = ( typeMetadata: TypeMetadata, propertyKey: string, leaderboardOptions?: LeaderboardOptions, - historicalOptions?: HistoricalOptions + historicalOptions?: HistoricalOptions, ): { leaderboard: LeaderboardMetadata; historical: HistoricalMetadata } => { - const fieldName = leaderboardOptions?.fieldName ?? getLeaderboardName(propertyKey); + const fieldName = + leaderboardOptions?.fieldName ?? getLeaderboardName(propertyKey); const name = leaderboardOptions?.name ?? fieldName; const historicalFieldName = historicalOptions?.fieldName ?? fieldName; @@ -77,8 +81,6 @@ export const getLeaderboardMetadata = ( fieldName, name, }; - - historical = { ...leaderboard, fieldName: historicalFieldName, name: historicalName }; } else if (leaderboardOptions?.enabled === false) { leaderboard = { enabled: false, @@ -89,13 +91,6 @@ export const getLeaderboardMetadata = ( fieldName, name, }; - - historical = { - ...leaderboard, - ...historicalOptions, - fieldName: historicalFieldName, - name: historicalName, - }; } else { leaderboard = { enabled: true, @@ -107,17 +102,18 @@ export const getLeaderboardMetadata = ( additionalFields: leaderboardOptions?.additionalFields || [], extraDisplay: leaderboardOptions?.extraDisplay, formatter: leaderboardOptions?.formatter, - limit: leaderboardOptions?.limit ?? getDefaultLeaderboardLimit(propertyKey), + limit: + leaderboardOptions?.limit ?? getDefaultLeaderboardLimit(propertyKey), resetEvery: leaderboardOptions?.resetEvery, }; - - historical = { - ...leaderboard, - ...historicalOptions, - fieldName: historicalFieldName, - name: historicalName, - }; } + historical = { + ...leaderboard, + ...historicalOptions, + fieldName: historicalFieldName, + name: historicalName, + }; + return { leaderboard, historical }; }; diff --git a/packages/schemas/src/metadata/metadata-scanner.ts b/packages/schemas/src/metadata/metadata-scanner.ts index 070d47291..5a7d3ef1c 100644 --- a/packages/schemas/src/metadata/metadata-scanner.ts +++ b/packages/schemas/src/metadata/metadata-scanner.ts @@ -17,104 +17,109 @@ import type { Constructor } from "@statsify/util"; export type MetadataEntry = [string, FieldMetadata]; -export class MetadataScanner { - private static tokens: Map = new Map(); +const tokens = new Map(); - public static scan(target: Constructor) { - if (this.tokens.has(target)) return this.tokens.get(target)!; +export function scanMetadata(target: Constructor) { + if (tokens.has(target)) return tokens.get(target)!; - const metadata = this.getMetadataEntries(target); + const metadata = getMetadataEntries(target); - this.tokens.set(target, metadata); + tokens.set(target, metadata); - return metadata; - } - - private static getMetadataEntries( - constructor: Constructor, - base = "", - baseName = "" - ): MetadataEntry[] { - const classMetadata = Reflect.getMetadata( - METADATA_KEY, - constructor.prototype - ) as ClassMetadata; - - if (!classMetadata) return []; - - const entries = Object.entries(classMetadata); - const keys = Object.keys(classMetadata); - - const metadataEntries: MetadataEntry[] = []; - - entries.forEach(([key, value]) => { - const path = `${base ? `${base}.` : ""}${key}`; - const name = value.leaderboard.name ? - `${baseName ? `${baseName} ` : ""}${value.leaderboard.name}` : - baseName; - - const historicalName = value.historical.name ? - `${baseName ? `${baseName} ` : ""}${value.historical.name}` : - baseName; - - for (const ratio of LEADERBOARD_RATIO_KEYS) { - if (!ratio.includes(key)) continue; - - const remainingStats = ratio - .filter((r) => r !== key && keys.includes(r)) - .map((r) => `${base ? `${base}.` : ""}${r}`); - - if (!remainingStats.length) continue; - - value.leaderboard.additionalFields = remainingStats; - // TODO: Investigate if this is needed or if there is another way - // TODO: Does this break anything? - // ! This is needed for the ratios to work with sub modes - value.historical.additionalFields = remainingStats; - break; - } - - // Apply metadata to historical - if ( - !value.historical.additionalFields || - value.historical.additionalFields.length === 0 - ) - value.historical.additionalFields = value.leaderboard.additionalFields; + return metadata; +} - if (value.type.primitive || value.type.array) - return metadataEntries.push([ - path, - { - ...value, - leaderboard: { ...value.leaderboard, name }, - historical: { ...value.historical, name: historicalName }, - }, - ]); +function getMetadataEntries( + constructor: Constructor, + base = "", + baseName = "", +): MetadataEntry[] { + const classMetadata = Reflect.getMetadata( + METADATA_KEY, + constructor.prototype, + ) as ClassMetadata; + + if (!classMetadata) return []; + + const entries = Object.entries(classMetadata); + const keys = Object.keys(classMetadata); + + const metadataEntries: MetadataEntry[] = []; + + for (const [key, value] of entries) { + const path = `${base ? `${base}.` : ""}${key}`; + const name = value.leaderboard.name + ? `${baseName ? `${baseName} ` : ""}${value.leaderboard.name}` + : baseName; + + const historicalName = value.historical.name + ? `${baseName ? `${baseName} ` : ""}${value.historical.name}` + : baseName; + + for (const ratio of LEADERBOARD_RATIO_KEYS) { + if (!ratio.includes(key)) continue; + + const remainingStats = ratio + .filter((r) => r !== key && keys.includes(r)) + .map((r) => `${base ? `${base}.` : ""}${r}`); + + if (remainingStats.length === 0) continue; + + value.leaderboard.additionalFields = remainingStats; + // TODO: Investigate if this is needed or if there is another way + // TODO: Does this break anything? + // ! This is needed for the ratios to work with sub modes + value.historical.additionalFields = remainingStats; + break; + } + + // Apply metadata to historical + if ( + !value.historical.additionalFields || + value.historical.additionalFields.length === 0 + ) + value.historical.additionalFields = value.leaderboard.additionalFields; + + if (value.type.primitive || value.type.array) { + metadataEntries.push([ + path, + { + ...value, + leaderboard: { ...value.leaderboard, name }, + historical: { ...value.historical, name: historicalName }, + }, + ]); - // Carry the metadata down to the children - const subMetadataEntries = this.getMetadataEntries(value.type.type, path, name).map( - ([keyPath, metadata]) => { - if (!metadata.leaderboard.additionalFields?.length) - metadata.leaderboard.additionalFields = value.leaderboard.additionalFields; + continue; + } - if (!metadata.leaderboard.extraDisplay) - metadata.leaderboard.extraDisplay = value.leaderboard.extraDisplay; + // Carry the metadata down to the children + const subMetadataEntries = getMetadataEntries( + value.type.type, + path, + name, + ).map(([keyPath, metadata]) => { + if (!metadata.leaderboard.additionalFields?.length) + metadata.leaderboard.additionalFields = + value.leaderboard.additionalFields; - if (value.leaderboard.resetEvery && !metadata.leaderboard.resetEvery) - metadata.leaderboard.resetEvery = value.leaderboard.resetEvery; + if (!metadata.leaderboard.extraDisplay) + metadata.leaderboard.extraDisplay = value.leaderboard.extraDisplay; - if (!metadata.historical.additionalFields?.length) - metadata.historical.additionalFields = value.historical.additionalFields; + if (value.leaderboard.resetEvery && !metadata.leaderboard.resetEvery) + metadata.leaderboard.resetEvery = value.leaderboard.resetEvery; - return [keyPath, metadata] as MetadataEntry; - } - ); + if (!metadata.historical.additionalFields?.length) + metadata.historical.additionalFields = + value.historical.additionalFields; - metadataEntries.push(...subMetadataEntries); + return [keyPath, metadata] as MetadataEntry; }); - return metadataEntries; + metadataEntries.push(...subMetadataEntries); } + + return metadataEntries; } if (import.meta.vitest) { @@ -125,7 +130,9 @@ if (import.meta.vitest) { const stringMetadata = (name: string): FieldMetadata => { const lastIndexOfDot = name.lastIndexOf("."); - const fieldName = prettify(name.slice(Math.max(0, lastIndexOfDot === -1 ? 0 : lastIndexOfDot + 1))); + const fieldName = prettify( + name.slice(Math.max(0, lastIndexOfDot === -1 ? 0 : lastIndexOfDot + 1)), + ); return { leaderboard: { @@ -155,14 +162,14 @@ if (import.meta.vitest) { }; }; - suite("MetadataScanner", () => { + suite("Schema Metadata", () => { it("should read and write basic string metadata", () => { class Clazz { @Field() public fieldA: string; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ]); }); @@ -173,7 +180,7 @@ if (import.meta.vitest) { public fieldA: number; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -214,7 +221,7 @@ if (import.meta.vitest) { public fieldA: number; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -250,7 +257,7 @@ if (import.meta.vitest) { public fieldA: string[]; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -283,7 +290,7 @@ if (import.meta.vitest) { public fieldB: NestedClazz; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ["fieldB.fieldA", stringMetadata("fieldB.fieldA")], ["fieldB.fieldB.fieldA", stringMetadata("fieldB.fieldB.fieldA")], @@ -301,7 +308,7 @@ if (import.meta.vitest) { public fieldB: string; } - expect(MetadataScanner.scan(ChildClazz)).toEqual([ + expect(scanMetadata(ChildClazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ["fieldB", stringMetadata("fieldB")], ]); @@ -314,11 +321,13 @@ if (import.meta.vitest) { } class ParentClazz { - @Field({ leaderboard: { additionalFields: ["fieldA"], extraDisplay: "fieldA" } }) + @Field({ + leaderboard: { additionalFields: ["fieldA"], extraDisplay: "fieldA" }, + }) public fieldA: ChildClazz; } - const [[, { leaderboard }]] = MetadataScanner.scan(ParentClazz); + const [[, { leaderboard }]] = scanMetadata(ParentClazz); expect(leaderboard).toEqual({ enabled: true, diff --git a/packages/schemas/src/metadata/serialize.ts b/packages/schemas/src/metadata/serialize.ts index 71312d4a6..7f9416de2 100644 --- a/packages/schemas/src/metadata/serialize.ts +++ b/packages/schemas/src/metadata/serialize.ts @@ -6,17 +6,17 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { MetadataScanner } from "./metadata-scanner.js"; +import { scanMetadata } from "./metadata-scanner.js"; import type { Constructor, Flatten } from "@statsify/util"; import type { FieldMetadata } from "./metadata.interface.js"; export const serialize = ( constructor: Constructor, - instance: Flatten + instance: Flatten, ): Flatten => { - const metadataEntries = MetadataScanner.scan(constructor) as [ + const metadataEntries = scanMetadata(constructor) as [ keyof Flatten, - FieldMetadata + FieldMetadata, ][]; const serialized: Flatten = {} as Flatten; diff --git a/packages/schemas/src/player/gamemodes/duels/mode.ts b/packages/schemas/src/player/gamemodes/duels/mode.ts index 57cd014a0..9f218a630 100644 --- a/packages/schemas/src/player/gamemodes/duels/mode.ts +++ b/packages/schemas/src/player/gamemodes/duels/mode.ts @@ -37,7 +37,7 @@ export class BaseDuelsGameMode { this.wins = data[`${prefix}wins`]; this.losses = data[`${prefix}losses`]; - if (mode == "") { + if (mode === "") { this.winstreak = data.current_winstreak; this.bestWinstreak = data.best_overall_winstreak; } else { @@ -156,7 +156,7 @@ export class BridgeDuels { this.fours, new BridgeDuelsMode(data, "bridge_2v2v2v2"), new BridgeDuelsMode(data, "bridge_3v3v3v3"), - new BridgeDuelsMode(data, "capture_threes") + new BridgeDuelsMode(data, "capture_threes"), ); this.overall.winstreak = data.current_bridge_winstreak; @@ -164,7 +164,12 @@ export class BridgeDuels { PVPBaseDuelsGameMode.applyRatios(this.overall); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "Bridge", data, @@ -200,7 +205,13 @@ export class MultiPVPDuelsGameMode { @Field() public doubles: BowPVPBaseDuelsGameMode; - public constructor(data: APIData, title: string, short: string, long: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + short: string, + long: string, + titleRequirement: TitleRequirement, + ) { this.solo = new BowPVPBaseDuelsGameMode(data, `${short}_duel`); this.doubles = new BowPVPBaseDuelsGameMode(data, `${short}_doubles`); @@ -210,7 +221,12 @@ export class MultiPVPDuelsGameMode { this.overall.bestWinstreak = data[`best_${long}_winstreak`]; this.overall.winstreak = data[`current_${long}_winstreak`]; - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: title, data, @@ -237,10 +253,20 @@ export class SinglePVPDuelsGameMode extends PVPBaseDuelsGameMode { @Field() public progression: Progression; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, mode); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: title, data, @@ -258,7 +284,12 @@ export class SingleBowPVPDuelsGameMode extends SinglePVPDuelsGameMode { @Field() public shotsFired: number; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, title, mode, titleRequirement); mode = mode ? `${mode}_` : mode; this.shotsFired = data[`${mode}bow_shots`]; @@ -278,10 +309,20 @@ export class SingleDuelsGameMode extends BaseDuelsGameMode { @Field() public progression: Progression; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, mode); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: title, data, @@ -342,7 +383,12 @@ export class UHCDuels { this.fours = new BowPVPBaseDuelsGameMode(data, "uhc_four"); this.deathmatch = new BowPVPBaseDuelsGameMode(data, "uhc_meetup"); - this.overall = deepAdd(this.solo, this.doubles, this.fours, this.deathmatch); + this.overall = deepAdd( + this.solo, + this.doubles, + this.fours, + this.deathmatch, + ); this.overall.winstreak = data.current_uhc_winstreak; this.overall.bestWinstreak = data.best_uhc_winstreak; BowPVPBaseDuelsGameMode.applyRatios(this.overall); @@ -351,10 +397,15 @@ export class UHCDuels { data.uhc_duel_golden_apples_eaten, data.uhc_doubles_golden_apples_eaten, data.uhc_four_golden_apples_eaten, - data.uhc_meetu_golden_apples_eaten + data.uhc_meetu_golden_apples_eaten, ); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "UHC", data, @@ -375,8 +426,16 @@ export class SkyWarsDuels extends MultiPVPDuelsGameMode { public constructor(data: APIData) { super(data, "SkyWars", "sw", "skywars", "default"); - const kit = data.sw_duels_kit_new3 ?? data.sw_duels_kit_new2 ?? data.sw_duels_kit_new ?? "none"; - this.kit = kit.replace("kit_", "").replaceAll("ranked_", "").replaceAll("mega_", "").replaceAll("defending_team_", ""); + const kit = + data.sw_duels_kit_new3 ?? + data.sw_duels_kit_new2 ?? + data.sw_duels_kit_new ?? + "none"; + this.kit = kit + .replace("kit_", "") + .replaceAll("ranked_", "") + .replaceAll("mega_", "") + .replaceAll("defending_team_", ""); } } @@ -501,7 +560,12 @@ export class BedwarsDuels { this.rush = new PVPBaseDuelsGameMode(data, "bedwars_two_one_duels_rush"); this.overall = new BedWarsDuelsOverallMode(data); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "Bed Wars", data, @@ -562,7 +626,12 @@ export class SpleefDuels { this.bowSpleef = new BowSpleefDuelMode(data); this.overallWins = add(this.spleef.wins, this.bowSpleef.wins); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overallWins, mode: "Spleef", data, @@ -604,7 +673,12 @@ export class MegaWallsDuels extends SinglePVPDuelsGameMode { PVPBaseDuelsGameMode.applyRatios(this); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: "Mega Walls", data, diff --git a/packages/schemas/src/player/gamemodes/murdermystery/index.ts b/packages/schemas/src/player/gamemodes/murdermystery/index.ts index f321ef0d0..7980274ee 100644 --- a/packages/schemas/src/player/gamemodes/murdermystery/index.ts +++ b/packages/schemas/src/player/gamemodes/murdermystery/index.ts @@ -87,9 +87,9 @@ const BRACKETS: Record string> = { }; const PREFIX_STAT: Record number | undefined> = { - random_cosmetic: () => undefined, - random_favorite_cosmetic: () => undefined, - prefixstat_none: () => undefined, + random_cosmetic: () => {}, + random_favorite_cosmetic: () => {}, + prefixstat_none: () => {}, prefixstat_classic_wins: (mm) => add(mm.classic.wins, mm.doubleUp.wins), prefixstat_infection_wins: (mm) => mm.infection.wins ?? 0, prefixstat_assassins_wins: (mm) => mm.assassins.wins ?? 0, diff --git a/packages/schemas/src/player/gamemodes/murdermystery/mode.ts b/packages/schemas/src/player/gamemodes/murdermystery/mode.ts index 547c120b5..3fe4ad413 100644 --- a/packages/schemas/src/player/gamemodes/murdermystery/mode.ts +++ b/packages/schemas/src/player/gamemodes/murdermystery/mode.ts @@ -234,7 +234,7 @@ export class MurderMysteryKnife { this.kind = data.active_knife_skin?.replace("knife_skin_", "") ?? "none"; if (this.kind === "random_cosmetic") { - let max: [string, number] | undefined = undefined; + let max; const knifes = Object.entries( data?.knifeSkinPrestiges?.xp ?? ({} as Record) diff --git a/packages/schemas/src/player/gamemodes/quests/util.ts b/packages/schemas/src/player/gamemodes/quests/util.ts index ddfdddd88..5468830f3 100644 --- a/packages/schemas/src/player/gamemodes/quests/util.ts +++ b/packages/schemas/src/player/gamemodes/quests/util.ts @@ -70,13 +70,13 @@ const processQuests = ( options: QuestOption[], fieldPrefix?: string ) => { - options.forEach((quest) => { + for (const quest of options) { const k = quest.propertyKey ?? quest.field; const field = fieldPrefix ? `${fieldPrefix}_${quest.field}` : quest.field; instance[k] = getQuestCountDuring(time, quests[field]); instance.total += instance[k] ?? 0; - }); + } }; const assignQuestMetadata = ( @@ -84,7 +84,7 @@ const assignQuestMetadata = ( time: QuestTime, options: QuestOption[] ) => { - options.forEach((quest) => { + for (const quest of options) { const hasOverall = quest.overall !== undefined; const canDisplayOverall = hasOverall && time === QuestTime.Overall; @@ -101,7 +101,7 @@ const assignQuestMetadata = ( }); decorator(constructor.prototype, quest.propertyKey ?? quest.field); - }); + } }; const questTotalFieldData = (game: FormattedGame, enabled = false) => ({ @@ -224,13 +224,13 @@ export function createQuestsInstance< [key: string]: Record; public constructor(data: APIData) { - modes.forEach(([game, quests]) => { + for (const [game, quests] of modes) { this[game] = new quests[time](data); - }); + } } } - modes.forEach(([gameName, quests]) => { + for (const [gameName, quests] of modes) { const GameModeClass = quests[time]; const decorator = Field({ @@ -240,7 +240,7 @@ export function createQuestsInstance< }); decorator(QuestInstance.prototype, gameName); - }); + } return QuestInstance as unknown as IQuestInstance; } diff --git a/packages/schemas/src/player/gamemodes/skywars/util.ts b/packages/schemas/src/player/gamemodes/skywars/util.ts index a56847c5b..7f122ce23 100644 --- a/packages/schemas/src/player/gamemodes/skywars/util.ts +++ b/packages/schemas/src/player/gamemodes/skywars/util.ts @@ -461,7 +461,7 @@ export function getFormattedLevel( selectedEmblem = selectedEmblem?.replace("emblem_", ""); let schemeKey: keyof typeof SCHEME_MAP; - let emblemKey: keyof typeof EMBLEM_MAP | undefined = undefined; + let emblemKey: keyof typeof EMBLEM_MAP; if (selectedScheme) { if (selectedScheme in SCHEME_MAP) { @@ -485,7 +485,7 @@ export function getFormattedLevel( emblemKey = "default"; } - const emblem = emblemKey ? EMBLEM_MAP[emblemKey] : undefined; + const emblem = EMBLEM_MAP[emblemKey]; const scheme = SCHEME_MAP[schemeKey]; return scheme(level, bold, underline, strikethrough, emblem); diff --git a/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts b/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts index 413a0f7dd..b95caf536 100644 --- a/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts +++ b/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type APIData } from "@statsify/util"; +import type { APIData } from "@statsify/util"; import { Field } from "#metadata"; import { ratio } from "@statsify/math"; diff --git a/packages/schemas/src/player/index.ts b/packages/schemas/src/player/index.ts index 28e39fc18..e1256f468 100644 --- a/packages/schemas/src/player/index.ts +++ b/packages/schemas/src/player/index.ts @@ -12,7 +12,12 @@ import { modelOptions as ModelOptions, Severity } from "@typegoose/typegoose"; import { PlayerSocials } from "./socials.js"; import { PlayerStats } from "./stats.js"; import { PlayerStatus } from "./status.js"; -import { PlayerUtil } from "./util.js"; +import { + getDisplayName, + getPlayerRank, + getPlusColor, + getRankColor, +} from "./util.js"; import type { APIData } from "@statsify/util"; @ModelOptions({ options: { allowMixed: Severity.ALLOW } }) @@ -34,7 +39,8 @@ export class Player { @Field({ docs: { - description: "The player's name with their rank color as seen in game lobbies", + description: + "The player's name with their rank color as seen in game lobbies", examples: ["§bj4cobi"], }, }) @@ -84,13 +90,13 @@ export class Player { this.username = data.displayname; this.usernameToLower = this.username?.toLowerCase(); - this.rank = PlayerUtil.getRank(data); - this.plusColor = PlayerUtil.getPlusColor(this.rank, data?.rankPlusColor); - this.prefixName = `${PlayerUtil.getRankColor(this.rank).toString()}${this.username}`; - this.displayName = PlayerUtil.getDisplayName( + this.rank = getPlayerRank(data); + this.plusColor = getPlusColor(this.rank, data?.rankPlusColor); + this.prefixName = `${getRankColor(this.rank).toString()}${this.username}`; + this.displayName = getDisplayName( this.username, this.rank, - this.plusColor.code + this.plusColor.code, ); this.socials = new PlayerSocials(data?.socialMedia?.links ?? {}); @@ -106,4 +112,4 @@ export * from "./gamemodes/index.js"; export * from "./socials.js"; export * from "./stats.js"; export * from "./status.js"; -export { rankMap } from "./util.js"; +export { RANK_MAP as rankMap } from "./util.js"; diff --git a/packages/schemas/src/player/status.ts b/packages/schemas/src/player/status.ts index b67c0dd58..663975432 100644 --- a/packages/schemas/src/player/status.ts +++ b/packages/schemas/src/player/status.ts @@ -25,12 +25,18 @@ function findLastAction(data: APIData): { action: string; time: number } { lastQuestStart = quest.active.started; } - if (quest.completions?.length && quest.completions.at(-1)?.time > lastQuestEnd) { + if ( + quest.completions?.length && + quest.completions.at(-1)?.time > lastQuestEnd + ) { lastQuestEnd = quest.completions.at(-1).time; } } - actions.push({ action: "QUEST_START", time: lastQuestStart }, { action: "QUEST_COMPLETED", time: lastQuestEnd }); + actions.push( + { action: "QUEST_START", time: lastQuestStart }, + { action: "QUEST_COMPLETED", time: lastQuestEnd }, + ); const allPets = data?.petStats ?? {}; @@ -42,7 +48,7 @@ function findLastAction(data: APIData): { action: string; time: number } { const thisPetTime = Math.max( pet?.THIRST?.timestamp ?? 0, pet?.EXERCISE?.timestamp ?? 0, - pet?.HUNGER?.timestamp ?? 0 + pet?.HUNGER?.timestamp ?? 0, ); if (thisPetTime > lastPetTime) { @@ -53,16 +59,19 @@ function findLastAction(data: APIData): { action: string; time: number } { // It really is not necessary to display which pet action was last done // Therefore just putting pet is explanation enough to the players last // known whereabouts. - actions.push({ action: "PET", time: lastPetTime }, { - action: "PET_JOURNEY", - time: data?.petJourneyTimestamp ?? 0, - }); + actions.push( + { action: "PET", time: lastPetTime }, + { + action: "PET_JOURNEY", + time: data?.petJourneyTimestamp ?? 0, + }, + ); if (data?.stats?.SkyWars) { // Lab modes are explained each first time any player enters the game // as well as when they click the book while in queue. const explains = Object.entries(data?.stats?.SkyWars).filter((e) => - e[0].endsWith("explained_last") + e[0].endsWith("explained_last"), ); if (explains.length > 0) { @@ -111,7 +120,7 @@ function findLastAction(data: APIData): { action: string; time: number } { { action: "PIT_TRADE", time: Math.max(...(pitProfile.trade_timestamps ?? [0])), - } + }, ); } @@ -133,14 +142,19 @@ function findLastAction(data: APIData): { action: string; time: number } { { action: "LOGOUT", time: data?.lastLogout ?? 0, - } + }, ); // This is good for tracking ap hunters who are playing games with very // little in the way of time stats in the game they are playing. if (data?.achievementRewardsNew) { - const rewardsArr: number[] = Object.values(data?.achievementRewardsNew ?? {}); - actions.push({ action: "ACHIEVEMENT_REWARD", time: Math.max(...rewardsArr) }); + const rewardsArr: number[] = Object.values( + data?.achievementRewardsNew ?? {}, + ); + actions.push({ + action: "ACHIEVEMENT_REWARD", + time: Math.max(...rewardsArr), + }); } // Many people who just wait in lobbies will be shown on this stat since they @@ -154,8 +168,13 @@ function findLastAction(data: APIData): { action: string; time: number } { if (data.stats) { const games = Object.values(data.stats); - const tourneyAds = games.map((g: any) => g.lastTourneyAd).filter((v) => !!v); - actions.push({ action: "TOURNAMENT_ADVERTISEMENT", time: Math.max(...tourneyAds) }); + const tourneyAds = games + .map((g: any) => g.lastTourneyAd) + .filter((v) => !!v); + actions.push({ + action: "TOURNAMENT_ADVERTISEMENT", + time: Math.max(...tourneyAds), + }); } // First login is used as a baseline due to it being literally the oldest timestamp @@ -198,6 +217,7 @@ export class PlayerStatus { public constructor(data: APIData) { // The first login provided by hypixel is not fully accurate for very old players, it is better to use the `_id` field + // oxlint-disable-next-line no-underscore-dangle this.firstLogin = Number.parseInt(data._id?.slice(0, 8) ?? 0, 16) * 1000; const lastAction = findLastAction(data); diff --git a/packages/schemas/src/player/util.ts b/packages/schemas/src/player/util.ts index 675ec8ae8..0ee5e9977 100644 --- a/packages/schemas/src/player/util.ts +++ b/packages/schemas/src/player/util.ts @@ -9,143 +9,143 @@ import { Color, type ColorCode, type ColorId } from "#color"; import type { APIData } from "@statsify/util"; -export const rankMap: Record string> = { +export const RANK_MAP: Record string> = { "MVP+": (plusColor) => `§b[MVP${plusColor}+§b]`, "MVP++": (plusColor) => `§6[MVP${plusColor}++§6]`, "bMVP++": (plusColor) => `§b[MVP${plusColor}++§b]`, - "MVP": () => "§b[MVP]", + MVP: () => "§b[MVP]", "VIP+": () => "§a[VIP§6+§a]", - "VIP": () => "§a[VIP]", - "YOUTUBE": () => "§c[§fYOUTUBE§c]", + VIP: () => "§a[VIP]", + YOUTUBE: () => "§c[§fYOUTUBE§c]", "PIG+++": () => "§d[PIG§b+++§d]", - "INNIT": () => "§d[INNIT]", - "GM": () => "§2[GM]", - "ADMIN": () => "§c[ADMIN]", - "OWNER": () => "§c[OWNER]", - "STAFF": () => "§c[§6ዞ§c]", - "MOJANG": () => "§6[MOJANG]", - "EVENTS": () => "§6[EVENTS]", - "DEFAULT": () => "§7", + INNIT: () => "§d[INNIT]", + GM: () => "§2[GM]", + ADMIN: () => "§c[ADMIN]", + OWNER: () => "§c[OWNER]", + STAFF: () => "§c[§6ዞ§c]", + MOJANG: () => "§6[MOJANG]", + EVENTS: () => "§6[EVENTS]", + DEFAULT: () => "§7", }; -/** - * A set of utility functions for getting things like `rank`, `displayName` and `plusColor` - */ -export class PlayerUtil { - public static getRank(data: APIData) { - let rank = "DEFAULT"; - - if (data.monthlyPackageRank || data.packageRank || data.newPackageRank) { - if (data.monthlyPackageRank === "SUPERSTAR") { - rank = data.monthlyPackageRank; - - if (data.monthlyRankColor && data.monthlyRankColor !== "GOLD") { - rank = "bMVP++"; - } - } else if (data.newPackageRank && data.newPackageRank !== "NONE") { - rank = data.newPackageRank; - } else if (data.packageRank && data.packageRank !== "NONE") { - rank = data.packageRank; - } - } +export function getPlayerRank(data: APIData) { + let rank = "DEFAULT"; - if (data.rank && data.rank !== "NORMAL") { - rank = data.rank; - } + if (data.monthlyPackageRank || data.packageRank || data.newPackageRank) { + if (data.monthlyPackageRank === "SUPERSTAR") { + rank = data.monthlyPackageRank; - if (data.prefix) { - rank = data.prefix.replace(/§.|\[|]/g, ""); + if (data.monthlyRankColor && data.monthlyRankColor !== "GOLD") { + rank = "bMVP++"; + } + } else if (data.newPackageRank && data.newPackageRank !== "NONE") { + rank = data.newPackageRank; + } else if (data.packageRank && data.packageRank !== "NONE") { + rank = data.packageRank; } + } - rank = this.replaceRank(rank); - - return rank.length === 0 ? "DEFAULT" : rank; + if (data.rank && data.rank !== "NORMAL") { + rank = data.rank; } - public static getPlusColor(rank: string, plusColor?: ColorId): Color { - const rankColorMap: Record = { - "MVP+": new Color("RED"), - "MVP++": new Color("RED"), - "bMVP++": new Color("RED"), - "MVP": new Color("AQUA"), - "VIP": new Color("GREEN"), - "VIP+": new Color("GOLD"), - "PIG+++": new Color("AQUA"), - }; + if (data.prefix) { + rank = data.prefix.replaceAll(/§.|\[|]/g, ""); + } - if (plusColor === undefined || rank === "PIG+++" || rank === "VIP") { - const rankColor: Color = rankColorMap[rank]; + rank = replaceRank(rank); - if (!rankColor) return new Color("GRAY"); + return rank.length === 0 ? "DEFAULT" : rank; +} - return rankColor; - } +const RANK_COLOR_MAP: Record = { + "MVP+": new Color("RED"), + "MVP++": new Color("RED"), + "bMVP++": new Color("RED"), + MVP: new Color("AQUA"), + VIP: new Color("GREEN"), + "VIP+": new Color("GOLD"), + "PIG+++": new Color("AQUA"), +}; - const rankColor = new Color(plusColor); +export function getPlusColor(rank: string, plusColor?: ColorId): Color { + if (plusColor === undefined || rank === "PIG+++" || rank === "VIP") { + const rankColor: Color = RANK_COLOR_MAP[rank]; if (!rankColor) return new Color("GRAY"); return rankColor; } - public static getRankColor(rank: string): Color { - switch (rank) { - case "STAFF": - case "YOUTUBE": - case "ADMIN": - case "OWNER": - case "SLOTH": - case "MCP": - case "MINISTER": - return new Color("RED"); - - case "PIG+++": - case "INNIT": - return new Color("LIGHT_PURPLE"); - - case "MOD": - case "GM": - return new Color("DARK_GREEN"); - - case "HELPER": - return new Color("BLUE"); - - case "BUILD TEAM": - return new Color("DARK_AQUA"); - - case "MVP++": - case "APPLE": - case "MOJANG": - case "EVENTS": - return new Color("GOLD"); - - case "MVP": - case "MVP+": - case "bMVP++": - return new Color("AQUA"); - - case "VIP": - case "VIP+": - return new Color("GREEN"); - - default: - return new Color("GRAY"); - } - } + const rankColor = new Color(plusColor); - public static getDisplayName(username: string, rank: string, plusColor: ColorCode) { - const colorRank = rankMap[rank](plusColor); - return `${colorRank}${colorRank === "§7" ? "" : " "}${username}`; - } + if (!rankColor) return new Color("GRAY"); + + return rankColor; +} - private static replaceRank(rank: string) { - return rank - .replace("SUPERSTAR", "MVP++") - .replace("VIP_PLUS", "VIP+") - .replace("MVP_PLUS", "MVP+") - .replace("MODERATOR", "MOD") - .replace("GAME_MASTER", "GM") - .replace("YOUTUBER", "YOUTUBE") - .replace("NONE", ""); +export function getRankColor(rank: string): Color { + switch (rank) { + case "STAFF": + case "YOUTUBE": + case "ADMIN": + case "OWNER": + case "SLOTH": + case "MCP": + case "MINISTER": + return new Color("RED"); + + case "PIG+++": + case "INNIT": + return new Color("LIGHT_PURPLE"); + + case "MOD": + case "GM": + return new Color("DARK_GREEN"); + + case "HELPER": + return new Color("BLUE"); + + case "BUILD TEAM": + return new Color("DARK_AQUA"); + + case "MVP++": + case "APPLE": + case "MOJANG": + case "EVENTS": + return new Color("GOLD"); + + case "MVP": + case "MVP+": + case "bMVP++": + return new Color("AQUA"); + + case "VIP": + case "VIP+": + return new Color("GREEN"); + + default: + return new Color("GRAY"); } } + +export function getDisplayName( + username: string, + rank: string, + plusColor: ColorCode, +) { + const rankFormatter = rank in RANK_MAP ? RANK_MAP[rank] : RANK_MAP.DEFAULT; + const coloredRank = rankFormatter(plusColor); + return `${coloredRank}${coloredRank === "§7" ? "" : " "}${username}`; +} + +function replaceRank(rank: string) { + return rank + .replace("SUPERSTAR", "MVP++") + .replace("VIP_PLUS", "VIP+") + .replace("MVP_PLUS", "MVP+") + .replace("MODERATOR", "MOD") + .replace("GAME_MASTER", "GM") + .replace("YOUTUBER", "YOUTUBE") + .replace("NONE", ""); +} diff --git a/packages/schemas/src/util/create-historical-player.ts b/packages/schemas/src/util/create-historical-player.ts index c7642e524..8601cb3b2 100644 --- a/packages/schemas/src/util/create-historical-player.ts +++ b/packages/schemas/src/util/create-historical-player.ts @@ -15,33 +15,41 @@ export function createHistoricalPlayer(oldOne: T, newOne: T): T { const keys = Object.keys({ ...oldOne, ...(newOne as any) }); - for (const _key of keys) { - const key = _key as keyof T; + for (const untypedKey of keys) { + const key = untypedKey as keyof T; const newOneType = typeof newOne[key]; if (typeof oldOne[key] === "number" || newOneType === "number") { - const ratioIndex = RATIOS.indexOf(_key); + const ratioIndex = RATIOS.indexOf(untypedKey); if (ratioIndex === -1) { merged[key] = sub( newOne[key] as unknown as number, - oldOne[key] as unknown as number + oldOne[key] as unknown as number, ) as unknown as T[keyof T]; } else { const numerator = sub( - newOne[RATIO_STATS[ratioIndex][0] as unknown as keyof T] as unknown as number, - oldOne[RATIO_STATS[ratioIndex][0] as unknown as keyof T] as unknown as number + newOne[ + RATIO_STATS[ratioIndex][0] as unknown as keyof T + ] as unknown as number, + oldOne[ + RATIO_STATS[ratioIndex][0] as unknown as keyof T + ] as unknown as number, ); const denominator = sub( - newOne[RATIO_STATS[ratioIndex][1] as unknown as keyof T] as unknown as number, - oldOne[RATIO_STATS[ratioIndex][1] as unknown as keyof T] as unknown as number + newOne[ + RATIO_STATS[ratioIndex][1] as unknown as keyof T + ] as unknown as number, + oldOne[ + RATIO_STATS[ratioIndex][1] as unknown as keyof T + ] as unknown as number, ); merged[key] = ratio( numerator, denominator, - RATIO_STATS[ratioIndex][4] ?? 1 + RATIO_STATS[ratioIndex][4] ?? 1, ) as unknown as T[keyof T]; } } else if (newOneType === "string") { @@ -52,7 +60,10 @@ export function createHistoricalPlayer(oldOne: T, newOne: T): T { continue; } - merged[key] = createHistoricalPlayer(oldOne[key] ?? {}, newOne[key] ?? {}) as unknown as T[keyof T]; + merged[key] = createHistoricalPlayer( + oldOne[key] ?? {}, + newOne[key] ?? {}, + ) as unknown as T[keyof T]; } } diff --git a/packages/schemas/src/util/historical-scanner.ts b/packages/schemas/src/util/historical-scanner.ts deleted file mode 100644 index 8cde98115..000000000 --- a/packages/schemas/src/util/historical-scanner.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { - type HistoricalEnabledMetadata, - type HistoricalMetadata, - type MetadataEntry, - MetadataScanner, -} from "#metadata"; -import { parseAdditionalFields } from "./parse-fields.js"; -import type { Constructor } from "@statsify/util"; - -export class HistoricalScanner { - public static getHistoricalMetadata(constructor: Constructor) { - const metadata = MetadataScanner.scan(constructor); - - const fields = metadata.filter(([, { historical }]) => historical.enabled); - - return fields; - } - - public static getHistoricalFields(constructor: Constructor) { - return this.getHistoricalMetadata(constructor); - } - - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled?: true - ): HistoricalEnabledMetadata; - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled: false - ): HistoricalMetadata; - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled = true - ): HistoricalMetadata { - const field: MetadataEntry | undefined = MetadataScanner.scan(constructor).find( - ([k]) => k === key - ); - if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); - - const [, { historical }] = field; - - if (!historical.enabled && leaderboardMustBeEnabled) - throw new Error( - `${key} is not a historical leaderboard field for ${constructor.name}` - ); - - if (Array.isArray(historical.additionalFields)) { - historical.additionalFields = historical.additionalFields.map( - parseAdditionalFields.bind(this, key) - ); - } - - return historical; - } -} diff --git a/packages/schemas/src/util/index.ts b/packages/schemas/src/util/index.ts index 810c76679..87b5d83fc 100644 --- a/packages/schemas/src/util/index.ts +++ b/packages/schemas/src/util/index.ts @@ -8,4 +8,3 @@ export * from "./leaderboard-scanner.js"; export * from "./create-historical-player.js"; -export * from "./historical-scanner.js"; diff --git a/packages/schemas/src/util/leaderboard-scanner.ts b/packages/schemas/src/util/leaderboard-scanner.ts index 8dd402a05..4260ace0b 100644 --- a/packages/schemas/src/util/leaderboard-scanner.ts +++ b/packages/schemas/src/util/leaderboard-scanner.ts @@ -9,57 +9,60 @@ import { type LeaderboardEnabledMetadata, type LeaderboardMetadata, - MetadataScanner, + scanMetadata, } from "#metadata"; import { parseAdditionalFields } from "./parse-fields.js"; import type { Constructor } from "@statsify/util"; -export class LeaderboardScanner { - public static getLeaderboardFields(constructor: Constructor) { - const metadata = MetadataScanner.scan(constructor); +export function getLeaderboardFields(constructor: Constructor) { + const metadata = scanMetadata(constructor); - const fields = metadata.filter(([, { leaderboard }]) => leaderboard.enabled); + const fields = metadata.filter(([, { leaderboard }]) => leaderboard.enabled); - return fields; - } + return fields; +} - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled?: true - ): LeaderboardEnabledMetadata; - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled: false - ): LeaderboardMetadata; - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled = true - ): LeaderboardMetadata { - const metadata = MetadataScanner.scan(constructor); +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled?: true, +): LeaderboardEnabledMetadata; +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled: false, +): LeaderboardMetadata; +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled = true, +): LeaderboardMetadata { + const metadata = scanMetadata(constructor); - const field = metadata.find(([k]) => k === key); + const field = metadata.find(([k]) => k === key); - if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); + if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); - const [, { store, leaderboard }] = field; + const [, { store, leaderboard }] = field; - if (!leaderboard.enabled && leaderboardMustBeEnabled) - throw new Error(`${key} is not a leaderboard field for ${constructor.name}`); + if (!leaderboard.enabled && leaderboardMustBeEnabled) + throw new Error( + `${key} is not a leaderboard field for ${constructor.name}`, + ); - leaderboard.default = store.default; + leaderboard.default = store.default; - if (Array.isArray(leaderboard.additionalFields)) { - leaderboard.additionalFields = leaderboard.additionalFields.map( - parseAdditionalFields.bind(this, key) - ); - } + if (Array.isArray(leaderboard.additionalFields)) { + leaderboard.additionalFields = leaderboard.additionalFields.map( + parseAdditionalFields.bind(null, key), + ); + } - if (leaderboard.extraDisplay) - leaderboard.extraDisplay = parseAdditionalFields(key, leaderboard.extraDisplay); + if (leaderboard.extraDisplay) + leaderboard.extraDisplay = parseAdditionalFields( + key, + leaderboard.extraDisplay, + ); - return leaderboard; - } + return leaderboard; } diff --git a/packages/schemas/src/util/parse-fields.ts b/packages/schemas/src/util/parse-fields.ts index d4782b424..51e2e5b30 100644 --- a/packages/schemas/src/util/parse-fields.ts +++ b/packages/schemas/src/util/parse-fields.ts @@ -15,7 +15,7 @@ export function parseAdditionalFields(field: string, additionalKey: string) { const additionalFieldParts = additionalKey.split(".").slice(1); const ending = additionalFieldParts.pop(); - if (!additionalFieldParts.length) return [...fieldParts, ending].join("."); + if (additionalFieldParts.length === 0) return [...fieldParts, ending].join("."); const splitIndex = fieldParts.findIndex((part) => additionalFieldParts.includes(part)); diff --git a/packages/schemas/tsconfig.json b/packages/schemas/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/schemas/tsconfig.json +++ b/packages/schemas/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/skin-renderer/index.cjs b/packages/skin-renderer/index.cjs index 3ea3c1b6d..f404ee093 100644 --- a/packages/skin-renderer/index.cjs +++ b/packages/skin-renderer/index.cjs @@ -3,9 +3,6 @@ // @ts-nocheck /* auto-generated by NAPI-RS */ -const { createRequire } = require('node:module') -require = createRequire(__filename) - const { readFileSync } = require('node:fs') let nativeBinding = null const loadErrors = [] @@ -66,7 +63,7 @@ const isMuslFromChildProcess = () => { function requireNative() { if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) { try { - nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); + return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); } catch (err) { loadErrors.push(err) } @@ -108,7 +105,24 @@ function requireNative() { } } else if (process.platform === 'win32') { if (process.arch === 'x64') { + if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') { + try { + return require('./skin-renderer.win32-x64-gnu.node') + } catch (e) { + loadErrors.push(e) + } try { + const binding = require('@statsify/skin-renderer-win32-x64-gnu') + const bindingPackageVersion = require('@statsify/skin-renderer-win32-x64-gnu/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } else { + try { return require('./skin-renderer.win32-x64-msvc.node') } catch (e) { loadErrors.push(e) @@ -123,6 +137,7 @@ function requireNative() { } catch (e) { loadErrors.push(e) } + } } else if (process.arch === 'ia32') { try { return require('./skin-renderer.win32-ia32-msvc.node') @@ -348,6 +363,40 @@ function requireNative() { loadErrors.push(e) } } + } else if (process.arch === 'loong64') { + if (isMusl()) { + try { + return require('./skin-renderer.linux-loong64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@statsify/skin-renderer-linux-loong64-musl') + const bindingPackageVersion = require('@statsify/skin-renderer-linux-loong64-musl/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./skin-renderer.linux-loong64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@statsify/skin-renderer-linux-loong64-gnu') + const bindingPackageVersion = require('@statsify/skin-renderer-linux-loong64-gnu/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } } else if (process.arch === 'riscv64') { if (isMusl()) { try { @@ -476,23 +525,47 @@ function requireNative() { nativeBinding = requireNative() -if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { +// NAPI_RS_FORCE_WASI is a tri-state flag: +// unset / any other value → native binding preferred, WASI is only a fallback +// 'true' → force WASI fallback even if native loaded +// 'error' → force WASI and throw if no WASI binding is found +// Treating any non-empty string as truthy (the historical behavior) meant +// NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered +// the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file. +const forceWasi = + process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error' + +if (!nativeBinding || forceWasi) { + let wasiBinding = null + let wasiBindingError = null try { - nativeBinding = require('./skin-renderer.wasi.cjs') + wasiBinding = require('./skin-renderer.wasi.cjs') + nativeBinding = wasiBinding } catch (err) { - if (process.env.NAPI_RS_FORCE_WASI) { - loadErrors.push(err) + if (forceWasi) { + wasiBindingError = err } } - if (!nativeBinding) { + if (!nativeBinding || forceWasi) { try { - nativeBinding = require('@statsify/skin-renderer-wasm32-wasi') + wasiBinding = require('@statsify/skin-renderer-wasm32-wasi') + nativeBinding = wasiBinding } catch (err) { - if (process.env.NAPI_RS_FORCE_WASI) { + if (forceWasi) { + if (!wasiBindingError) { + wasiBindingError = err + } else { + wasiBindingError.cause = err + } loadErrors.push(err) } } } + if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) { + const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error') + error.cause = wasiBindingError + throw error + } } if (!nativeBinding) { @@ -501,7 +574,12 @@ if (!nativeBinding) { `Cannot find native binding. ` + `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', - { cause: loadErrors } + { + cause: loadErrors.reduce((err, cur) => { + cur.cause = err + return cur + }), + }, ) } throw new Error(`Failed to load native binding`) diff --git a/packages/skin-renderer/package.json b/packages/skin-renderer/package.json index 9368536c3..bc370d329 100644 --- a/packages/skin-renderer/package.json +++ b/packages/skin-renderer/package.json @@ -19,7 +19,8 @@ "build:napi:debug": "napi build --platform && mv index.js index.cjs", "build:wasm": "wasm-pack build --target web --release", "build:wasm:debug": "wasm-pack build --target web --dev", - "lint": "cargo fmt && cargo clippy --fix --allow-dirty" + "lint": "cargo fmt && cargo clippy --fix --allow-dirty", + "lint:ci": "cargo fmt && cargo clippy --fix --allow-dirty" }, "napi": { "binaryName": "skin-renderer", @@ -39,4 +40,4 @@ ] } } -} \ No newline at end of file +} diff --git a/packages/util/eslint.config.js b/packages/util/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/util/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/util/package.json b/packages/util/package.json index a14ebe2b3..96b6e641a 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,15 +1,17 @@ { "name": "@statsify/util", "version": "0.0.0", + "type": "module", "main": "dist/index.js", "types": "src/index.ts", - "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github", + "fmt": "oxfmt" }, "dependencies": { - "@swc/helpers": "^0.5.12" + "@swc/helpers": "^0.5.23" } -} \ No newline at end of file +} diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index 4d968fcdb..c2bf731f8 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -11,7 +11,7 @@ import { existsSync } from "node:fs"; import { fileURLToPath } from "node:url"; import type { DeepFlatten } from "./flatten.js"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; export interface Config { database: { @@ -246,7 +246,12 @@ async function loadConfig(): Promise<{ default: Config }> { database: { mongoUri: "", redisUrl: "" }, hypixelApi: { key: "", timeout: 5000 }, api: { port: 3000, mediaRoot: "" }, - discordBot: { publicKey: "", token: "", applicationId: "", testingGuild: "" }, + discordBot: { + publicKey: "", + token: "", + applicationId: "", + testingGuild: "", + }, supportBot: { createTicketChannel: "", ticketLogsChannel: "", @@ -276,16 +281,16 @@ async function loadConfig(): Promise<{ default: Config }> { }; } - if (existsSync(join(__dirname, "../../../config.json"))) { - return import(join(__dirname, "../../../config.json")); - } else if (existsSync(join(__dirname, "../../../config.js"))) { - return import(join(__dirname, "../../../config.js")); - } else { - throw new Error("No config file detected!"); + if (existsSync(join(directory, "../../../config.json"))) { + return import(join(directory, "../../../config.json")); + } else if (existsSync(join(directory, "../../../config.js"))) { + return import(join(directory, "../../../config.js")); } + throw new Error("No config file detected!"); + } -let cfg: Config | undefined = undefined; +let cfg: Config; export interface ConfigOptions { required?: boolean; @@ -294,12 +299,11 @@ export interface ConfigOptions { export const config = async ( key: T, - { required = true, default: defaultValue }: ConfigOptions = {} + { required = true, default: defaultValue }: ConfigOptions = {}, ): Promise => { // Don't load the config while testing if (process.env.VITEST) return defaultValue as FlatConfig[T]; - if (!cfg) - cfg = await loadConfig().then((c) => c.default); + if (!cfg) cfg = await loadConfig().then((c) => c.default); const value = (key as string).split(".").reduce((a: any, b) => a?.[b], cfg) || undefined; @@ -313,7 +317,7 @@ export const config = async ( throw new Error( `Missing required environment variable: ${key as string} | Add ${ key as string - } to your config` + } to your config`, ); } diff --git a/packages/util/src/flatten.ts b/packages/util/src/flatten.ts index 0b3d26003..9f296cfe1 100644 --- a/packages/util/src/flatten.ts +++ b/packages/util/src/flatten.ts @@ -44,10 +44,10 @@ export type DeepFlatten = { */ export const flatten = (data: T, prefix = "", dest: APIData = {}): Flatten => { if (isObject(data)) { - Object.keys(data ?? {}).forEach((key) => { + for (const key of Object.keys(data ?? {})) { const tmpPrefix = prefix.length > 0 ? `${prefix}.${key}` : prefix + key; flatten(data[key as keyof T], tmpPrefix, dest); - }); + } } else { dest[prefix] = data; } diff --git a/packages/util/src/types.ts b/packages/util/src/types.ts index c3265fb76..5911d64cf 100644 --- a/packages/util/src/types.ts +++ b/packages/util/src/types.ts @@ -10,7 +10,7 @@ export type APIData = Record; export type RemoveMethods = Pick< T, - // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + // oxlint-disable-next-line no-unsafe-function-type { [Key in keyof T]: T[Key] extends Function ? never : Key }[keyof T] >; diff --git a/packages/util/src/unflatten.ts b/packages/util/src/unflatten.ts index 79271abda..98f650c45 100644 --- a/packages/util/src/unflatten.ts +++ b/packages/util/src/unflatten.ts @@ -20,9 +20,9 @@ export const unflatten = (instance: Flatten): T => { const result: APIData = {}; const obj = instance as APIData; - Object.keys(obj).forEach((k) => { - if (k.includes(".")) { - const path = k.split("."); + for (const key of Object.keys(obj)) { + if (key.includes(".")) { + const path = key.split("."); const x = path.pop(); const body = path.reduce((cur, p) => { @@ -30,11 +30,11 @@ export const unflatten = (instance: Flatten): T => { return cur[p]; }, result); - body[x ?? ""] = obj[k]; + body[x ?? ""] = obj[key]; } else { - result[k] = obj[k]; + result[key] = obj[key]; } - }); + } return result as T; }; diff --git a/packages/util/src/util.ts b/packages/util/src/util.ts index b217009e3..064aef4f3 100644 --- a/packages/util/src/util.ts +++ b/packages/util/src/util.ts @@ -86,28 +86,30 @@ export const romanNumeral = (num: number): string => { }; export const prettify = (s: string): string => { - if (/[a-z]/gi.test(s) && s === s.toUpperCase()) { - s = s.toLowerCase(); + let formatted = s; + + if (/[a-z]/gi.test(formatted) && formatted === formatted.toUpperCase()) { + formatted = formatted.toLowerCase(); } // Convert camelCase to Snake_Case (if applicable) if (!["_", " "].some((l) => s.includes(l))) { - s = - s.charAt(0).toLowerCase() + - s.slice(1).replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); + formatted = + formatted.charAt(0).toLowerCase() + + formatted.slice(1).replaceAll(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); } // Convert snake_case to Title Case - return s + return formatted .replaceAll("_", " ") - .replace( + .replaceAll( /\w\S*/g, (t) => t.charAt(0).toUpperCase() + t.slice(1).toLowerCase() ); }; export const removeFormatting = (s: string): string => - s.replace(/§#([A-Fa-f0-9]{6})|§./gm, ""); + s.replaceAll(/§#([A-Fa-f0-9]{6})|§./gm, ""); export interface FormatTimeOptions { /** diff --git a/packages/util/tsconfig.json b/packages/util/tsconfig.json index b1633af34..1da8cb9e2 100644 --- a/packages/util/tsconfig.json +++ b/packages/util/tsconfig.json @@ -1,8 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js", - "vitest.config.ts" - ] -} \ No newline at end of file + "include": ["src", "vitest.config.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e289028fb..03e8e2a0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,88 +4,61 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - skia-canvas: 3.0.8 - importers: .: devDependencies: - '@commitlint/cli': - specifier: ^19.6.1 - version: 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/config-conventional': - specifier: ^19.6.0 - version: 19.8.1 - '@eslint/js': - specifier: ^9.19.0 - version: 9.34.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + version: 1.0.2(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3) '@napi-rs/cli': - specifier: ^3.1.5 - version: 3.1.5(@emnapi/runtime@1.7.1)(@types/node@24.3.0) + specifier: ^3.7.0 + version: 3.7.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)(@types/node@25.9.1) '@rollup/pluginutils': specifier: ^5.1.0 - version: 5.2.0(rollup@4.49.0) - '@stylistic/eslint-plugin': - specifier: ^5.2.3 - version: 5.2.3(eslint@9.34.0(jiti@2.6.1)) + version: 5.4.0(rollup@4.61.0) '@swc/cli': - specifier: ^0.7.8 - version: 0.7.8(@swc/core@1.13.5(@swc/helpers@0.5.17)) + specifier: ^0.8.1 + version: 0.8.1(@swc/core@1.15.40(@swc/helpers@0.5.23)) '@swc/core': - specifier: 1.13.5 - version: 1.13.5(@swc/helpers@0.5.17) - '@types/eslint__js': - specifier: ^9.14.0 - version: 9.14.0 + specifier: 1.15.40 + version: 1.15.40(@swc/helpers@0.5.23) '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^25.9.1 + version: 25.9.1 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260601.1 + version: 7.0.0-dev.20260601.1 '@vitest/coverage-v8': - specifier: ^3.0.4 - version: 3.2.4(vitest@3.2.4) + specifier: ^4.1.8 + version: 4.1.8(vitest@4.1.8) '@vitest/ui': - specifier: ^3.0.4 - version: 3.2.4(vitest@3.2.4) - commitizen: - specifier: ^4.3.1 - version: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) - eslint: - specifier: ^9.19.0 - version: 9.34.0(jiti@2.6.1) + specifier: ^4.1.8 + version: 4.1.8(vitest@4.1.8) eslint-plugin-license-header: - specifier: ^0.8.0 - version: 0.8.0 - eslint-plugin-unicorn: - specifier: ^60.0.0 - version: 60.0.0(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-unused-imports: - specifier: ^4.1.4 - version: 4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)) + specifier: ^0.9.0 + version: 0.9.0(eslint@9.34.0(jiti@2.7.0)) + oxfmt: + specifier: ^0.53.0 + version: 0.53.0 + oxlint: + specifier: ^1.68.0 + version: 1.68.0 pm2: specifier: ^6.0.8 version: 6.0.8 turbo: - specifier: ^2.4.0 - version: 2.5.6 + specifier: ^2.9.16 + version: 2.9.16 typescript: - specifier: ^5.7.3 - version: 5.9.2 - typescript-eslint: - specifier: ^8.22.0 - version: 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + specifier: ^6.0.3 + version: 6.0.3 unplugin: - specifier: ^2.1.2 - version: 2.3.8 + specifier: ^3.0.0 + version: 3.0.0 vitest: - specifier: ^3.0.4 - version: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) + specifier: ^4.1.8 + version: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) apps/api: dependencies: @@ -138,8 +111,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -178,8 +151,8 @@ importers: version: 3.1.0 devDependencies: '@nestjs/testing': - specifier: ^11.1.6 - version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)) + specifier: ^11.1.24 + version: 11.1.24(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@types/luxon': specifier: ^3.4.2 version: 3.7.1 @@ -214,8 +187,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -271,12 +244,9 @@ importers: '@statsify/util': specifier: workspace:^ version: link:../../packages/util - '@swc/core': - specifier: ^1.13.5 - version: 1.13.5(@swc/helpers@0.5.17) '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 chalk: specifier: ^5.6.0 version: 5.6.0 @@ -305,18 +275,15 @@ importers: '@types/inquirer': specifier: ^9.0.7 version: 9.0.9 - globals: - specifier: ^16.3.0 - version: 16.3.0 apps/site: dependencies: '@radix-ui/react-popover': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-slot': specifier: ^1.2.4 - version: 1.2.4(@types/react@19.2.7)(react@19.2.1) + version: 1.2.4(@types/react@19.2.16)(react@19.2.1) '@statsify/schemas': specifier: workspace:^ version: link:../../packages/schemas @@ -345,48 +312,39 @@ importers: specifier: ^19.2.1 version: 19.2.1(react@19.2.1) tailwind-merge: - specifier: ^3.4.0 - version: 3.4.0 + specifier: ^3.6.0 + version: 3.6.0 zod: specifier: ^4.1.5 version: 4.1.5 devDependencies: - '@eslint/eslintrc': - specifier: ^3.2.0 - version: 3.3.1 '@statsify/api-client': specifier: workspace:^ version: link:../../packages/api-client '@tailwindcss/postcss': - specifier: 4.1.17 - version: 4.1.17 + specifier: 4.3.0 + version: 4.3.0 '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^25.9.1 + version: 25.9.1 '@types/react': - specifier: ^19.2.7 - version: 19.2.7 + specifier: ^19.2.16 + version: 19.2.16 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.7) - eslint: - specifier: ^9.19.0 - version: 9.34.0(jiti@2.6.1) - eslint-config-next: - specifier: 15.5.2 - version: 15.5.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + version: 19.2.3(@types/react@19.2.16) mongoose: specifier: ^8.18.0 version: 8.18.0(socks@2.8.7) postcss: - specifier: ^8.5.3 - version: 8.5.6 + specifier: ^8.5.15 + version: 8.5.15 tailwindcss: - specifier: ^4.1.17 - version: 4.1.17 + specifier: ^4.3.0 + version: 4.3.0 typescript: - specifier: ^5.7.3 - version: 5.9.2 + specifier: ^6.0.3 + version: 6.0.3 apps/support-bot: dependencies: @@ -415,8 +373,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -470,8 +428,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -490,19 +448,6 @@ importers: stackblur-canvas: specifier: ^2.7.0 version: 2.7.0 - devDependencies: - '@commitlint/cli': - specifier: ^19.4.1 - version: 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/config-conventional': - specifier: ^19.4.1 - version: 19.8.1 - commitizen: - specifier: ^4.3.0 - version: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) assets/public: dependencies: @@ -534,8 +479,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: ^1.11.0 version: 1.11.0 @@ -549,8 +494,8 @@ importers: specifier: workspace:^ version: link:../schemas '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: 1.11.0 version: 1.11.0 @@ -579,8 +524,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: ^1.11.0 version: 1.11.0 @@ -619,8 +564,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 chalk: specifier: 5.6.0 version: 5.6.0 @@ -641,8 +586,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 packages/rendering: dependencies: @@ -656,8 +601,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: 1.11.0 version: 1.11.0 @@ -683,8 +628,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -701,11 +646,13 @@ importers: packages/skin-renderer: {} + packages/skin-renderer/pkg: {} + packages/util: dependencies: '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 packages: @@ -713,10 +660,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@azure/msal-common@14.16.0': resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} @@ -725,20 +668,16 @@ packages: resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} engines: {node: '>=16'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -746,8 +685,8 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -757,239 +696,170 @@ packages: '@borewit/text-codec@0.1.1': resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@commitlint/cli@19.8.1': - resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} - engines: {node: '>=v18'} - hasBin: true - - '@commitlint/config-conventional@19.8.1': - resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} - engines: {node: '>=v18'} - - '@commitlint/config-validator@19.8.1': - resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} - engines: {node: '>=v18'} - - '@commitlint/ensure@19.8.1': - resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} - engines: {node: '>=v18'} - - '@commitlint/execute-rule@19.8.1': - resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} - engines: {node: '>=v18'} - - '@commitlint/format@19.8.1': - resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} - engines: {node: '>=v18'} - - '@commitlint/is-ignored@19.8.1': - resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} - engines: {node: '>=v18'} - - '@commitlint/lint@19.8.1': - resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} - engines: {node: '>=v18'} - - '@commitlint/load@19.8.1': - resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} - engines: {node: '>=v18'} - - '@commitlint/message@19.8.1': - resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} - engines: {node: '>=v18'} - - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} - engines: {node: '>=v18'} - - '@commitlint/read@19.8.1': - resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} - engines: {node: '>=v18'} - - '@commitlint/resolve-extends@19.8.1': - resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} - engines: {node: '>=v18'} - - '@commitlint/rules@19.8.1': - resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} - engines: {node: '>=v18'} - - '@commitlint/to-lines@19.8.1': - resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} - engines: {node: '>=v18'} - - '@commitlint/top-level@19.8.1': - resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} - engines: {node: '>=v18'} - - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} - engines: {node: '>=v18'} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1000,12 +870,18 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.3.1': @@ -1016,16 +892,16 @@ packages: resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.34.0': resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.3.5': @@ -1086,22 +962,22 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -1243,13 +1119,17 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/checkbox@2.5.0': resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} engines: {node: '>=18'} - '@inquirer/checkbox@4.2.2': - resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1260,18 +1140,18 @@ packages: resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} engines: {node: '>=18'} - '@inquirer/confirm@5.1.16': - resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} - engines: {node: '>=18'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.2.0': - resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} - engines: {node: '>=18'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1286,9 +1166,9 @@ packages: resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} engines: {node: '>=18'} - '@inquirer/editor@4.2.18': - resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} - engines: {node: '>=18'} + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1299,18 +1179,18 @@ packages: resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} engines: {node: '>=18'} - '@inquirer/expand@4.0.18': - resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} - engines: {node: '>=18'} + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.1': - resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} - engines: {node: '>=18'} + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1321,13 +1201,17 @@ packages: resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/input@2.3.0': resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} engines: {node: '>=18'} - '@inquirer/input@4.2.2': - resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} - engines: {node: '>=18'} + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1338,9 +1222,9 @@ packages: resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} engines: {node: '>=18'} - '@inquirer/number@3.0.18': - resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} - engines: {node: '>=18'} + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1351,9 +1235,9 @@ packages: resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} engines: {node: '>=18'} - '@inquirer/password@4.0.18': - resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} - engines: {node: '>=18'} + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1364,9 +1248,9 @@ packages: resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} engines: {node: '>=18'} - '@inquirer/prompts@7.8.4': - resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} - engines: {node: '>=18'} + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1377,9 +1261,9 @@ packages: resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} engines: {node: '>=18'} - '@inquirer/rawlist@4.1.6': - resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} - engines: {node: '>=18'} + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1390,9 +1274,9 @@ packages: resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} engines: {node: '>=18'} - '@inquirer/search@3.1.1': - resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} - engines: {node: '>=18'} + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1403,9 +1287,9 @@ packages: resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} engines: {node: '>=18'} - '@inquirer/select@4.3.2': - resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} - engines: {node: '>=18'} + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1420,9 +1304,9 @@ packages: resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} engines: {node: '>=18'} - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} - engines: {node: '>=18'} + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1444,16 +1328,9 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@j4cobi/eslint-plugin-sort-imports@1.0.2': resolution: {integrity: sha512-0bTHYIohk2RnWW8+FQoE06s/80aF1iPxP62JiS2+9chUFrs9D7+p0niFtNctcZGRPo5aOKG9q/ypPlT8OWcwyg==} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1464,18 +1341,18 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -1499,18 +1376,15 @@ packages: '@mongodb-js/saslprep@1.3.0': resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} - '@napi-rs/cli@3.1.5': - resolution: {integrity: sha512-Wn6ZPw27qJiEWglGjkaAa70AHuLtyPya6FvjINYJ5U20uvbRhoB0Ta2+bFTAFfUb9R+wvuFvog9JQdy65OmFAQ==} + '@napi-rs/cli@3.7.0': + resolution: {integrity: sha512-3d3+rmxlOIV/G1zPWeX4PCxuYnhcCQM2BvY9rtimC8RO0dFR9gtYP+Grov+WoduZtfWRj5N1XvytWeRxxCk5zw==} engines: {node: '>= 16'} hasBin: true peerDependencies: - '@emnapi/runtime': ^1.1.0 - emnapi: ^1.1.0 + '@emnapi/runtime': ^1.7.1 peerDependenciesMeta: '@emnapi/runtime': optional: true - emnapi: - optional: true '@napi-rs/cross-toolchain@1.0.3': resolution: {integrity: sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg==} @@ -1857,11 +1731,11 @@ packages: resolution: {integrity: sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - - '@napi-rs/wasm-runtime@1.0.3': - resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': resolution: {integrity: sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw==} @@ -2025,8 +1899,8 @@ packages: class-validator: optional: true - '@nestjs/testing@11.1.6': - resolution: {integrity: sha512-srYzzDNxGvVCe1j0SpTS9/ix75PKt6Sn6iMaH1rpJ6nj2g8vwNrhK0CoJJXvpCYgrnI+2WES2pprYnq8rAMYHA==} + '@nestjs/testing@11.1.24': + resolution: {integrity: sha512-+4M4UAnhtprBQN0J2uI6IP0wDqhy9aH8XCMu5SO8oCi0oB04YXA4a4PAEkxmsPn7gHW4dj1u4GFteNQOWgvTJw==} peerDependencies: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 @@ -2041,9 +1915,6 @@ packages: '@next/env@16.0.7': resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/eslint-plugin-next@15.5.2': - resolution: {integrity: sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==} - '@next/swc-darwin-arm64@16.0.7': resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} @@ -2104,10 +1975,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@nuxt/opencollective@0.4.1': resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} @@ -2117,23 +1984,23 @@ packages: resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} - '@octokit/core@7.0.3': - resolution: {integrity: sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} engines: {node: '>= 20'} - '@octokit/endpoint@11.0.0': - resolution: {integrity: sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} engines: {node: '>= 20'} - '@octokit/graphql@9.0.1': - resolution: {integrity: sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} engines: {node: '>= 20'} - '@octokit/openapi-types@25.1.0': - resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - '@octokit/plugin-paginate-rest@13.1.1': - resolution: {integrity: sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==} + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' @@ -2144,30 +2011,254 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@16.0.0': - resolution: {integrity: sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@7.0.0': - resolution: {integrity: sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} - '@octokit/request@10.0.3': - resolution: {integrity: sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==} + '@octokit/request@10.0.10': + resolution: {integrity: sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==} engines: {node: '>= 20'} - '@octokit/rest@22.0.0': - resolution: {integrity: sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==} + '@octokit/rest@22.0.1': + resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} engines: {node: '>= 20'} - '@octokit/types@14.1.0': - resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@oxfmt/binding-android-arm-eabi@0.53.0': + resolution: {integrity: sha512-XfVM8AmIovBTKXCt14Op5wbfcoM8418nttd+nhMgM3RAVaJg1MtJc73FyWfUt0oxLyBGVwfniNVUsbV/b3VmPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.53.0': + resolution: {integrity: sha512-btHDfXckwdf9zgyAVznfZkf+GVyB0I1m1hlvaOMRx2xoyz3hphfPX97s89J3wfCN8QBETLtk4lQUaeOkrMuQOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.53.0': + resolution: {integrity: sha512-k2RjMcSTkHjoOlsVGbL35JVzXL+oQco3GHPl/5kjebVF4oHNfE24In8F5isqBh9LBJucycWHKDXdGrCchdWcHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.53.0': + resolution: {integrity: sha512-65jIBE2H1l5SSs16fmv6/7b6sAx/WpvnsgDhVWK9qSjNFDUro7MPQ6q5UhpY7kl46yltfR046iAnxy/Bzqbiew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.53.0': + resolution: {integrity: sha512-oYe1gkz7U49PCYrS9147d2fJZj8mDI4Di6AvlsU5fu9p+Tq8S7qqOMSZjUiVTLX8bXuSA9Lk/tIxuegVjkNYRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.53.0': + resolution: {integrity: sha512-ailB2vLzGi629tymdAb2VYJyEHref7oqGxP+tRBrtRBxQrb6NV55JMT7xtGZ8uTeG2+Y9zojqW4LhJYxQnz9Pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.53.0': + resolution: {integrity: sha512-abh4mWBvOvD966sobqF7r103y2yYx7Rb4WGHLOS4+5igGqLbbPxS9aK5+45D6iUY7dWMsk3Muz9a8gUtufvqJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.53.0': + resolution: {integrity: sha512-z73PvuhJ8qA+cDbaiqbtopHglA91U4+y5wn2sTJJrnpB957d5P33FEuyP3DQIFd7ofljmDmfVT4G0CVGHZaJWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.53.0': + resolution: {integrity: sha512-I6bhOTroqc3ThrwZ89l2k3ivKuELhdPLbAcJhRNyjWvlgwb0vjRgEnVL1XLx5Jud04/ypNRZBykAWrSk6l/D+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.53.0': + resolution: {integrity: sha512-w0p3JzB/PkkQjXALMJMqP9YfP3yq4w6zGsu5kezQmUnxRkN3b/Theg2l/nDgBsOcczxS3gL6Gam5XNAVrO6QJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.53.0': + resolution: {integrity: sha512-mzBhF6k1Yq1K/dqDmVe/AAafnlJfEpx7yfUiksyeWXJk5iSzZqBSxcsa02zIytYgQFRZ7h6WPZfwHg/DoOE1Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.53.0': + resolution: {integrity: sha512-AlFCpnRQhogQFzZXWbO6xB6/Udy745L+eQNmDPGg7G/OeWsYmJc4jZYfUN5pQg0reOPWSED2mOQqKZOJM1U8cA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.53.0': + resolution: {integrity: sha512-XD4ulY4f1DWbuuZXAqxhVn+gdPmrhnmojWtFN78ctVoupmS845fGhsUrk1HZXKQI+iymbaiz9vAjPsghHNQ7Ag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.53.0': + resolution: {integrity: sha512-xg8KWX0QnxmYWRe60CgHYWXI0ZOtBbqTsXvWiWrcl2XUHJ3fht2QerOk2iWvylzX3zNT2GpvBRxGoR4d3sxPRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.53.0': + resolution: {integrity: sha512-MWExpYBGvl+pIvVB/gj/CcWlN2al8AizT7rUbtaYaWNoQkhWARM6W3qpgoCr72CYSN9PborzPmM5MIRe2BrNdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.53.0': + resolution: {integrity: sha512-u4sajgO4nxgmJIgc/y2AqPhkdbOkQH8WugXpA1+pW0ESQhvGZ1oGq61Q4xMbJHJU1hFgtO18QNrcFYDPYH0gwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.53.0': + resolution: {integrity: sha512-Yq9sOZoIOJ5xPjO0qOyHJS4CiPuTkB2en9auxZz7Ar2p5RaC7BzLyVVmAA7zz9/L9YnjjY1DwNxN+ivKXimN/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.53.0': + resolution: {integrity: sha512-es1fVNZEkBqEcQtBpn19SYFgZF7FawlkCjkT/iImfEAus4gun8fBwB1E9hpV5LcR9B0DBNvRIXhW8BQk3JaE+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.53.0': + resolution: {integrity: sha512-QFmJs2bEu9AO4O6qsmEaZNGi6dFq8N+rT8EHAAnZIq/B9SeJDUbc4DzVxQ48MfDsL7D3sCZzo37zuTuspcURgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.68.0': + resolution: {integrity: sha512-wEdsIspexXLLMCPAEOcCuFLMt6aE3AzTuA/nQKLPRnoJ+EQTturmGheDkhHuuVHx0GbutjQ3JKmEn+Gz6Ag28Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.68.0': + resolution: {integrity: sha512-6aZRNNXQTsYtgaus8HTb9nuCcsrQTlKXGnktwvwW0n/SooRWNxNb3925grDkC63aEYZuCIyOVLV16IdYIoC2aQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.68.0': + resolution: {integrity: sha512-lVTbsE3kO4bLpZELgjRZuAJc8kP98wb83yMXWH8gaPaFZ+cM2IDeZto4ByoUAYj0Mxv2rvw+A1ssZequSepVSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.68.0': + resolution: {integrity: sha512-nCmw2XrmQskjBUh/sfP5yKs93V68LijQgjd1cuuZ/q4SCARngLYs60/qqyzuMsg8QQ9KArDI98hxs/RDGE4KRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.68.0': + resolution: {integrity: sha512-TI4ovQJliYE9V6e06cEv+qEI9uj7Ao65fmif4er4HD+aouyYyh0P31q2jh3KtqsOHHcQqv2PZ61TjJFLpBDGWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + resolution: {integrity: sha512-LcNnEi9g71Cmry5ZpLbKT+oVv+/zYG3hYVAbBBB5X85nOQZSk8l92CnDkxJMcxUg0NCnMCOFZuaVDlMyv4tYJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + resolution: {integrity: sha512-OovHahL3FX4UaK+hgSf11llUx2vszqjSdQQ61Ck9InOEI/ptZoC4XSQJurITqItVvd53JSlmkLMeaNjM1PoQew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + resolution: {integrity: sha512-YbzTglnHLzzi9zv5or8Ztz5fykAoZE8W9iM42/bOrF4HBSB6rJTqdLQWuoP76EHQw9DuKl76K1QmFlG29sPJXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.68.0': + resolution: {integrity: sha512-qVKtCZNic+OoNnOr/hCQAu22HSQzflI7Fsq/Blzkw02SnLuv163k3kfmrVpZjSBlUHgsRKj6WgQiw30d3SX02Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + resolution: {integrity: sha512-zExyZ8ZOUuAyQ0y9jpTcyjKUz62YY9JhKPyVxzvjTpXzZ3ujdqiVwfPWDdnA1SsIOrxdtxHn7KErDHLWskFjXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + resolution: {integrity: sha512-6C4MPuwewyDavA7sxM14wzgRi5GGL68HPIxRCdVyS75U4MDbpFVYzKO9WNR6KLKTMPq2pcz3THwo1sK2uiqngw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + resolution: {integrity: sha512-bnZooVeHAcvA+dH0EDLgx+7HY/DRi6e0hFszg3P+OBatuUjV6EvfIyNIzWOusmqAVh4L6r21GGTZtiKE4iqM4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + resolution: {integrity: sha512-dIqnZnJSmHCMOUpUcWQOiV14o3DDPVx1DSsMaSzvdhNjC1tB1iEPZbdiMSCIEYbkgbsYznHXWqFdKL8WUB3F8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.68.0': + resolution: {integrity: sha512-zc9lEnfV/HreDTY6gdMlZe+irkwHSxQ4/B1pS9GyK7RVaA5LxhoZY/w6/o2vIwLLEYiXQ5ujGxOM1ZazeFAAIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.68.0': + resolution: {integrity: sha512-Dl5QEX0TCo/40Cdh1o1JdPS//+YiWqjC+Hrrya5OQmStZZr4svAFtdlqcpCrU9yq2Mo3vRVyO9B3h0dzD8s36Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.68.0': + resolution: {integrity: sha512-/qy6dOvi4S3/LeXq0l5BT5pRKPYA7oj3uKwJOAZOr5HRLL+HK6jdBynvWuXIA2wwfE01RzNYmbBdM7vwYx00sA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + resolution: {integrity: sha512-fHNtVqPHSYE7UFDSLVFUjxQjnSVXxseNJmRW+XuP4pXXDwePdPda43NL7/BBCFTxHjycOc44JNDaOPtFDNui9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + resolution: {integrity: sha512-NnKXr4Wgo4nps3erhrE0f8shBvBPZMHg72nDsvX0JyrRvsNiP3f1JNvbCKh+A6VFvpF7ZoJxu904P3cKMhvZnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.68.0': + resolution: {integrity: sha512-zg5pA+84AlU6XHJ3ruiRxziO71QTrz8nLsk6u01JGS5+tL9/bnlakFiklFrcy4R1/V7ktWtaNitN3JZWmKnf6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] '@pm2/agent@2.1.1': resolution: {integrity: sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==} @@ -2413,8 +2504,8 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2422,215 +2513,137 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm-eabi@4.49.0': - resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.49.0': - resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-arm64@4.49.0': - resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.49.0': - resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-arm64@4.49.0': - resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.49.0': - resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': - resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.49.0': - resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.49.0': - resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.49.0': - resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': - resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.49.0': - resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.49.0': - resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.49.0': - resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.49.0': - resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.49.0': - resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.49.0': - resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} - cpu: [x64] - os: [linux] + os: [openbsd] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} cpu: [arm64] - os: [win32] + os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.49.0': - resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.49.0': - resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.49.0': - resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.12.0': - resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} - '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sentry-internal/tracing@7.120.4': resolution: {integrity: sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw==} engines: {node: '>=8'} @@ -2655,89 +2668,102 @@ packages: resolution: {integrity: sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==} engines: {node: '>=8'} - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} - '@stylistic/eslint-plugin@5.2.3': - resolution: {integrity: sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=9.0.0' + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - '@swc/cli@0.7.8': - resolution: {integrity: sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w==} - engines: {node: '>= 16.14.0'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/cli@0.8.1': + resolution: {integrity: sha512-L+ACCGHCiS0VqHVep/INLVnvRvJ2XooQFLZq4L8snhxw1jsqz+XRcY313UsyPVturPPE1shW3jic7rt3qEQTSQ==} + engines: {node: '>= 20.19.0'} hasBin: true peerDependencies: '@swc/core': ^1.2.66 - chokidar: ^4.0.1 + chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@swc/core-darwin-arm64@1.13.5': - resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} + '@swc/core-darwin-arm64@1.15.40': + resolution: {integrity: sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.13.5': - resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} + '@swc/core-darwin-x64@1.15.40': + resolution: {integrity: sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.13.5': - resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} + '@swc/core-linux-arm-gnueabihf@1.15.40': + resolution: {integrity: sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.13.5': - resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} + '@swc/core-linux-arm64-gnu@1.15.40': + resolution: {integrity: sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.13.5': - resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} + '@swc/core-linux-arm64-musl@1.15.40': + resolution: {integrity: sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.13.5': - resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} + '@swc/core-linux-ppc64-gnu@1.15.40': + resolution: {integrity: sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.40': + resolution: {integrity: sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.40': + resolution: {integrity: sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.13.5': - resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} + '@swc/core-linux-x64-musl@1.15.40': + resolution: {integrity: sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.13.5': - resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} + '@swc/core-win32-arm64-msvc@1.15.40': + resolution: {integrity: sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.13.5': - resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} + '@swc/core-win32-ia32-msvc@1.15.40': + resolution: {integrity: sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.13.5': - resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} + '@swc/core-win32-x64-msvc@1.15.40': + resolution: {integrity: sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.13.5': - resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} + '@swc/core@1.15.40': + resolution: {integrity: sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -2751,75 +2777,71 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@swc/types@0.1.24': - resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@tailwindcss/node@4.1.17': - resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@tailwindcss/oxide-android-arm64@4.1.17': - resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.17': - resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.17': - resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.17': - resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': - resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': - resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.17': - resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.17': - resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.17': - resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.17': - resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2830,24 +2852,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': - resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.17': - resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.17': - resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - '@tailwindcss/postcss@4.1.17': - resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==} + '@tailwindcss/postcss@4.3.0': + resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} '@tanstack/query-core@5.90.12': resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} @@ -2861,14 +2883,48 @@ packages: resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@turbo/darwin-64@2.9.16': + resolution: {integrity: sha512-jLjApWTSNd7JZ5JaLYfelW1ytnGQOvB7ivl+2RD1xQvJTbi8I9gBjzcga7tDZVPyaxpl10YTfJt3BrYXR18KDw==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.16': + resolution: {integrity: sha512-YPgrn+5HIGzrx0O2a631SV4MBQUe4W/DafMFUuBVgaU32PW9/OTT0ehviF0QSxTXuRJlHvW2eUTemddF5/spmw==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.9.16': + resolution: {integrity: sha512-vAEf1H6l26lTpl9FJ/peQo1NUB8RC0sbEJJz5mPcUhHA2bPDup2x3CZPgo/bH8S4cUcBLm4FN3UHd5iUO2RAew==} + cpu: [x64] + os: [linux] + + '@turbo/linux-arm64@2.9.16': + resolution: {integrity: sha512-xDBLR2PZg4BrQOchfG6svgpv5FCNJ2TOtT2psLdEJcdKo1BH+pnPs9Xj6pvUjgfkHbuvBOfeE4R6tvxMoQKDHQ==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.9.16': + resolution: {integrity: sha512-NBAJnaUiGdgkSzQwUIdOvkCkcpTSu58G/sBGa0mvBtzfvFOOgrQwepKOOQ8cp6sWM6OcKDNFj2p1dsZA1OWjPg==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.9.16': + resolution: {integrity: sha512-Y7SJppD0Z8wjO3Ec0ZGd9KQ4Yv0BMnA8CIowj5Vp+OEVsosXDG2weK6/t1RRLfJmc2Ozrnd6y4DOgQys+mn3WQ==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@typegoose/typegoose@12.19.0': resolution: {integrity: sha512-rsHMd3M6Rj6YYw6ecZU6YtXjiBzCqO3zJtgrrVCau1bEp6na8sbMcqRy8kNbTRyA2QCBAGEvM7nXTM8hdxeEiQ==} @@ -2876,24 +2932,17 @@ packages: peerDependencies: mongoose: ~8.18.0 - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/conventional-commits-parser@5.0.1': - resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint__js@9.14.0': - resolution: {integrity: sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==} - deprecated: This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed. + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/i18next-fs-backend@1.2.0': resolution: {integrity: sha512-30XnjBF+SLndemvooRQRtcoD5xmF2nNNTa5RqE63+OWssaZOxN9r895ZvXUMbkk8YZr1Cy3scpQBZ6YXLH+jEg==} @@ -2905,9 +2954,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/luxon@3.7.1': resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} @@ -2917,19 +2963,19 @@ packages: '@types/node-rsa@1.1.4': resolution: {integrity: sha512-dB0ECel6JpMnq5ULvpUTunx3yNm8e/dIkv8Zu9p2c8me70xIRUUG3q+qXRwcSf9rN3oqamv4116iHy90dJGRpA==} - '@types/node@22.18.0': - resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} '@types/readable-stream@4.0.21': resolution: {integrity: sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==} @@ -2949,80 +2995,32 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@typescript-eslint/eslint-plugin@8.41.0': - resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.41.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.41.0': - resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.37.0': resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.41.0': - resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.37.0': resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.41.0': - resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.37.0': resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/tsconfig-utils@8.41.0': - resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.41.0': - resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.37.0': resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.41.0': - resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.37.0': resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.41.0': - resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.37.0': resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3030,116 +3028,57 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.41.0': - resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.37.0': resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-d4PVG8gcotwb5eJiMK14GdFOXRCH3tx4nAJxBcwJ3ZxPJ8Se3eQ54NZMeuuulU9isMJgtVxusAgjI8Qkhg4xDg==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-JJ34gLHbemqkRRuWshdWYL+WFXVYMmivRKD6qyHkhLGWmq3AmPaAsjNoscdaDRWU3GrQm1gI2hx8N+BpaJow7Q==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-Pr3/dVouvJ1So1buF6OZ5sUJ2Ij8BOX2vZXugJeoyeSgCjkhsZO4IJ3hW87aY3KpFrgJMLimKy2Ud1S3o9wPxQ==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] + '@typescript/native-preview-linux-arm@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-8jMjFrryB4hosxgKY6R1RJA9imUvxwk99AoRcfmy4xHZ7pLQ/QgAxElZaISOT8/gXQfVWppfI2Sj5YakgiAqyQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-FJUXnaSz8OWZSQiX02Sd51pXQSpZEHvkChuM/UxTsJ1kfRCzx59jB5fmN3JLiRoUizJIa0rhxu/+YA+/c/euqw==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-tzc4eMCpdu+rHKxNUzWclm107WoCIbbcYrDg5DU5/07Wk5QlXG6bXsaKILpXxA60tyseVLbRe4wv6Ww79X7EgA==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-H0YctU7f48BpxTaGTdK7f1UT5+1EY6pg7vMK9zBQXVhc8wSrCpQg4O/rf7kM8vyLUsC/pJpTE5OLUlxk+addCg==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] + '@typescript/native-preview@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-IAoqEMiW2aw3m74TLQbNI1V235p9Sk8XhvvKTw2U5YAOfkPEFZaoYFvmoqWA/d2OLap1D3atyNbtD/dub7Jn9g==} + engines: {node: '>=16.20.0'} + hasBin: true + '@vercel/analytics@1.6.1': resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} peerDependencies: @@ -3189,48 +3128,48 @@ packages: vue-router: optional: true - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.1.8 + vitest: 4.1.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/ui@3.2.4': - resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} + '@vitest/ui@4.1.8': + resolution: {integrity: sha512-RUS2ZU2TsduVrI+9c12uTNaKrNUTsm6yFt3fueEUB9iKvyC2UP83F+sqIz00HQIah4UOL1TMoDAki8K0NjGvsA==} peerDependencies: - vitest: 3.2.4 + vitest: 4.1.8 - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} '@xboxreplay/errors@0.1.0': resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} @@ -3238,49 +3177,45 @@ packages: '@xboxreplay/xboxlive-auth@3.3.3': resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} - '@xhmikosr/archive-type@7.1.0': - resolution: {integrity: sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg==} - engines: {node: '>=18'} - - '@xhmikosr/bin-check@7.1.0': - resolution: {integrity: sha512-y1O95J4mnl+6MpVmKfMYXec17hMEwE/yeCglFNdx+QvLLtP0yN4rSYcbkXnth+lElBuKKek2NbvOfOGPpUXCvw==} - engines: {node: '>=18'} + '@xhmikosr/archive-type@8.0.1': + resolution: {integrity: sha512-toXuiWChyfOpEiCPsIw6HGHaNji5LVkvB6EREL548vGWr+hGaehwxG4LzN20vm9aGFXwnA/Jty8yW2/SmV+1zQ==} + engines: {node: '>=20'} - '@xhmikosr/bin-wrapper@13.2.0': - resolution: {integrity: sha512-t9U9X0sDPRGDk5TGx4dv5xiOvniVJpXnfTuynVKwHgtib95NYEw4MkZdJqhoSiz820D9m0o6PCqOPMXz0N9fIw==} - engines: {node: '>=18'} + '@xhmikosr/bin-check@8.2.1': + resolution: {integrity: sha512-DNruLq+kalxcE7JeDxtqrN9kyWjLW8VqsQPLRTwD1t9ck/1rF4qBL0mX5Fe2/xLOMjo5wPb67BNX2kSAhzfLjA==} + engines: {node: '>=20'} - '@xhmikosr/decompress-tar@8.1.0': - resolution: {integrity: sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==} - engines: {node: '>=18'} + '@xhmikosr/bin-wrapper@14.2.5': + resolution: {integrity: sha512-MXfD5mNdc9xQM4/I4O7uWSdQqeZPTYRQSfddUtfH9oUeVkDUTnX4HI2udTsvDEs7ptv2ywHE9UfxlMUs+79wFw==} + engines: {node: '>=20'} - '@xhmikosr/decompress-tarbz2@8.1.0': - resolution: {integrity: sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw==} - engines: {node: '>=18'} + '@xhmikosr/decompress-tar@9.0.1': + resolution: {integrity: sha512-4AkVR1SoqTxYY22IRRYKDeLirPIDGqMqYsqgjKYuwhgRcBb+yDP4t5Xph33UCzL/nahK/aADmlMEjTNstbX7kw==} + engines: {node: '>=20'} - '@xhmikosr/decompress-targz@8.1.0': - resolution: {integrity: sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA==} - engines: {node: '>=18'} + '@xhmikosr/decompress-tarbz2@9.0.1': + resolution: {integrity: sha512-aFONnsbqEOuXudvK7V7wB8dcEAKR389oUYQfZhrQZA8OtogJpDjrUAvEH3Qlc9yFqTU6r5/svTEcRwtXhoIJbQ==} + engines: {node: '>=20'} - '@xhmikosr/decompress-unzip@7.1.0': - resolution: {integrity: sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==} - engines: {node: '>=18'} + '@xhmikosr/decompress-targz@9.0.1': + resolution: {integrity: sha512-1JXu2b6yrpm5EuBoOzMU57B4qrHXJKWQQ7LlMynNEiz85mEjDciO3ayf//GXaTLLCEKiHjWlU3q3THjgf7uODA==} + engines: {node: '>=20'} - '@xhmikosr/decompress@10.2.0': - resolution: {integrity: sha512-MmDBvu0+GmADyQWHolcZuIWffgfnuTo4xpr2I/Qw5Ox0gt+e1Be7oYqJM4te5ylL6mzlcoicnHVDvP27zft8tg==} - engines: {node: '>=18'} + '@xhmikosr/decompress-unzip@8.1.1': + resolution: {integrity: sha512-/B+Z0qJflGn5UEtmMZ2qeKeXwexOycxaibYhMOyLcRPJriXs4IkoSngVUVZXLYViu9TdHyFWynC6NB4EWBg8cg==} + engines: {node: '>=20'} - '@xhmikosr/downloader@15.2.0': - resolution: {integrity: sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g==} - engines: {node: '>=18'} + '@xhmikosr/decompress@11.1.3': + resolution: {integrity: sha512-NiyhJq6z7ERsYghcnXZUI6ooDXgZtoB+G9eUsYhfSM4VLp2rKx9UxhKI1NEf1PqosrNPxG3bnSsr2UBVbNurlg==} + engines: {node: '>=20'} - '@xhmikosr/os-filter-obj@3.0.0': - resolution: {integrity: sha512-siPY6BD5dQ2SZPl3I0OZBHL27ZqZvLEosObsZRQ1NUB8qcxegwt0T9eKtV96JMFQpIz1elhkzqOg4c/Ri6Dp9A==} - engines: {node: ^14.14.0 || >=16.0.0} + '@xhmikosr/downloader@16.1.3': + resolution: {integrity: sha512-jtQZZbO3xsRmDDeEz7m23ydgbW9YpVnOALNygmKNvjjuTuQwtcXGVJ9xWv4x7niElvziJrak+WUBmWYcFosolA==} + engines: {node: '>=20'} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + '@xhmikosr/os-filter-obj@4.1.0': + resolution: {integrity: sha512-y5ArHvQ7BVule/+L9yE2nYMhceiJhgsqo58lOfnisQ7bg+Kjfmkgr7JBuVFiTkl+ErdShpp829QstZQyLugl8g==} + engines: {node: '>=20'} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -3294,8 +3229,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -3317,6 +3252,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -3342,10 +3280,6 @@ packages: resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3362,9 +3296,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arch@3.0.0: - resolution: {integrity: sha512-AmIAC+Wtm2AU8lGfTtHsw0Y9Qtftx2YXEEtiBP10xFUtMOA+sHHx6OAddyL52mUKh1vsXQ6/w1mVDptZCyUt4Q==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3372,45 +3303,6 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - asn1@0.2.3: resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} @@ -3418,19 +3310,12 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -3441,43 +3326,37 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.1: - resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + bare-events@2.8.3: + resolution: {integrity: sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3490,20 +3369,17 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - bin-version-check@5.1.0: - resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} - engines: {node: '>=12'} - - bin-version@6.0.0: - resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} - engines: {node: '>=12'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + binary-version-check@6.1.0: + resolution: {integrity: sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA==} + engines: {node: '>=18'} + + binary-version@7.1.0: + resolution: {integrity: sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw==} + engines: {node: '>=18'} blessed@0.1.81: resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} @@ -3513,28 +3389,23 @@ packages: bodec@0.1.0: resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.3: - resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - bson@6.10.4: resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} engines: {node: '>=16.20.1'} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -3551,56 +3422,33 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@5.0.0: - resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} - engines: {node: '>=18.20'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + byte-counter@0.1.0: + resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} + engines: {node: '>=20'} cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} + cacheable-request@13.0.19: + resolution: {integrity: sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==} + engines: {node: '>=18'} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001737: - resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} - caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -3613,56 +3461,29 @@ packages: resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} charm@0.1.2: resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} - engines: {node: '>=8'} - class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} class-validator@0.14.2: resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-tableau@2.0.1: resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} engines: {node: '>=8.10.0'} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -3675,28 +3496,14 @@ packages: peerDependencies: typanion: '*' - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3721,14 +3528,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commitizen@4.3.1: - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} - engines: {node: '>= 12'} - hasBin: true - - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3740,46 +3539,25 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} - conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} - conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - core-js-compat@3.45.1: - resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} - - cosmiconfig-typescript-loader@6.1.0: - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - croner@4.1.97: resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} @@ -3797,33 +3575,10 @@ packages: culvert@0.1.2: resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} - cz-conventional-changelog@3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -3859,39 +3614,22 @@ packages: supports-color: optional: true - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - defaults@2.0.2: - resolution: {integrity: sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==} - engines: {node: '>=16'} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -3912,14 +3650,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -3933,14 +3663,6 @@ packages: discord-api-types@0.38.22: resolution: {integrity: sha512-2gnYrgXN3yTlv2cKBISI/A8btZwsSZLwKpIQXeI1cS8a7W7wP3sFVQOm3mPuuinTD8jJCKGPGNH399zE7Un1kA==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3951,8 +3673,13 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.5.209: - resolution: {integrity: sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==} + emnapi@1.10.0: + resolution: {integrity: sha512-swoyZjupDvLoe/KC3HZ4SY1JUN+tviT6eOZ3Px28TZAYdBHtRIiMWWrIUUH+2/9CYY4fNTID1YhYZ+kdFHszHg==} + peerDependencies: + node-addon-api: '>= 6.1.0' + peerDependenciesMeta: + node-addon-api: + optional: true emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3963,25 +3690,14 @@ packages: endian-toggle@0.0.0: resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.22.1: + resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==} engines: {node: '>=10.13.0'} enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3990,12 +3706,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -4005,33 +3717,17 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - es-toolkit@1.39.10: - resolution: {integrity: sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w==} + es-toolkit@1.47.0: + resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -4041,97 +3737,10 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@15.5.2: - resolution: {integrity: sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-license-header@0.8.0: - resolution: {integrity: sha512-khTCz6G3JdoQfwrtY4XKl98KW4PpnWUKuFx8v+twIRhJADEyYglMDC0td8It75C1MZ88gcvMusWuUlJsos7gYg==} - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} + eslint-plugin-license-header@0.9.0: + resolution: {integrity: sha512-Qd7cCljVC0h+uJjcIuYjpRFrdzwqBBDCi5U0ocr6Bt/5t3zuBkZSa1Igc4lBLEVBDoUUqIcok/UUNAAu6CtwmQ==} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-unicorn@60.0.0: - resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==} - engines: {node: ^20.10.0 || >=21.0.0} - peerDependencies: - eslint: '>=9.29.0' - - eslint-plugin-unused-imports@4.2.0: - resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true + eslint: ^9 || ^10 eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} @@ -4164,8 +3773,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -4196,20 +3805,23 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} ext-list@2.2.2: @@ -4227,9 +3839,6 @@ packages: extrareqp2@1.0.0: resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -4239,10 +3848,6 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4269,9 +3874,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -4287,8 +3901,9 @@ packages: fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4298,29 +3913,32 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@20.5.0: - resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} - engines: {node: '>=18'} - file-type@21.0.0: resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} engines: {node: '>=20'} - filename-reserved-regex@3.0.0: - resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} - filenamify@6.0.0: - resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} - engines: {node: '>=16'} + filename-reserved-regex@4.0.0: + resolution: {integrity: sha512-9ZT504KxEQDamsOogZImAWGEN24R1uFAxU3ZS4AZqn2ooidmN68Olh7n4/RcA4lLatZztjA0ZSuxeLHVoCc8JA==} + engines: {node: '>=20'} + + filenamify@7.0.1: + resolution: {integrity: sha512-9b4rfnaX2MkJCgp27wypV6DAMvj4WMOSgJ+TdcpJIO84Dql+Cv6iJjdG4XDTLubOWkfNiBv3joO59sau/TXw+Q==} + engines: {node: '>=20'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -4330,38 +3948,20 @@ packages: resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} engines: {node: '>=20'} - find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} engines: {node: '>=18'} - find-versions@5.1.0: - resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} - engines: {node: '>=12'} - - findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -4372,17 +3972,13 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} @@ -4402,13 +3998,6 @@ packages: react-dom: optional: true - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -4417,21 +4006,14 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} fuse.js@7.1.0: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4444,16 +4026,13 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -4467,12 +4046,6 @@ packages: js-git: optional: true - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. - hasBin: true - git-sha1@0.1.2: resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} @@ -4484,83 +4057,36 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - 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 - hasBin: true - glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} 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 hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - 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 - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} + got@14.6.6: + resolution: {integrity: sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==} + engines: {node: '>=20'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -4573,10 +4099,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4599,9 +4121,13 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} i18next-fs-backend@2.6.0: resolution: {integrity: sha512-3ZlhNoF9yxnM8pa8bWp5120/Ob6t4lVl1l/tbLmkml/ei3ud8IWySCHt2lrY5xWRlSU5D9IV2sm5bEbGuTqwTw==} @@ -4613,8 +4139,8 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -4624,10 +4150,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -4635,46 +4157,23 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@10.2.2: resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} engines: {node: '>=18'} - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - inspect-with-kind@1.0.5: resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - ioredis@5.7.0: resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} engines: {node: '>=12.22.0'} @@ -4687,40 +4186,10 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-builtin-module@5.0.0: - resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} - engines: {node: '>=18.20'} - - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-class@0.0.9: resolution: {integrity: sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg==} @@ -4728,191 +4197,94 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} - hasBin: true - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-git@0.7.8: resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-ref-resolver@2.0.1: resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} @@ -4928,25 +4300,13 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} @@ -4960,17 +4320,13 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4984,79 +4340,76 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-esm@1.0.2: resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==} engines: {node: '>=13.2.0'} @@ -5068,13 +4421,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -5099,65 +4445,26 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} lodash.reduce@4.6.0: resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} @@ -5177,14 +4484,15 @@ packages: macaddress@0.5.3: resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -5197,10 +4505,6 @@ packages: memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5208,9 +4512,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5232,22 +4533,14 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} mimic-response@4.0.0: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minecraft-data@3.93.0: resolution: {integrity: sha512-AaQ+mdcHb58uDqcoK380lRh83r3IpkGREdLi577BI51t2kru+mTVDO4IFDJzDm3e9N8C7T4KQ1qWl0id98KbtA==} @@ -5262,15 +4555,16 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -5369,18 +4663,18 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.3: - resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: @@ -5433,9 +4727,6 @@ packages: encoding: optional: true - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-rsa@0.4.2: resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} @@ -5443,92 +4734,82 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + oxfmt@0.53.0: + resolution: {integrity: sha512-9cB5glS3Ip6NMuZ+6NYTao9FCWkDhRtPYCtR3QBu/NxHoFbgzzTvi41N4jxz/GqGfuLKspui1qb/LlSu2IbMcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.68.0: + resolution: {integrity: sha512-dXcbq+xsmLrMy6T8d0euf3IYUfLmjHIE11pOxiUSi5LHkFZaYPv568R6sEjcavVpUxoaQe66UBuK4HEi74NxpA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} @@ -5551,37 +4832,25 @@ packages: parenthesis@3.1.8: resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -5593,22 +4862,18 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pidusage@2.0.21: @@ -5632,10 +4897,6 @@ packages: piscina@4.9.2: resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - pm2-axon-rpc@0.7.1: resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} engines: {node: '>=5'} @@ -5659,22 +4920,22 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prismarine-auth@2.7.0: resolution: {integrity: sha512-L8wTF6sdtnN6hViPNy+Nx39a8iQBwR5iO92AWCiym5cSXp/92pmnuwnTdcmNDWyqq6zY4hbibVGYhgLA1Ox8sQ==} @@ -5715,9 +4976,6 @@ packages: promptly@2.2.0: resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protodef-validator@1.4.0: resolution: {integrity: sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==} hasBin: true @@ -5759,9 +5017,6 @@ packages: peerDependencies: react: ^19.2.1 - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -5800,10 +5055,6 @@ packages: resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} engines: {node: '>=0.8'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5827,26 +5078,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -5862,37 +5093,18 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} @@ -5909,20 +5121,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.49.0: - resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -5936,21 +5139,9 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} @@ -5982,10 +5173,6 @@ packages: resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} engines: {node: '>=12'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -6001,21 +5188,14 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -6034,22 +5214,6 @@ packages: shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - sift@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} @@ -6063,8 +5227,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} skia-canvas@3.0.8: @@ -6122,9 +5286,6 @@ packages: sprintf-js@1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -6139,15 +5300,11 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + streamx@2.26.0: + resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} string-split-by@1.0.0: resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==} @@ -6160,29 +5317,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -6194,36 +5328,29 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - strip-dirs@3.0.0: resolution: {integrity: sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ==} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -6237,9 +5364,9 @@ packages: babel-plugin-macros: optional: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -6252,35 +5379,31 @@ packages: swagger-ui-dist@5.21.0: resolution: {integrity: sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==} + system-architecture@1.0.0: + resolution: {integrity: sha512-0OJWD12D7XX3KUg1DYkMaTTjSTo2k/mhIYI3HlBlceXSMcJhW/1qO735fPKS5prcyjvn57Ub151vvASYXpQrEw==} + engines: {node: '>=18'} + systeminformation@5.27.8: resolution: {integrity: sha512-d3Z0gaQO1MlUxzDUKsmXz5y4TOBCMZ8IyijzaYOykV3AcNOTQ7mT+tpndUOXYNSxzLK3la8G32xiUFvZ0/s6PA==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@4.1.17: - resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -6288,6 +5411,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-discord@https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d: resolution: {tarball: https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d} version: 0.0.1 @@ -6295,26 +5422,20 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -6340,6 +5461,10 @@ packages: resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} engines: {node: '>=14.16'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -6357,47 +5482,14 @@ packages: peerDependencies: typescript: '>=4.8.4' - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.9.3: resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.6: - resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.5.6: - resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.5.6: - resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.5.6: - resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.5.6: - resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.5.6: - resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} - cpu: [arm64] - os: [win32] - - turbo@2.5.6: - resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} + turbo@2.9.16: + resolution: {integrity: sha512-NqgRQy6j6dPYcdSdv0q1g9QsZg7SWg87RERM8otw/1AtKU2yTFVClOM7cbwKzOonZr/Ek1blTBucw64L9H0Bwg==} hasBin: true tv4@1.3.0: @@ -6418,34 +5510,15 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typedi@0.10.0: resolution: {integrity: sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==} - typescript-eslint@8.41.0: - resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -6462,42 +5535,25 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unplugin@2.3.8: - resolution: {integrity: sha512-lkaSIlxceytPyt9yfb1h7L9jDFqwMqvUZeGsKB7Z8QrvAO3xZv2S+xMQQYzxk0AGJHcQhbcvhKEstrMy99jnuQ==} - engines: {node: '>=18.12.0'} - - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6522,25 +5578,18 @@ packages: '@types/react': optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid-1345@1.0.2: resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validator@13.15.15: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.0.4: resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6581,26 +5630,39 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -6613,8 +5675,8 @@ packages: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} engines: {node: '>=4.0'} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -6633,26 +5695,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6682,9 +5724,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -6697,23 +5736,11 @@ packages: utf-8-validate: optional: true - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@3.2.0: - resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} + yauzl@3.3.2: + resolution: {integrity: sha512-Md9ankxxN23wncAN8s7+Tn3Co52zLUPMtnrLAbVCnfG5d2tKBFfmygYSgXlqFgXObtzIgqkx7aNgDBpso9+4qA==} engines: {node: '>=12'} yggdrasil@1.7.0: @@ -6723,14 +5750,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + zod@4.1.5: resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} @@ -6738,11 +5765,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@azure/msal-common@14.16.0': {} '@azure/msal-node@2.16.2': @@ -6751,140 +5773,26 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.28.0': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.29.7 '@babel/runtime@7.27.6': {} - '@babel/types@7.28.1': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} '@borewit/text-codec@0.1.1': {} - '@commitlint/cli@19.8.1(@types/node@24.3.0)(typescript@5.9.2)': - dependencies: - '@commitlint/format': 19.8.1 - '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/read': 19.8.1 - '@commitlint/types': 19.8.1 - tinyexec: 1.0.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - - '@commitlint/config-conventional@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - conventional-changelog-conventionalcommits: 7.0.2 - - '@commitlint/config-validator@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - ajv: 8.17.1 - - '@commitlint/ensure@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - - '@commitlint/execute-rule@19.8.1': {} - - '@commitlint/format@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - chalk: 5.6.0 - - '@commitlint/is-ignored@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - semver: 7.7.2 - - '@commitlint/lint@19.8.1': - dependencies: - '@commitlint/is-ignored': 19.8.1 - '@commitlint/parse': 19.8.1 - '@commitlint/rules': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/load@19.8.1(@types/node@24.3.0)(typescript@5.9.2)': - dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/execute-rule': 19.8.1 - '@commitlint/resolve-extends': 19.8.1 - '@commitlint/types': 19.8.1 - chalk: 5.6.0 - cosmiconfig: 9.0.0(typescript@5.9.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - - '@commitlint/message@19.8.1': {} - - '@commitlint/parse@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - - '@commitlint/read@19.8.1': - dependencies: - '@commitlint/top-level': 19.8.1 - '@commitlint/types': 19.8.1 - git-raw-commits: 4.0.0 - minimist: 1.2.8 - tinyexec: 1.0.1 - - '@commitlint/resolve-extends@19.8.1': - dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/types': 19.8.1 - global-directory: 4.0.1 - import-meta-resolve: 4.1.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - - '@commitlint/rules@19.8.1': - dependencies: - '@commitlint/ensure': 19.8.1 - '@commitlint/message': 19.8.1 - '@commitlint/to-lines': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/to-lines@19.8.1': {} - - '@commitlint/top-level@19.8.1': - dependencies: - find-up: 7.0.0 - - '@commitlint/types@19.8.1': - dependencies: - '@types/conventional-commits-parser': 5.0.1 - chalk: 5.6.0 + '@borewit/text-codec@0.2.2': {} '@emnapi/core@1.5.0': dependencies: @@ -6892,11 +5800,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -6907,96 +5810,101 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.6': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.7.0))': + dependencies: + eslint: 9.34.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.34.0(jiti@2.7.0))': dependencies: - eslint: 9.34.0(jiti@2.6.1) + eslint: 9.34.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 - minimatch: 3.1.2 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -7006,23 +5914,23 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 - debug: 4.4.1 + ajv: 6.15.0 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 + js-yaml: 4.2.0 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color '@eslint/js@9.34.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.3.5': dependencies: @@ -7110,16 +6018,19 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/module-importer@1.0.1': {} + '@humanfs/types@0.15.0': {} - '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -7220,6 +6131,8 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@2.0.7': {} + '@inquirer/checkbox@2.5.0': dependencies: '@inquirer/core': 9.2.1 @@ -7228,47 +6141,45 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/checkbox@4.2.2(@types/node@24.3.0)': + '@inquirer/checkbox@5.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/confirm@3.2.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/confirm@5.1.16(@types/node@24.3.0)': + '@inquirer/confirm@6.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@inquirer/core@10.2.0(@types/node@24.3.0)': + '@inquirer/core@11.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/core@9.2.1': dependencies: '@inquirer/figures': 1.0.13 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.18.0 + '@types/node': 22.19.19 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -7284,13 +6195,13 @@ snapshots: '@inquirer/type': 1.5.5 external-editor: 3.1.0 - '@inquirer/editor@4.2.18(@types/node@24.3.0)': + '@inquirer/editor@5.2.2(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/external-editor': 1.0.1(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/external-editor': 3.0.3(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/expand@2.3.0': dependencies: @@ -7298,46 +6209,47 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/expand@4.0.18(@types/node@24.3.0)': + '@inquirer/expand@5.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@inquirer/external-editor@1.0.1(@types/node@24.3.0)': + '@inquirer/external-editor@3.0.3(@types/node@25.9.1)': dependencies: - chardet: 2.1.0 - iconv-lite: 0.6.3 + chardet: 2.1.1 + iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/figures@1.0.13': {} + '@inquirer/figures@2.0.7': {} + '@inquirer/input@2.3.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/input@4.2.2(@types/node@24.3.0)': + '@inquirer/input@5.1.2(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/number@1.1.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/number@3.0.18(@types/node@24.3.0)': + '@inquirer/number@4.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/password@2.2.0': dependencies: @@ -7345,13 +6257,13 @@ snapshots: '@inquirer/type': 1.5.5 ansi-escapes: 4.3.2 - '@inquirer/password@4.0.18(@types/node@24.3.0)': + '@inquirer/password@5.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/prompts@5.5.0': dependencies: @@ -7366,20 +6278,20 @@ snapshots: '@inquirer/search': 1.1.0 '@inquirer/select': 2.5.0 - '@inquirer/prompts@7.8.4(@types/node@24.3.0)': - dependencies: - '@inquirer/checkbox': 4.2.2(@types/node@24.3.0) - '@inquirer/confirm': 5.1.16(@types/node@24.3.0) - '@inquirer/editor': 4.2.18(@types/node@24.3.0) - '@inquirer/expand': 4.0.18(@types/node@24.3.0) - '@inquirer/input': 4.2.2(@types/node@24.3.0) - '@inquirer/number': 3.0.18(@types/node@24.3.0) - '@inquirer/password': 4.0.18(@types/node@24.3.0) - '@inquirer/rawlist': 4.1.6(@types/node@24.3.0) - '@inquirer/search': 3.1.1(@types/node@24.3.0) - '@inquirer/select': 4.3.2(@types/node@24.3.0) + '@inquirer/prompts@8.5.2(@types/node@25.9.1)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@25.9.1) + '@inquirer/confirm': 6.1.1(@types/node@25.9.1) + '@inquirer/editor': 5.2.2(@types/node@25.9.1) + '@inquirer/expand': 5.1.1(@types/node@25.9.1) + '@inquirer/input': 5.1.2(@types/node@25.9.1) + '@inquirer/number': 4.1.1(@types/node@25.9.1) + '@inquirer/password': 5.1.1(@types/node@25.9.1) + '@inquirer/rawlist': 5.3.1(@types/node@25.9.1) + '@inquirer/search': 4.2.1(@types/node@25.9.1) + '@inquirer/select': 5.2.1(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/rawlist@2.3.0': dependencies: @@ -7387,13 +6299,12 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/rawlist@4.1.6(@types/node@24.3.0)': + '@inquirer/rawlist@5.3.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/search@1.1.0': dependencies: @@ -7402,14 +6313,13 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/search@3.1.1(@types/node@24.3.0)': + '@inquirer/search@4.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/select@2.5.0': dependencies: @@ -7419,15 +6329,14 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/select@4.3.2(@types/node@24.3.0)': + '@inquirer/select@5.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/type@1.5.5': dependencies: @@ -7437,9 +6346,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.8(@types/node@24.3.0)': + '@inquirer/type@4.0.7(@types/node@25.9.1)': optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@ioredis/commands@1.3.1': {} @@ -7458,21 +6367,14 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/schema@0.1.3': {} - - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.37.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.37.0(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -7481,24 +6383,24 @@ snapshots: '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@keyv/serialize@1.1.1': {} + '@lukeed/csprng@1.1.0': {} '@lukeed/ms@2.0.2': {} @@ -7517,23 +6419,24 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 - '@napi-rs/cli@3.1.5(@emnapi/runtime@1.7.1)(@types/node@24.3.0)': + '@napi-rs/cli@3.7.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)(@types/node@25.9.1)': dependencies: - '@inquirer/prompts': 7.8.4(@types/node@24.3.0) - '@napi-rs/cross-toolchain': 1.0.3 - '@napi-rs/wasm-tools': 1.0.1 - '@octokit/rest': 22.0.0 + '@inquirer/prompts': 8.5.2(@types/node@25.9.1) + '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@octokit/rest': 22.0.1 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - debug: 4.4.1 - es-toolkit: 1.39.10 - find-up: 7.0.0 - js-yaml: 4.1.0 - semver: 7.7.2 + emnapi: 1.10.0 + es-toolkit: 1.47.0 + js-yaml: 4.1.1 + obug: 2.1.1 + semver: 7.8.1 typanion: 3.14.0 optionalDependencies: '@emnapi/runtime': 1.7.1 transitivePeerDependencies: + - '@emnapi/core' - '@napi-rs/cross-toolchain-arm64-target-aarch64' - '@napi-rs/cross-toolchain-arm64-target-armv7' - '@napi-rs/cross-toolchain-arm64-target-ppc64le' @@ -7545,14 +6448,17 @@ snapshots: - '@napi-rs/cross-toolchain-x64-target-s390x' - '@napi-rs/cross-toolchain-x64-target-x86_64' - '@types/node' + - node-addon-api - supports-color - '@napi-rs/cross-toolchain@1.0.3': + '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/lzma': 1.4.5 - '@napi-rs/tar': 1.1.0 - debug: 4.4.1 + '@napi-rs/lzma': 1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@napi-rs/tar': 1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + debug: 4.4.3 transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - supports-color '@napi-rs/lzma-android-arm-eabi@1.4.5': @@ -7594,9 +6500,12 @@ snapshots: '@napi-rs/lzma-linux-x64-musl@1.4.5': optional: true - '@napi-rs/lzma-wasm32-wasi@1.4.5': + '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/lzma-win32-arm64-msvc@1.4.5': @@ -7608,7 +6517,7 @@ snapshots: '@napi-rs/lzma-win32-x64-msvc@1.4.5': optional: true - '@napi-rs/lzma@1.4.5': + '@napi-rs/lzma@1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/lzma-android-arm-eabi': 1.4.5 '@napi-rs/lzma-android-arm64': 1.4.5 @@ -7623,10 +6532,13 @@ snapshots: '@napi-rs/lzma-linux-s390x-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-musl': 1.4.5 - '@napi-rs/lzma-wasm32-wasi': 1.4.5 + '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/lzma-win32-arm64-msvc': 1.4.5 '@napi-rs/lzma-win32-ia32-msvc': 1.4.5 '@napi-rs/lzma-win32-x64-msvc': 1.4.5 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -7736,9 +6648,12 @@ snapshots: '@napi-rs/tar-linux-x64-musl@1.1.0': optional: true - '@napi-rs/tar-wasm32-wasi@1.1.0': + '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/tar-win32-arm64-msvc@1.1.0': @@ -7750,7 +6665,7 @@ snapshots: '@napi-rs/tar-win32-x64-msvc@1.1.0': optional: true - '@napi-rs/tar@1.1.0': + '@napi-rs/tar@1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/tar-android-arm-eabi': 1.1.0 '@napi-rs/tar-android-arm64': 1.1.0 @@ -7764,23 +6679,19 @@ snapshots: '@napi-rs/tar-linux-s390x-gnu': 1.1.0 '@napi-rs/tar-linux-x64-gnu': 1.1.0 '@napi-rs/tar-linux-x64-musl': 1.1.0 - '@napi-rs/tar-wasm32-wasi': 1.1.0 + '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/tar-win32-arm64-msvc': 1.1.0 '@napi-rs/tar-win32-ia32-msvc': 1.1.0 '@napi-rs/tar-win32-x64-msvc': 1.1.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 - optional: true - - '@napi-rs/wasm-runtime@1.0.3': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.2 optional: true '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': @@ -7810,9 +6721,12 @@ snapshots: '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-wasm32-wasi@1.0.1': + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1': @@ -7824,7 +6738,7 @@ snapshots: '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools@1.0.1': + '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/wasm-tools-android-arm-eabi': 1.0.1 '@napi-rs/wasm-tools-android-arm64': 1.0.1 @@ -7835,10 +6749,13 @@ snapshots: '@napi-rs/wasm-tools-linux-arm64-musl': 1.0.1 '@napi-rs/wasm-tools-linux-x64-gnu': 1.0.1 '@napi-rs/wasm-tools-linux-x64-musl': 1.0.1 - '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1 + '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/wasm-tools-win32-arm64-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-ia32-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-x64-msvc': 1.0.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' '@nestjs/axios@4.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2)': dependencies: @@ -7913,7 +6830,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/testing@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2))': + '@nestjs/testing@11.1.24(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2))': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -7921,10 +6838,6 @@ snapshots: '@next/env@16.0.7': {} - '@next/eslint-plugin-next@15.5.2': - dependencies: - fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.7': optional: true @@ -7961,75 +6874,185 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nolyfill/is-core-module@1.0.39': {} - '@nuxt/opencollective@0.4.1': dependencies: consola: 3.4.2 '@octokit/auth-token@6.0.0': {} - '@octokit/core@7.0.3': + '@octokit/core@7.0.6': dependencies: '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.1 - '@octokit/request': 10.0.3 - '@octokit/request-error': 7.0.0 - '@octokit/types': 14.1.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.10 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.0': + '@octokit/endpoint@11.0.3': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/graphql@9.0.1': + '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 10.0.3 - '@octokit/types': 14.1.0 + '@octokit/request': 10.0.10 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/openapi-types@25.1.0': {} + '@octokit/openapi-types@27.0.0': {} - '@octokit/plugin-paginate-rest@13.1.1(@octokit/core@7.0.3)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 - '@octokit/types': 14.1.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.3)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 + '@octokit/core': 7.0.6 - '@octokit/plugin-rest-endpoint-methods@16.0.0(@octokit/core@7.0.3)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 - '@octokit/types': 14.1.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/request-error@7.0.0': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 - '@octokit/request@10.0.3': + '@octokit/request@10.0.10': dependencies: - '@octokit/endpoint': 11.0.0 - '@octokit/request-error': 7.0.0 - '@octokit/types': 14.1.0 - fast-content-type-parse: 3.0.0 + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + content-type: 2.0.0 + json-with-bigint: 3.5.8 universal-user-agent: 7.0.3 - '@octokit/rest@22.0.0': + '@octokit/rest@22.0.1': dependencies: - '@octokit/core': 7.0.3 - '@octokit/plugin-paginate-rest': 13.1.1(@octokit/core@7.0.3) - '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.3) - '@octokit/plugin-rest-endpoint-methods': 16.0.0(@octokit/core@7.0.3) + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/types@14.1.0': + '@octokit/types@16.0.0': dependencies: - '@octokit/openapi-types': 25.1.0 + '@octokit/openapi-types': 27.0.0 + + '@oxfmt/binding-android-arm-eabi@0.53.0': + optional: true + + '@oxfmt/binding-android-arm64@0.53.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.53.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.53.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.53.0': + optional: true - '@pkgjs/parseargs@0.11.0': + '@oxfmt/binding-linux-arm64-musl@0.53.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.53.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.53.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.53.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.53.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.53.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.53.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.68.0': + optional: true + + '@oxlint/binding-android-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-x64@1.68.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.68.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.68.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.68.0': optional: true '@pm2/agent@2.1.1': @@ -8078,7 +7101,7 @@ snapshots: '@pm2/pm2-version-check@1.0.4': dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8086,331 +7109,284 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.16)(react@19.2.1) aria-hidden: 1.2.6 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.16)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.16)(react@19.2.1) '@radix-ui/rect': 1.1.1 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 '@radix-ui/rect@1.1.1': {} - '@rollup/pluginutils@5.2.0(rollup@4.49.0)': + '@rollup/pluginutils@5.4.0(rollup@4.61.0)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: - rollup: 4.49.0 - - '@rollup/rollup-android-arm-eabi@4.45.1': - optional: true + rollup: 4.61.0 - '@rollup/rollup-android-arm-eabi@4.49.0': + '@rollup/rollup-android-arm-eabi@4.61.0': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.61.0': optional: true - '@rollup/rollup-android-arm64@4.49.0': + '@rollup/rollup-darwin-arm64@4.61.0': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-x64@4.61.0': optional: true - '@rollup/rollup-darwin-arm64@4.49.0': + '@rollup/rollup-freebsd-arm64@4.61.0': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.61.0': optional: true - '@rollup/rollup-darwin-x64@4.49.0': + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.61.0': optional: true - '@rollup/rollup-freebsd-arm64@4.49.0': + '@rollup/rollup-linux-arm64-gnu@4.61.0': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.61.0': optional: true - '@rollup/rollup-freebsd-x64@4.49.0': + '@rollup/rollup-linux-loong64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-loong64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': + '@rollup/rollup-linux-ppc64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-ppc64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.49.0': + '@rollup/rollup-linux-riscv64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.49.0': + '@rollup/rollup-linux-s390x-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.49.0': + '@rollup/rollup-linux-x64-musl@4.61.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-openbsd-x64@4.61.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': + '@rollup/rollup-openharmony-arm64@4.61.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.61.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.49.0': + '@rollup/rollup-win32-ia32-msvc@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-win32-x64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.49.0': + '@rollup/rollup-win32-x64-msvc@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': - optional: true + '@scarf/scarf@1.4.0': {} - '@rollup/rollup-linux-riscv64-musl@4.49.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.45.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.49.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.45.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.49.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.45.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.49.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.49.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.49.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.49.0': - optional: true - - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.12.0': {} - - '@scarf/scarf@1.4.0': {} + '@sec-ant/readable-stream@0.4.1': {} '@sentry-internal/tracing@7.120.4': dependencies: @@ -8444,79 +7420,83 @@ snapshots: dependencies: '@sentry/types': 7.120.4 - '@sindresorhus/is@5.6.0': {} + '@sindresorhus/is@7.2.0': {} - '@stylistic/eslint-plugin@5.2.3(eslint@9.34.0(jiti@2.6.1))': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@typescript-eslint/types': 8.41.0 - eslint: 9.34.0(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 + '@sindresorhus/merge-streams@4.0.0': {} + + '@standard-schema/spec@1.1.0': {} - '@swc/cli@0.7.8(@swc/core@1.13.5(@swc/helpers@0.5.17))': + '@swc/cli@0.8.1(@swc/core@1.15.40(@swc/helpers@0.5.23))': dependencies: - '@swc/core': 1.13.5(@swc/helpers@0.5.17) + '@swc/core': 1.15.40(@swc/helpers@0.5.23) '@swc/counter': 0.1.3 - '@xhmikosr/bin-wrapper': 13.2.0 + '@xhmikosr/bin-wrapper': 14.2.5 commander: 8.3.0 - minimatch: 9.0.5 + minimatch: 9.0.9 piscina: 4.9.2 - semver: 7.7.2 + semver: 7.8.1 slash: 3.0.0 source-map: 0.7.6 - tinyglobby: 0.2.14 + tinyglobby: 0.2.17 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@swc/core-darwin-arm64@1.13.5': + '@swc/core-darwin-arm64@1.15.40': + optional: true + + '@swc/core-darwin-x64@1.15.40': optional: true - '@swc/core-darwin-x64@1.13.5': + '@swc/core-linux-arm-gnueabihf@1.15.40': optional: true - '@swc/core-linux-arm-gnueabihf@1.13.5': + '@swc/core-linux-arm64-gnu@1.15.40': optional: true - '@swc/core-linux-arm64-gnu@1.13.5': + '@swc/core-linux-arm64-musl@1.15.40': optional: true - '@swc/core-linux-arm64-musl@1.13.5': + '@swc/core-linux-ppc64-gnu@1.15.40': optional: true - '@swc/core-linux-x64-gnu@1.13.5': + '@swc/core-linux-s390x-gnu@1.15.40': optional: true - '@swc/core-linux-x64-musl@1.13.5': + '@swc/core-linux-x64-gnu@1.15.40': optional: true - '@swc/core-win32-arm64-msvc@1.13.5': + '@swc/core-linux-x64-musl@1.15.40': optional: true - '@swc/core-win32-ia32-msvc@1.13.5': + '@swc/core-win32-arm64-msvc@1.15.40': optional: true - '@swc/core-win32-x64-msvc@1.13.5': + '@swc/core-win32-ia32-msvc@1.15.40': optional: true - '@swc/core@1.13.5(@swc/helpers@0.5.17)': + '@swc/core-win32-x64-msvc@1.15.40': + optional: true + + '@swc/core@1.15.40(@swc/helpers@0.5.23)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.24 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.13.5 - '@swc/core-darwin-x64': 1.13.5 - '@swc/core-linux-arm-gnueabihf': 1.13.5 - '@swc/core-linux-arm64-gnu': 1.13.5 - '@swc/core-linux-arm64-musl': 1.13.5 - '@swc/core-linux-x64-gnu': 1.13.5 - '@swc/core-linux-x64-musl': 1.13.5 - '@swc/core-win32-arm64-msvc': 1.13.5 - '@swc/core-win32-ia32-msvc': 1.13.5 - '@swc/core-win32-x64-msvc': 1.13.5 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.15.40 + '@swc/core-darwin-x64': 1.15.40 + '@swc/core-linux-arm-gnueabihf': 1.15.40 + '@swc/core-linux-arm64-gnu': 1.15.40 + '@swc/core-linux-arm64-musl': 1.15.40 + '@swc/core-linux-ppc64-gnu': 1.15.40 + '@swc/core-linux-s390x-gnu': 1.15.40 + '@swc/core-linux-x64-gnu': 1.15.40 + '@swc/core-linux-x64-musl': 1.15.40 + '@swc/core-win32-arm64-msvc': 1.15.40 + '@swc/core-win32-ia32-msvc': 1.15.40 + '@swc/core-win32-x64-msvc': 1.15.40 + '@swc/helpers': 0.5.23 '@swc/counter@0.1.3': {} @@ -8524,86 +7504,82 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 - '@swc/types@0.1.24': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@tailwindcss/node@4.1.17': + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + enhanced-resolve: 5.22.1 + jiti: 2.7.0 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.17 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.1.17': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.17': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.17': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.17': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.17': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.17': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.1.17': + '@tailwindcss/oxide@4.3.0': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.17 - '@tailwindcss/oxide-darwin-arm64': 4.1.17 - '@tailwindcss/oxide-darwin-x64': 4.1.17 - '@tailwindcss/oxide-freebsd-x64': 4.1.17 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 - '@tailwindcss/oxide-linux-x64-musl': 4.1.17 - '@tailwindcss/oxide-wasm32-wasi': 4.1.17 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - - '@tailwindcss/postcss@4.1.17': + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/postcss@4.3.0': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.17 - '@tailwindcss/oxide': 4.1.17 - postcss: 8.5.6 - tailwindcss: 4.1.17 + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + postcss: 8.5.15 + tailwindcss: 4.3.0 '@tanstack/query-core@5.90.12': {} @@ -8614,17 +7590,42 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.1 + debug: 4.4.3 fflate: 0.8.2 token-types: 6.1.1 transitivePeerDependencies: - supports-color + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + '@tokenizer/token@0.3.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tybys/wasm-util@0.10.0': + '@turbo/darwin-64@2.9.16': + optional: true + + '@turbo/darwin-arm64@2.9.16': + optional: true + + '@turbo/linux-64@2.9.16': + optional: true + + '@turbo/linux-arm64@2.9.16': + optional: true + + '@turbo/windows-64@2.9.16': + optional: true + + '@turbo/windows-arm64@2.9.16': + optional: true + + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true @@ -8638,23 +7639,16 @@ snapshots: semver: 7.7.2 tslib: 2.8.1 - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 - - '@types/conventional-commits-parser@5.0.1': - dependencies: - '@types/node': 24.3.0 + assertion-error: 2.0.1 '@types/deep-eql@4.0.2': {} - '@types/eslint__js@9.14.0': - dependencies: - '@eslint/js': 9.34.0 - - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.2.0': {} '@types/i18next-fs-backend@1.2.0': dependencies: @@ -8667,41 +7661,39 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/luxon@3.7.1': {} '@types/mute-stream@0.0.4': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/node-rsa@1.1.4': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@types/node@22.18.0': + '@types/node@22.19.19': dependencies: undici-types: 6.21.0 - '@types/node@24.3.0': + '@types/node@25.9.1': dependencies: - undici-types: 7.10.0 + undici-types: 7.24.6 - '@types/react-dom@19.2.3(@types/react@19.2.7)': + '@types/react-dom@19.2.3(@types/react@19.2.16)': dependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@types/react@19.2.7': + '@types/react@19.2.16': dependencies: csstype: 3.2.3 '@types/readable-stream@4.0.21': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/through@0.0.33': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/validator@13.15.2': {} @@ -8713,50 +7705,12 @@ snapshots: '@types/wrap-ansi@3.0.0': {} - '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - eslint: 9.34.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.37.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@6.0.3) '@typescript-eslint/types': 8.37.0 - debug: 4.4.1 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - debug: 4.4.1 - typescript: 5.9.2 + debug: 4.4.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8765,86 +7719,36 @@ snapshots: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/scope-manager@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + typescript: 6.0.3 '@typescript-eslint/types@8.37.0': {} - '@typescript-eslint/types@8.41.0': {} - - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.37.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@6.0.3) '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - debug: 4.4.1 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': + '@typescript-eslint/utils@8.37.0(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.37.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@6.0.3) + eslint: 9.34.0(jiti@2.7.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8853,69 +7757,36 @@ snapshots: '@typescript-eslint/types': 8.37.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - eslint-visitor-keys: 4.2.1 - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true + '@typescript/native-preview@7.0.0-dev.20260601.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260601.1 '@vercel/analytics@1.6.1(next@16.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: @@ -8927,77 +7798,71 @@ snapshots: next: 16.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1 + '@vitest/utils': 4.1.8 + ast-v8-to-istanbul: 1.0.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - supports-color + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.1 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) - '@vitest/expect@3.2.4': + '@vitest/expect@4.1.8': dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitest/mocker@4.1.8(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.1.8': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.4': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.1.8': {} - '@vitest/ui@3.2.4(vitest@3.2.4)': + '@vitest/ui@4.1.8(vitest@4.1.8)': dependencies: - '@vitest/utils': 3.2.4 - fflate: 0.8.2 - flatted: 3.3.3 + '@vitest/utils': 4.1.8 + fflate: 0.8.3 + flatted: 3.4.2 pathe: 2.0.3 - sirv: 3.0.1 - tinyglobby: 0.2.14 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) + sirv: 3.0.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) - '@vitest/utils@3.2.4': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@xboxreplay/errors@0.1.0': {} @@ -9008,93 +7873,99 @@ snapshots: transitivePeerDependencies: - debug - '@xhmikosr/archive-type@7.1.0': + '@xhmikosr/archive-type@8.0.1': dependencies: - file-type: 20.5.0 + file-type: 21.3.4 transitivePeerDependencies: - supports-color - '@xhmikosr/bin-check@7.1.0': + '@xhmikosr/bin-check@8.2.1': dependencies: - execa: 5.1.1 - isexe: 2.0.0 + execa: 9.6.1 + isexe: 4.0.0 - '@xhmikosr/bin-wrapper@13.2.0': + '@xhmikosr/bin-wrapper@14.2.5': dependencies: - '@xhmikosr/bin-check': 7.1.0 - '@xhmikosr/downloader': 15.2.0 - '@xhmikosr/os-filter-obj': 3.0.0 - bin-version-check: 5.1.0 + '@xhmikosr/bin-check': 8.2.1 + '@xhmikosr/downloader': 16.1.3 + '@xhmikosr/os-filter-obj': 4.1.0 + binary-version-check: 6.1.0 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-tar@8.1.0': + '@xhmikosr/decompress-tar@9.0.1': dependencies: - file-type: 20.5.0 - is-stream: 2.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 tar-stream: 3.1.7 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-tarbz2@8.1.0': + '@xhmikosr/decompress-tarbz2@9.0.1': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - file-type: 20.5.0 - is-stream: 2.0.1 + '@xhmikosr/decompress-tar': 9.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 seek-bzip: 2.0.0 unbzip2-stream: 1.4.3 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-targz@8.1.0': + '@xhmikosr/decompress-targz@9.0.1': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - file-type: 20.5.0 - is-stream: 2.0.1 + '@xhmikosr/decompress-tar': 9.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-unzip@7.1.0': + '@xhmikosr/decompress-unzip@8.1.1': dependencies: - file-type: 20.5.0 - get-stream: 6.0.1 - yauzl: 3.2.0 + file-type: 21.3.4 + get-stream: 9.0.1 + yauzl: 3.3.2 transitivePeerDependencies: - supports-color - '@xhmikosr/decompress@10.2.0': + '@xhmikosr/decompress@11.1.3': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - '@xhmikosr/decompress-tarbz2': 8.1.0 - '@xhmikosr/decompress-targz': 8.1.0 - '@xhmikosr/decompress-unzip': 7.1.0 + '@xhmikosr/decompress-tar': 9.0.1 + '@xhmikosr/decompress-tarbz2': 9.0.1 + '@xhmikosr/decompress-targz': 9.0.1 + '@xhmikosr/decompress-unzip': 8.1.1 graceful-fs: 4.2.11 strip-dirs: 3.0.0 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/downloader@15.2.0': + '@xhmikosr/downloader@16.1.3': dependencies: - '@xhmikosr/archive-type': 7.1.0 - '@xhmikosr/decompress': 10.2.0 - content-disposition: 0.5.4 - defaults: 2.0.2 + '@xhmikosr/archive-type': 8.0.1 + '@xhmikosr/decompress': 11.1.3 + content-disposition: 2.0.1 ext-name: 5.0.0 - file-type: 20.5.0 - filenamify: 6.0.0 - get-stream: 6.0.1 - got: 13.0.0 + file-type: 21.3.4 + filenamify: 7.0.1 + get-stream: 9.0.1 + got: 14.6.6 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/os-filter-obj@3.0.0': - dependencies: - arch: 3.0.0 - - JSONStream@1.3.5: + '@xhmikosr/os-filter-obj@4.1.0': dependencies: - jsonparse: 1.3.1 - through: 2.3.8 + system-architecture: 1.0.0 abort-controller@3.0.0: dependencies: @@ -9102,11 +7973,11 @@ snapshots: abstract-logging@2.0.1: {} - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} aes-js@3.1.2: {} @@ -9123,6 +7994,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -9146,10 +8024,6 @@ snapshots: ansi-regex@6.2.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -9161,9 +8035,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 - - arch@3.0.0: {} + picomatch: 2.3.2 argparse@2.0.1: {} @@ -9171,94 +8043,19 @@ snapshots: dependencies: tslib: 2.8.1 - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-ify@1.0.0: {} - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - asn1@0.2.3: {} assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.13.4: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@1.0.3: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 - js-tokens: 9.0.1 - - async-function@1.0.0: {} + js-tokens: 10.0.0 async@2.6.4: dependencies: @@ -9268,21 +8065,13 @@ snapshots: asynckit@0.4.0: {} - at-least-node@1.0.0: {} - atomic-sleep@1.0.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - avvio@9.1.0: dependencies: '@fastify/error': 4.2.0 fastq: 1.19.1 - axe-core@4.10.3: {} - axios@0.21.4(debug@4.4.1): dependencies: follow-redirects: 1.15.11(debug@4.4.1) @@ -9291,20 +8080,17 @@ snapshots: axios@1.11.0: dependencies: - follow-redirects: 1.15.11(debug@4.4.1) + follow-redirects: 1.15.11 form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axobject-query@4.1.0: {} - - b4a@1.6.7: {} + b4a@1.8.1: {} balanced-match@1.0.2: {} - bare-events@2.6.1: - optional: true + bare-events@2.8.3: {} base64-js@1.5.1: {} @@ -9312,30 +8098,24 @@ snapshots: before-after-hook@4.0.0: {} - bin-version-check@5.1.0: - dependencies: - bin-version: 6.0.0 - semver: 7.7.2 - semver-truncate: 3.0.0 + binary-extensions@2.3.0: {} - bin-version@6.0.0: + binary-version-check@6.1.0: dependencies: - execa: 5.1.1 - find-versions: 5.1.0 - - binary-extensions@2.3.0: {} + binary-version: 7.1.0 + semver: 7.8.1 + semver-truncate: 3.0.0 - bl@4.1.0: + binary-version@7.1.0: dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + execa: 8.0.1 + find-versions: 6.0.0 blessed@0.1.81: {} bodec@0.1.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -9344,21 +8124,16 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.3: + brace-expansion@2.1.1: dependencies: - fill-range: 7.1.1 + balanced-match: 1.0.2 - browserslist@4.25.3: + braces@3.0.3: dependencies: - caniuse-lite: 1.0.30001737 - electron-to-chromium: 1.5.209 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.3) + fill-range: 7.1.1 bson@6.10.4: {} - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} buffer-equal@1.0.1: {} @@ -9375,60 +8150,30 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@5.0.0: {} - - cac@6.7.14: {} + byte-counter@0.1.0: {} cacheable-lookup@7.0.0: {} - cacheable-request@10.2.14: + cacheable-request@13.0.19: dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 + '@types/http-cache-semantics': 4.2.0 + get-stream: 9.0.1 http-cache-semantics: 4.2.0 - keyv: 4.5.4 + keyv: 5.6.0 mimic-response: 4.0.0 - normalize-url: 8.0.2 - responselike: 3.0.0 - - cachedir@2.3.0: {} + normalize-url: 8.1.1 + responselike: 4.0.2 call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} - caniuse-lite@1.0.30001737: {} - caniuse-lite@1.0.30001759: {} - chai@5.2.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + chai@6.2.2: {} chalk@3.0.0: dependencies: @@ -9442,16 +8187,12 @@ snapshots: chalk@5.6.0: {} - change-case@5.4.4: {} - chardet@0.7.0: {} - chardet@2.1.0: {} + chardet@2.1.1: {} charm@0.1.2: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -9464,8 +8205,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - ci-info@4.3.0: {} - class-transformer@0.5.1: {} class-validator@0.14.2: @@ -9474,22 +8213,10 @@ snapshots: libphonenumber-js: 1.12.10 validator: 13.15.15 - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - cli-tableau@2.0.1: dependencies: chalk: 3.0.0 - cli-width@3.0.0: {} - cli-width@4.1.0: {} client-only@0.0.1: {} @@ -9498,26 +8225,12 @@ snapshots: dependencies: typanion: 3.14.0 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} - cluster-key-slot@1.1.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} colorette@2.0.20: {} @@ -9534,31 +8247,6 @@ snapshots: commander@8.3.0: {} - commitizen@4.3.1(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - '@types/node' - - typescript - - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - concat-map@0.0.1: {} consola@3.4.2: {} @@ -9567,45 +8255,16 @@ snapshots: dependencies: safe-buffer: 5.2.1 - conventional-changelog-angular@7.0.0: - dependencies: - compare-func: 2.0.0 + content-disposition@2.0.1: {} - conventional-changelog-conventionalcommits@7.0.2: - dependencies: - compare-func: 2.0.0 + content-type@2.0.0: {} - conventional-commit-types@3.0.0: {} + convert-hrtime@5.0.0: {} - conventional-commits-parser@5.0.0: - dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 + convert-source-map@2.0.0: {} cookie@1.0.2: {} - core-js-compat@3.45.1: - dependencies: - browserslist: 4.25.3 - - cosmiconfig-typescript-loader@6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@types/node': 24.3.0 - cosmiconfig: 9.0.0(typescript@5.9.2) - jiti: 2.5.1 - typescript: 5.9.2 - - cosmiconfig@9.0.0(typescript@5.9.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.2 - croner@4.1.97: {} croner@8.1.2: {} @@ -9620,44 +8279,8 @@ snapshots: culvert@0.1.2: {} - cz-conventional-changelog@3.3.0(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - chalk: 2.4.2 - commitizen: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - conventional-commit-types: 3.0.0 - lodash.map: 4.6.0 - longest: 2.0.1 - word-wrap: 1.2.5 - optionalDependencies: - '@commitlint/load': 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - transitivePeerDependencies: - - '@types/node' - - typescript - - damerau-levenshtein@1.0.8: {} - - dargs@8.1.0: {} - data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - date-fns@4.1.0: {} dayjs@1.11.15: {} @@ -9676,35 +8299,15 @@ snapshots: dependencies: ms: 2.1.3 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@0.7.0: {} - - deep-eql@5.0.2: {} - - deep-is@0.1.4: {} - - defaults@1.0.4: + debug@4.4.3: dependencies: - clone: 1.0.4 - - defaults@2.0.2: {} - - defer-to-connect@2.0.1: {} + ms: 2.1.3 - define-data-property@1.1.4: + decompress-response@10.0.0: dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 + mimic-response: 4.0.0 - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + deep-is@0.1.4: {} degenerator@5.0.1: dependencies: @@ -9720,10 +8323,6 @@ snapshots: dequal@2.0.3: {} - detect-file@1.0.0: {} - - detect-indent@6.1.0: {} - detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -9732,14 +8331,6 @@ snapshots: discord-api-types@0.38.22: {} - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9752,7 +8343,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.209: {} + emnapi@1.10.0: {} emoji-regex@8.0.0: {} @@ -9760,330 +8351,79 @@ snapshots: endian-toggle@0.0.0: {} - enhanced-resolve@5.18.3: + enhanced-resolve@5.22.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - env-paths@2.2.1: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - es-toolkit@1.39.10: {} - - esbuild@0.25.6: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-next@15.5.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): - dependencies: - '@next/eslint-plugin-next': 15.5.2 - '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.34.0(jiti@2.6.1)) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.14 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color + dependencies: + es-errors: 1.3.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.34.0(jiti@2.6.1)): + es-set-tostringtag@2.1.0: dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 9.34.0(jiti@2.6.1) + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - eslint-plugin-license-header@0.8.0: - dependencies: - requireindex: 1.2.0 + es-toolkit@1.47.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.6.1)): - dependencies: - eslint: 9.34.0(jiti@2.6.1) + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} - eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.6.1)): + escodegen@2.1.0: dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.34.0(jiti@2.6.1) + esprima: 4.0.1 estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-plugin-unicorn@60.0.0(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@eslint/plugin-kit': 0.3.5 - change-case: 5.4.4 - ci-info: 4.3.0 - clean-regexp: 1.0.0 - core-js-compat: 3.45.1 - eslint: 9.34.0(jiti@2.6.1) - esquery: 1.6.0 - find-up-simple: 1.0.1 - globals: 16.3.0 - indent-string: 5.0.0 - is-builtin-module: 5.0.0 - jsesc: 3.1.0 - pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.12.0 - semver: 7.7.2 - strip-indent: 4.0.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)): + eslint-plugin-license-header@0.9.0(eslint@9.34.0(jiti@2.7.0)): dependencies: - eslint: 9.34.0(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.7.0) + requireindex: 1.2.0 eslint-scope@8.4.0: dependencies: @@ -10094,30 +8434,30 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.34.0(jiti@2.6.1): + eslint@9.34.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.34.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 + '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 - ajv: 6.12.6 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -10128,23 +8468,23 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -10158,7 +8498,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -10168,25 +8508,42 @@ snapshots: eventemitter2@6.4.9: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.3 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} - execa@5.1.1: + execa@8.0.1: dependencies: cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - expand-tilde@2.0.2: + execa@9.6.1: dependencies: - homedir-polyfill: 1.0.3 + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 - expect-type@1.2.2: {} + expect-type@1.3.0: {} ext-list@2.2.2: dependencies: @@ -10209,22 +8566,12 @@ snapshots: transitivePeerDependencies: - debug - fast-content-type-parse@3.0.0: {} - fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10256,8 +8603,18 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fastify-plugin@5.0.1: {} fastify@5.4.0: @@ -10302,21 +8659,23 @@ snapshots: fclone@1.0.11: {} - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fflate@0.8.2: {} - figures@3.2.0: + fflate@0.8.3: {} + + figures@6.1.0: dependencies: - escape-string-regexp: 1.0.5 + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - file-type@20.5.0: + file-type@21.0.0: dependencies: '@tokenizer/inflate': 0.2.7 strtok3: 10.3.4 @@ -10325,20 +8684,20 @@ snapshots: transitivePeerDependencies: - supports-color - file-type@21.0.0: + file-type@21.3.4: dependencies: - '@tokenizer/inflate': 0.2.7 - strtok3: 10.3.4 - token-types: 6.1.1 + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color - filename-reserved-regex@3.0.0: {} + filename-reserved-regex@4.0.0: {} - filenamify@6.0.0: + filenamify@7.0.1: dependencies: - filename-reserved-regex: 3.0.0 + filename-reserved-regex: 4.0.0 fill-range@7.1.1: dependencies: @@ -10350,43 +8709,24 @@ snapshots: fast-querystring: 1.1.2 safe-regex2: 5.0.0 - find-node-modules@2.1.3: - dependencies: - findup-sync: 4.0.0 - merge: 2.1.1 - - find-root@1.1.0: {} - - find-up-simple@1.0.1: {} - find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - - find-versions@5.1.0: + find-versions@6.0.0: dependencies: semver-regex: 4.0.5 - - findup-sync@4.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 + super-regex: 1.1.0 flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.2: {} + + follow-redirects@1.15.11: {} follow-redirects@1.15.11(debug@4.3.7): optionalDependencies: @@ -10396,16 +8736,12 @@ snapshots: optionalDependencies: debug: 4.4.1 - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data-encoder@2.1.4: {} + form-data-encoder@4.1.0: {} form-data@4.0.4: dependencies: @@ -10424,35 +8760,15 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} + function-timeout@1.0.2: {} fuse.js@7.1.0: {} - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10473,23 +8789,18 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-stream@8.0.1: {} - get-tsconfig@4.10.1: + get-stream@9.0.1: dependencies: - resolve-pkg-maps: 1.0.0 + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 get-uri@6.0.5: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10497,12 +8808,6 @@ snapshots: optionalDependencies: js-git: 0.7.8 - git-raw-commits@4.0.0: - dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 - git-sha1@0.1.2: {} glob-parent@5.1.2: @@ -10513,15 +8818,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@11.0.3: dependencies: foreground-child: 3.3.1 @@ -10531,62 +8827,27 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-directory@4.0.1: - dependencies: - ini: 4.1.1 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - globals@14.0.0: {} - globals@16.3.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - gopd@1.2.0: {} - got@13.0.0: + got@14.6.6: dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 + '@sindresorhus/is': 7.2.0 + byte-counter: 0.1.0 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 + cacheable-request: 13.0.19 + decompress-response: 10.0.0 + form-data-encoder: 4.1.0 http2-wrapper: 2.2.1 + keyv: 5.6.0 lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 + p-cancelable: 4.0.1 + responselike: 4.0.2 + type-fest: 4.41.0 graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -10596,20 +8857,8 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - has-bigints@1.1.0: {} - - has-flag@3.0.0: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -10620,10 +8869,6 @@ snapshots: dependencies: function-bind: 1.1.2 - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - html-escaper@2.0.2: {} http-cache-semantics@4.2.0: {} @@ -10639,7 +8884,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10655,7 +8900,9 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} + human-signals@5.0.0: {} + + human-signals@8.0.1: {} i18next-fs-backend@2.6.0: {} @@ -10667,7 +8914,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -10675,8 +8922,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - immediate@3.0.6: {} import-fresh@3.3.1: @@ -10684,23 +8929,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} - indent-string@5.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.8: {} - ini@4.1.1: {} - inquirer@10.2.2: dependencies: '@inquirer/core': 9.2.1 @@ -10712,34 +8946,10 @@ snapshots: run-async: 3.0.0 rxjs: 7.8.2 - inquirer@8.2.5: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - inspect-with-kind@1.0.5: dependencies: kind-of: 6.0.3 - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - ioredis@5.7.0: dependencies: '@ioredis/commands': 1.3.1 @@ -10758,153 +8968,40 @@ snapshots: ipaddr.js@2.2.0: {} - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-builtin-module@5.0.0: - dependencies: - builtin-modules: 5.0.0 - - is-bun-module@2.0.0: - dependencies: - semver: 7.7.2 - - is-callable@1.2.7: {} - is-class@0.0.9: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-obj@2.0.0: {} - is-plain-obj@1.1.0: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@2.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-text-path@2.0.0: - dependencies: - text-extensions: 2.4.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-unicode-supported@0.1.0: {} - - is-utf8@0.2.1: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 + is-plain-obj@4.1.0: {} - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + is-stream@3.0.0: {} - is-windows@1.0.2: {} + is-stream@4.0.1: {} - isarray@2.0.5: {} + is-unicode-supported@2.1.0: {} isexe@2.0.0: {} + isexe@4.0.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -10913,43 +9010,18 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 iterare@1.2.1: {} - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 - jiti@2.5.1: {} - - jiti@2.6.1: {} + jiti@2.7.0: {} js-git@0.7.8: dependencies: @@ -10958,22 +9030,22 @@ snapshots: git-sha1: 0.1.2 pako: 0.2.9 - js-tokens@4.0.0: {} - - js-tokens@9.0.1: {} + js-tokens@10.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@3.0.2: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 - jsesc@3.1.0: {} + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-ref-resolver@2.0.1: dependencies: dequal: 2.0.3 @@ -10987,17 +9059,7 @@ snapshots: json-stringify-safe@5.0.1: optional: true - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonparse@1.3.1: {} + json-with-bigint@3.5.8: {} jsonwebtoken@9.0.2: dependencies: @@ -11012,13 +9074,6 @@ snapshots: ms: 2.1.3 semver: 7.7.2 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 @@ -11036,13 +9091,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: + keyv@5.6.0: dependencies: - language-subtag-registry: 0.3.23 + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} levn@0.4.1: dependencies: @@ -11061,56 +9114,54 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - - lines-and-columns@1.2.4: {} + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 load-esm@1.0.2: {} @@ -11122,12 +9173,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash.camelcase@4.3.0: {} - lodash.defaults@4.2.0: {} lodash.includes@4.3.0: {} @@ -11144,47 +9189,18 @@ snapshots: lodash.isstring@4.0.1: {} - lodash.kebabcase@4.1.1: {} - - lodash.map@4.6.0: {} - lodash.merge@4.6.2: {} - lodash.mergewith@4.6.2: {} - lodash.once@4.1.1: {} lodash.reduce@4.6.0: {} - lodash.snakecase@4.1.1: {} - - lodash.startcase@4.4.0: {} - - lodash.uniq@4.5.0: {} - - lodash.upperfirst@4.3.1: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loglevel@1.9.2: {} - - longest@2.0.1: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 + lodash@4.17.21: {} - loupe@3.1.4: {} + loglevel@1.9.2: {} lowercase-keys@3.0.0: {} - lru-cache@10.4.3: {} - lru-cache@11.1.0: {} lru-cache@6.0.0: @@ -11197,40 +9213,38 @@ snapshots: macaddress@0.5.3: {} - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.3: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.8.1 math-intrinsics@1.1.0: {} memory-pager@1.5.0: {} - meow@12.1.1: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} - merge@2.1.1: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -11242,14 +9256,10 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - - mimic-response@3.1.0: {} + mimic-fn@4.0.0: {} mimic-response@4.0.0: {} - min-indent@1.0.1: {} - minecraft-data@3.93.0: {} minecraft-folder-path@1.2.0: {} @@ -11283,15 +9293,17 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.15 minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 - minimist@1.2.7: {} + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 minimist@1.2.8: {} @@ -11369,11 +9381,11 @@ snapshots: mute-stream@1.0.0: {} - mute-stream@2.0.0: {} + mute-stream@3.0.0: {} nanoid@3.3.11: {} - napi-postinstall@0.3.3: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -11423,71 +9435,30 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.19: {} - node-rsa@0.4.2: dependencies: asn1: 0.2.3 normalize-path@3.0.0: {} - normalize-url@8.0.2: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + normalize-url@8.1.1: {} - object.fromentries@2.0.8: + npm-run-path@5.3.0: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + path-key: 4.0.0 - object.groupby@1.0.3: + npm-run-path@6.0.0: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 + path-key: 4.0.0 + unicorn-magic: 0.3.0 - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + obug@2.1.1: {} on-exit-leak-free@2.1.2: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: + onetime@6.0.0: dependencies: - mimic-fn: 2.1.0 + mimic-fn: 4.0.0 optionator@0.9.4: dependencies: @@ -11498,49 +9469,75 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - own-keys@1.0.1: + oxfmt@0.53.0: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-cancelable@3.0.0: {} + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.53.0 + '@oxfmt/binding-android-arm64': 0.53.0 + '@oxfmt/binding-darwin-arm64': 0.53.0 + '@oxfmt/binding-darwin-x64': 0.53.0 + '@oxfmt/binding-freebsd-x64': 0.53.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.53.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.53.0 + '@oxfmt/binding-linux-arm64-gnu': 0.53.0 + '@oxfmt/binding-linux-arm64-musl': 0.53.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.53.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.53.0 + '@oxfmt/binding-linux-riscv64-musl': 0.53.0 + '@oxfmt/binding-linux-s390x-gnu': 0.53.0 + '@oxfmt/binding-linux-x64-gnu': 0.53.0 + '@oxfmt/binding-linux-x64-musl': 0.53.0 + '@oxfmt/binding-openharmony-arm64': 0.53.0 + '@oxfmt/binding-win32-arm64-msvc': 0.53.0 + '@oxfmt/binding-win32-ia32-msvc': 0.53.0 + '@oxfmt/binding-win32-x64-msvc': 0.53.0 + + oxlint@1.68.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.68.0 + '@oxlint/binding-android-arm64': 1.68.0 + '@oxlint/binding-darwin-arm64': 1.68.0 + '@oxlint/binding-darwin-x64': 1.68.0 + '@oxlint/binding-freebsd-x64': 1.68.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.68.0 + '@oxlint/binding-linux-arm-musleabihf': 1.68.0 + '@oxlint/binding-linux-arm64-gnu': 1.68.0 + '@oxlint/binding-linux-arm64-musl': 1.68.0 + '@oxlint/binding-linux-ppc64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-musl': 1.68.0 + '@oxlint/binding-linux-s390x-gnu': 1.68.0 + '@oxlint/binding-linux-x64-gnu': 1.68.0 + '@oxlint/binding-linux-x64-musl': 1.68.0 + '@oxlint/binding-openharmony-arm64': 1.68.0 + '@oxlint/binding-win32-arm64-msvc': 1.68.0 + '@oxlint/binding-win32-ia32-msvc': 1.68.0 + '@oxlint/binding-win32-x64-msvc': 1.68.0 + + p-cancelable@4.0.1: {} + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 + p-timeout@6.1.4: {} pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -11564,29 +9561,15 @@ snapshots: parenthesis@3.1.8: {} - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-passwd@1.0.0: {} + parse-ms@4.0.0: {} path-exists@4.0.0: {} - path-exists@5.0.0: {} - - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} + path-key@4.0.0: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + path-parse@1.0.7: {} path-scurry@2.0.0: dependencies: @@ -11597,15 +9580,13 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pend@1.2.0: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pidusage@2.0.21: dependencies: @@ -11640,8 +9621,6 @@ snapshots: optionalDependencies: '@napi-rs/nice': 1.1.1 - pluralize@8.0.0: {} - pm2-axon-rpc@0.7.1: dependencies: debug: 4.4.1 @@ -11715,22 +9694,24 @@ snapshots: - supports-color - utf-8-validate - possible-typed-array-names@1.1.0: {} - postcss@8.4.31: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.6: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prismarine-auth@2.7.0: dependencies: '@azure/msal-node': 2.16.2 @@ -11794,12 +9775,6 @@ snapshots: dependencies: read: 1.0.7 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - protodef-validator@1.4.0: dependencies: ajv: 6.12.6 @@ -11813,7 +9788,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -11845,34 +9820,32 @@ snapshots: react: 19.2.1 scheduler: 0.27.0 - react-is@16.13.1: {} - - react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.1): + react-remove-scroll-bar@2.3.8(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - react-remove-scroll@2.7.1(@types/react@19.2.7)(react@19.2.1): + react-remove-scroll@2.7.1(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.1) - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.16)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.1) - use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.1) + use-callback-ref: 1.3.3(@types/react@19.2.16)(react@19.2.1) + use-sidecar: 1.1.3(@types/react@19.2.16)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.1): + react-style-singleton@2.2.3(@types/react@19.2.16)(react@19.2.1): dependencies: get-nonce: 1.0.1 react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 react@19.2.1: {} @@ -11880,12 +9853,6 @@ snapshots: dependencies: mute-stream: 0.0.8 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 @@ -11896,7 +9863,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 real-require@0.2.0: {} @@ -11908,34 +9875,6 @@ snapshots: reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp-tree@0.1.27: {} - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} - require-from-string@2.0.2: {} require-in-the-middle@5.2.0: @@ -11950,38 +9889,18 @@ snapshots: resolve-alpn@1.2.1: {} - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@3.0.0: + responselike@4.0.2: dependencies: lowercase-keys: 3.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - ret@0.1.15: {} ret@0.5.0: {} @@ -11990,60 +9909,36 @@ snapshots: rfdc@1.4.1: {} - rollup@4.45.1: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 - fsevents: 2.3.3 - - rollup@4.49.0: + rollup@4.61.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.49.0 - '@rollup/rollup-android-arm64': 4.49.0 - '@rollup/rollup-darwin-arm64': 4.49.0 - '@rollup/rollup-darwin-x64': 4.49.0 - '@rollup/rollup-freebsd-arm64': 4.49.0 - '@rollup/rollup-freebsd-x64': 4.49.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 - '@rollup/rollup-linux-arm-musleabihf': 4.49.0 - '@rollup/rollup-linux-arm64-gnu': 4.49.0 - '@rollup/rollup-linux-arm64-musl': 4.49.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 - '@rollup/rollup-linux-ppc64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-musl': 4.49.0 - '@rollup/rollup-linux-s390x-gnu': 4.49.0 - '@rollup/rollup-linux-x64-gnu': 4.49.0 - '@rollup/rollup-linux-x64-musl': 4.49.0 - '@rollup/rollup-win32-arm64-msvc': 4.49.0 - '@rollup/rollup-win32-ia32-msvc': 4.49.0 - '@rollup/rollup-win32-x64-msvc': 4.49.0 + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 fsevents: 2.3.3 - optional: true - - run-async@2.4.1: {} run-async@3.0.0: {} @@ -12057,27 +9952,8 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -12100,9 +9976,7 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.2 - - semver@6.3.1: {} + semver: 7.8.1 semver@7.5.4: dependencies: @@ -12113,29 +9987,9 @@ snapshots: semver@7.7.3: optional: true - set-cookie-parser@2.7.1: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + semver@7.8.1: {} - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + set-cookie-parser@2.7.1: {} setprototypeof@1.2.0: {} @@ -12179,34 +10033,6 @@ snapshots: shimmer@1.2.1: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - sift@17.1.3: {} siginfo@2.0.0: {} @@ -12215,7 +10041,7 @@ snapshots: signal-exit@4.1.0: {} - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -12224,7 +10050,7 @@ snapshots: skia-canvas@3.0.8: dependencies: detect-libc: 2.1.2 - follow-redirects: 1.15.11(debug@4.4.1) + follow-redirects: 1.15.11 https-proxy-agent: 7.0.6 string-split-by: 1.0.0 transitivePeerDependencies: @@ -12238,7 +10064,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -12279,8 +10105,6 @@ snapshots: sprintf-js@1.1.2: {} - stable-hash@0.0.5: {} - stackback@0.0.2: {} stackblur-canvas@2.7.0: {} @@ -12289,19 +10113,16 @@ snapshots: statuses@2.0.1: {} - std-env@3.9.0: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 + std-env@4.1.0: {} - streamx@2.22.1: + streamx@2.26.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.1 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-split-by@1.0.0: dependencies: @@ -12319,56 +10140,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -12381,28 +10152,22 @@ snapshots: dependencies: ansi-regex: 6.2.0 - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - strip-dirs@3.0.0: dependencies: inspect-with-kind: 1.0.5 is-plain-obj: 1.1.0 - strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 + strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} - strip-literal@3.0.0: + strtok3@10.3.4: dependencies: - js-tokens: 9.0.1 + '@tokenizer/token': 0.3.0 - strtok3@10.3.4: + strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 @@ -12411,9 +10176,11 @@ snapshots: client-only: 0.0.1 react: 19.2.1 - supports-color@5.5.0: + super-regex@1.1.0: dependencies: - has-flag: 3.0.0 + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 supports-color@7.2.0: dependencies: @@ -12425,32 +10192,31 @@ snapshots: dependencies: '@scarf/scarf': 1.4.0 + system-architecture@1.0.0: {} + systeminformation@5.27.8: optional: true - tailwind-merge@3.4.0: {} + tailwind-merge@3.6.0: {} - tailwindcss@4.1.17: {} + tailwindcss@4.3.0: {} - tapable@2.3.0: {} + tapable@2.3.3: {} tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.8.1 fast-fifo: 1.3.2 - streamx: 2.22.1 - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - text-decoder@1.2.3: + text-decoder@1.2.7: dependencies: - b4a: 1.6.7 - - text-extensions@2.4.0: {} + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a thread-stream@3.1.0: dependencies: @@ -12458,24 +10224,24 @@ snapshots: through@2.3.8: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-discord@https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d: {} tinybench@2.9.0: {} - tinyexec@0.3.2: {} - - tinyexec@1.0.1: {} + tinyexec@1.2.4: {} - tinyglobby@0.2.14: + tinyglobby@0.2.17: dependencies: - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinypool@1.1.1: {} + tinypool@2.1.0: {} - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.1.0: {} tmp@0.0.33: dependencies: @@ -12499,6 +10265,12 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + totalist@3.0.1: {} tr46@0.0.3: {} @@ -12507,47 +10279,22 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@2.1.0(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - - tsconfig-paths@3.15.0: + ts-api-utils@2.1.0(typescript@6.0.3): dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 + typescript: 6.0.3 tslib@1.9.3: {} tslib@2.8.1: {} - turbo-darwin-64@2.5.6: - optional: true - - turbo-darwin-arm64@2.5.6: - optional: true - - turbo-linux-64@2.5.6: - optional: true - - turbo-linux-arm64@2.5.6: - optional: true - - turbo-windows-64@2.5.6: - optional: true - - turbo-windows-arm64@2.5.6: - optional: true - - turbo@2.5.6: + turbo@2.9.16: optionalDependencies: - turbo-darwin-64: 2.5.6 - turbo-darwin-arm64: 2.5.6 - turbo-linux-64: 2.5.6 - turbo-linux-arm64: 2.5.6 - turbo-windows-64: 2.5.6 - turbo-windows-arm64: 2.5.6 + '@turbo/darwin-64': 2.9.16 + '@turbo/darwin-arm64': 2.9.16 + '@turbo/linux-64': 2.9.16 + '@turbo/linux-arm64': 2.9.16 + '@turbo/windows-64': 2.9.16 + '@turbo/windows-arm64': 2.9.16 tv4@1.3.0: {} @@ -12564,53 +10311,11 @@ snapshots: type-fest@0.21.3: {} - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 + type-fest@4.41.0: {} typedi@0.10.0: {} - typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): - dependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - typescript@5.9.2: {} + typescript@6.0.3: {} uglify-js@3.19.3: optional: true @@ -12621,13 +10326,6 @@ snapshots: uint8array-extras@1.5.0: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 @@ -12635,71 +10333,36 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.10.0: {} + undici-types@7.24.6: {} - unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} universal-user-agent@7.0.3: {} - universalify@2.0.1: {} - - unplugin@2.3.8: + unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.3 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - - update-browserslist-db@1.1.3(browserslist@4.25.3): - dependencies: - browserslist: 4.25.3 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.1): + use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.1): + use-sidecar@1.1.3(@types/react@19.2.16)(react@19.2.1): dependencies: detect-node-es: 1.1.0 react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 - - util-deprecate@1.0.2: {} + '@types/react': 19.2.16 uuid-1345@1.0.2: dependencies: @@ -12709,82 +10372,48 @@ snapshots: validator@13.15.15: {} - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2): + vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0): dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2): - dependencies: - esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.0 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - - vitest@3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 + jiti: 2.7.0 + lightningcss: 1.32.0 + + vitest@4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)): + dependencies: + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.0 - '@vitest/ui': 3.2.4(vitest@3.2.4) + '@types/node': 25.9.1 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@vitest/ui': 4.1.8(vitest@4.1.8) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml vizion@2.2.1: dependencies: @@ -12793,9 +10422,7 @@ snapshots: ini: 1.3.8 js-git: 0.7.8 - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 + web-worker@1.5.0: {} webidl-conversions@3.0.1: {} @@ -12813,51 +10440,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -12889,29 +10471,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - ws@7.5.10: {} - y18n@5.0.8: {} - yallist@4.0.0: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yauzl@3.2.0: + yauzl@3.3.2: dependencies: - buffer-crc32: 0.2.13 pend: 1.2.0 yggdrasil@1.7.0: @@ -12923,8 +10488,8 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} - yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} + zod@4.1.5: {} diff --git a/tsconfig.base.json b/tsconfig.base.json index 13e625fde..b8bec6417 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -11,16 +11,12 @@ "skipDefaultLibCheck": true, "skipLibCheck": true, "resolveJsonModule": true, - "downlevelIteration": true, "strictPropertyInitialization": false, "allowSyntheticDefaultImports": true, + "noImplicitReturns": true, "target": "esnext", "strict": true, - "types": [ - "vitest/importMeta" - ] + "types": ["vitest/importMeta"] }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "exclude": ["node_modules"] +} diff --git a/turbo.json b/turbo.json index bfbe61580..cf52f50df 100644 --- a/turbo.json +++ b/turbo.json @@ -1,54 +1,36 @@ { - "$schema": "https://turborepo.org/schema.json", - "globalDependencies": [ - "pnpm.lock", - "tsconfig.json", - ".swcrc", - "eslint.config.js" - ], - "ui": "tui", - "tasks": { - "build": { - "env": [ - "API_URL", - "API_KEY" - ], - "outputs": [ - "dist/**", - ".next/**", - "pkg/**" - ], - "dependsOn": [ - "^build" - ] - }, - "test:types": { - "outputs": [], - "dependsOn": [ - "^test:types" - ] - }, - "test": { - "outputs": [], - "dependsOn": [ - "build", - "^test" - ] - }, - "test:coverage": { - "outputs": [ - "coverage" - ], - "dependsOn": [ - "build", - "^test:coverage" - ] - }, - "lint": { - "outputs": [], - "dependsOn": [ - "^lint" - ] - } - } -} \ No newline at end of file + "$schema": "https://turborepo.org/schema.json", + "globalDependencies": ["pnpm.lock", "tsconfig.json", ".swcrc"], + "ui": "tui", + "tasks": { + "build": { + "env": ["API_URL", "API_KEY"], + "outputs": ["dist/**", ".next/**", "pkg/**"], + "dependsOn": ["^build"] + }, + "typecheck": { + "outputs": [], + "dependsOn": ["^typecheck"] + }, + "test": { + "outputs": [], + "dependsOn": ["build", "^test"] + }, + "test:coverage": { + "outputs": ["coverage"], + "dependsOn": ["build", "^test:coverage"] + }, + "lint": { + "outputs": [], + "dependsOn": [] + }, + "lint:ci": { + "outputs": [], + "dependsOn": [] + }, + "fmt": { + "outputs": [], + "dependsOn": [] + } + } +} diff --git a/vite.swc.ts b/vite.swc.ts index 41157741a..c1742417a 100644 --- a/vite.swc.ts +++ b/vite.swc.ts @@ -25,6 +25,8 @@ const resolveFile = (resolved: string, index = false) => { const file = index ? join(resolved, `index${ext}`) : `${resolved}${ext}`; if (existsSync(file)) return file; } + + return undefined; }; export const resolveId = async (importee: string, importer?: string) => { @@ -42,6 +44,8 @@ export const resolveId = async (importee: string, importer?: string) => { return resolved; } + + return undefined; }; export const swc = createUnplugin(({ minify, ...options }: SwcOptions = {}) => { diff --git a/apps/support-bot/eslint.config.js b/vitest.config.ts similarity index 57% rename from apps/support-bot/eslint.config.js rename to vitest.config.ts index 3325f85ed..3347734fb 100644 --- a/apps/support-bot/eslint.config.js +++ b/vitest.config.ts @@ -6,6 +6,10 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { defineConfig } from "../../eslint.config.js"; +import { defineConfig } from "vitest/config"; -export default defineConfig({ tsconfigDirName: import.meta.dirname }); +export default defineConfig({ + test: { + projects: ["./apps/*/vitest.config.ts", "./packages/*/vitest.config.ts"], + }, +}); diff --git a/vitest.workspace.ts b/vitest.workspace.ts deleted file mode 100644 index 68050b02c..000000000 --- a/vitest.workspace.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineWorkspace } from "vitest/config"; - -export default defineWorkspace([ - "./apps/*/vitest.config.ts", - "./packages/*/vitest.config.ts", -]); From f99dee996a9470aabf571154c10cb1549fa8160a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:44:09 -0400 Subject: [PATCH 09/15] chore(deps): update actions/cache digest to 27d5ce7 (#821) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5fd3cfa11..6f3f72de7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: - name: Turbo cache id: turbo-cache - uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: .turbo key: turbo-${{ github.job }}-${{ github.ref_name }}-${{ github.sha }} From aee3c50db60439a716c106aa287a84c64381a682 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:44:26 -0400 Subject: [PATCH 10/15] chore(deps): update actions/checkout digest to de0fac2 (#823) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f3f72de7..cc8b9a9fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cce68dd2b..5f1c46b50 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: environment: production steps: - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: token: ${{ secrets.REPO_PAT }} submodules: recursive From 6aafcddf47d30a04b1bdc24b9b5ec255e31ff930 Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:01:29 -0400 Subject: [PATCH 11/15] chore(lint): enable stricter no unused variable rules (#873) * chore(lint): enable stricter no unused variable rules * chore: update ci * chore: update ci * chore: update ci * chore: remove explicit cache dir for turborepo in package json --- .github/workflows/ci.yml | 4 ++++ .oxlintrc.jsonc | 4 ++++ apps/api/src/index.ts | 3 +-- apps/discord-bot/src/commands/arcade/modes/dropper.tsx | 6 +++--- .../src/commands/challenges/challenges.profile.tsx | 5 +++-- .../discord-bot/src/commands/quests/quests.profile.tsx | 2 +- apps/discord-bot/src/index.ts | 3 +-- apps/site/app/players/[slug]/general/bingo/bingo.tsx | 4 ++-- package.json | 10 +++++----- packages/util/src/config.ts | 3 +-- 10 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc8b9a9fc..c1a664b6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,10 +16,14 @@ jobs: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || 'origin/main' }} TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + filter: blob:none - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc index 99b35f251..dfbc9d08c 100644 --- a/.oxlintrc.jsonc +++ b/.oxlintrc.jsonc @@ -85,6 +85,10 @@ "no-prototype-builtins": "error", "no-useless-return": "error", "no-warning-comments": "warn", + "no-unused-vars": [ + "error", + { "fix": { "imports": "safe-fix", "variables": "safe-fix" } }, + ], "eqeqeq": "error", "class-methods-use-this": "warn", "symbol-description": "error", diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index bce208af1..648d33c1a 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -18,8 +18,7 @@ import { SentryInterceptor } from "./sentry/index.js"; import { Severity, setGlobalOptions } from "@typegoose/typegoose"; import { ValidationPipe } from "@nestjs/common"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; import { mkdir } from "node:fs/promises"; const directory = import.meta.dirname; diff --git a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx index 0ef43ddd5..4e06ca84b 100644 --- a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx +++ b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx @@ -54,9 +54,9 @@ const DROPPER_MAPS = scanMetadata(DropperMaps) ] as [keyof DropperMaps, string]) .sort(([a], [b]) => a.localeCompare(b)); -const HARD_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("§c")), 4); -const MEDIUM_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("§e")), 4); -const EASY_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("§a")), 4); +const HARD_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("§c")), 4); +const MEDIUM_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("§e")), 4); +const EASY_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("§a")), 4); interface DropperMapsTableProps { dropper: Dropper; diff --git a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx index 711c10286..656a906f1 100644 --- a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx +++ b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx @@ -56,7 +56,8 @@ interface NormalTableProps { } const NormalTable = ({ challenges, t, gameIcons }: NormalTableProps) => { - const { total: _, ...challengesByGame } = challenges; + const { total, ...challengesByGame } = challenges; + void total; const entries: [GameId, any][] = Object.entries(challengesByGame) .sort((a, b) => (b[1]?.total ?? 0) - (a[1]?.total ?? 0)) @@ -106,7 +107,7 @@ const GameTable = ({ gameChallenges, mode, t }: GameTableProps) => { .filter(([k]) => k !== "total") .sort((a, b) => b[1] - a[1]) .map(([challenge, completions]) => { - const [_, field] = metadata.find(([k]) => k === challenge)!; + const [, field] = metadata.find(([k]) => k === challenge)!; const realName = field.leaderboard?.name ?? prettify(challenge); return [realName, t(completions)]; diff --git a/apps/discord-bot/src/commands/quests/quests.profile.tsx b/apps/discord-bot/src/commands/quests/quests.profile.tsx index 961f59484..bd41d8a3c 100644 --- a/apps/discord-bot/src/commands/quests/quests.profile.tsx +++ b/apps/discord-bot/src/commands/quests/quests.profile.tsx @@ -91,7 +91,7 @@ const NormalTable = ({ quests, t, gameIcons, colorPalette, time }: NormalTablePr const entries: GameEntry[] = questEntries // Require more than just a total field - .filter(([_, q]) => Object.keys(q).length > 1) + .filter(([, q]) => Object.keys(q).length > 1) .map(([k, v]) => [k, v, Object.keys(v).length - 1] as const) .sort((a, b) => ratio(b[1]?.total ?? 0, b[2]) - ratio(a[1]?.total ?? 0, a[2])) .map(([k, v, total]) => { diff --git a/apps/discord-bot/src/index.ts b/apps/discord-bot/src/index.ts index 49f54df9f..7bfbafbb6 100644 --- a/apps/discord-bot/src/index.ts +++ b/apps/discord-bot/src/index.ts @@ -15,8 +15,7 @@ import { InteractionServer, RestClient, WebsocketShard } from "tiny-discord"; import { Logger } from "@statsify/logger"; import { VerifyCommand } from "#commands/verify.command"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; const directory = import.meta.dirname; diff --git a/apps/site/app/players/[slug]/general/bingo/bingo.tsx b/apps/site/app/players/[slug]/general/bingo/bingo.tsx index f8dc9bc9c..f9f663b99 100644 --- a/apps/site/app/players/[slug]/general/bingo/bingo.tsx +++ b/apps/site/app/players/[slug]/general/bingo/bingo.tsx @@ -84,8 +84,8 @@ function completetionColor(completion: number) { function CategoryOverview({ category, icon }: { category: Category; icon: StaticImport }) { const player = usePlayer(); - const [_, setCategory] = useUrlState("category", CategorySchema, "casual"); - const [__, setDifficulty] = useUrlState("difficulty", DifficultySchema, "easy"); + const [, setCategory] = useUrlState("category", CategorySchema, "casual"); + const [, setDifficulty] = useUrlState("difficulty", DifficultySchema, "easy"); const easyBingo = player.stats.general.bingo.easy[category]; const hardBingo = player.stats.general.bingo.hard[category]; diff --git a/package.json b/package.json index 2184e656b..11b347740 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,15 @@ "url": "git+https://github.com/Statsify/statsify.git" }, "scripts": { - "build": "turbo run build --filter=!site --cache-dir='.turbo'", + "build": "turbo run build --filter=!site", "build:watch": "turbo watch build --filter=!site", - "typecheck": "turbo run typecheck --cache-dir='.turbo'", + "typecheck": "turbo run typecheck", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "lint": "turbo run lint --cache-dir='.turbo'", - "lint:ci": "turbo run lint:ci --cache-dir='.turbo'", - "fmt": "turbo run fmt --cache-dir='.turbo'", + "lint": "turbo run lint", + "lint:ci": "turbo run lint:ci", + "fmt": "turbo run fmt", "api": "pnpm --filter api", "discord-bot": "pnpm --filter discord-bot", "support-bot": "pnpm --filter support-bot", diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index c2bf731f8..dd5a4b284 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -6,9 +6,8 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { dirname, join } from "node:path"; +import { join } from "node:path"; import { existsSync } from "node:fs"; -import { fileURLToPath } from "node:url"; import type { DeepFlatten } from "./flatten.js"; const directory = import.meta.dirname; From b2decc5587f0aafe75424eb0f7d6dbc703b07ccb Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:51:06 -0400 Subject: [PATCH 12/15] fix: use file urls for dynamic imports (#874) * fix: use file urls for dynamic imports * chore: update ci tests --- .github/workflows/ci.yml | 4 ++-- packages/discord/src/command/command.loader.ts | 12 +++++++----- packages/discord/src/event/event.loader.ts | 9 +++++---- packages/util/src/config.ts | 13 ++++++++----- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a664b6b..1fdcad16a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || 'origin/main' }} + TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository @@ -58,4 +58,4 @@ jobs: run: pnpm build --affected - name: Test - run: pnpm test:coverage + run: pnpm test:coverage --changed=$TURBO_SCM_BASE diff --git a/packages/discord/src/command/command.loader.ts b/packages/discord/src/command/command.loader.ts index 3648a9c56..ab06a5671 100644 --- a/packages/discord/src/command/command.loader.ts +++ b/packages/discord/src/command/command.loader.ts @@ -10,13 +10,15 @@ import { Container } from "typedi"; import { Logger } from "@statsify/logger"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; +import { join } from "node:path"; import type { CommandResolvable } from "./command.resolvable.js"; import { scanCommands } from "./command.builder.js"; +import { pathToFileURL } from "node:url"; const logger = new Logger("CommandLoader"); export async function loadCommands(dir: string) { - const files = await getCommandFiles(dir); + const files = await getCommandFileUrls(dir); const commands = await Promise.all(files.map(importCommand)); return new Map( @@ -54,19 +56,19 @@ async function importCommand(file: string) { }); } -async function getCommandFiles(dir: string): Promise { +async function getCommandFileUrls(dir: string): Promise { const toLoad: string[] = []; const files = await readdir(dir); await Promise.all( files.map(async (file) => { - const path = `${dir}/${file}`; + const path = join(dir, file); if (statSync(path).isDirectory()) { - toLoad.push(...(await getCommandFiles(path))); + toLoad.push(...(await getCommandFileUrls(path))); } else if (file.endsWith(".command.js")) { - toLoad.push(path); + toLoad.push(pathToFileURL(path).href); } }), ); diff --git a/packages/discord/src/event/event.loader.ts b/packages/discord/src/event/event.loader.ts index 40f752559..d765d3b86 100644 --- a/packages/discord/src/event/event.loader.ts +++ b/packages/discord/src/event/event.loader.ts @@ -13,11 +13,12 @@ import { Logger } from "@statsify/logger"; import { WebsocketShard } from "tiny-discord"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; +import { pathToFileURL } from "node:url"; const logger = new Logger("EventLoader"); export async function loadEvents(websocket: WebsocketShard, dir: string) { - const files = await getEventFiles(dir); + const files = await getEventFileUrls(dir); const events = await Promise.all(files.map(importEvent)); const eventsMap = new Map>(events.flat().map((event) => [event.event, event])); @@ -48,7 +49,7 @@ async function importEvent( .filter(Boolean) as AbstractEventListener[]; } -async function getEventFiles(dir: string): Promise { +async function getEventFileUrls(dir: string): Promise { const toLoad: string[] = []; const files = await readdir(dir); @@ -58,9 +59,9 @@ async function getEventFiles(dir: string): Promise { const path = `${dir}/${file}`; if (statSync(path).isDirectory()) { - toLoad.push(...(await getEventFiles(path))); + toLoad.push(...(await getEventFileUrls(path))); } else if (file.endsWith(".event.js")) { - toLoad.push(path); + toLoad.push(pathToFileURL(file).href); } }), ); diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index dd5a4b284..b3c71297e 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -9,6 +9,7 @@ import { join } from "node:path"; import { existsSync } from "node:fs"; import type { DeepFlatten } from "./flatten.js"; +import { pathToFileURL } from "node:url"; const directory = import.meta.dirname; @@ -280,13 +281,15 @@ async function loadConfig(): Promise<{ default: Config }> { }; } - if (existsSync(join(directory, "../../../config.json"))) { - return import(join(directory, "../../../config.json")); - } else if (existsSync(join(directory, "../../../config.js"))) { - return import(join(directory, "../../../config.js")); + for (const file of ["config.json", "config.js"]) { + const path = join(directory, "../../../", file); + + if (existsSync(path)) { + return import(pathToFileURL(path).href); + } } - throw new Error("No config file detected!"); + throw new Error("No config file detected!"); } let cfg: Config; From e81b2f9bb26c888477d0e71ac1adbf1a0bb6a6ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:00:12 -0400 Subject: [PATCH 13/15] chore(config): migrate renovate config (#872) * chore(config): migrate config renovate.json * chore: let all dependencies be updatable --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: jacobk999 --- renovate.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/renovate.json b/renovate.json index 078379310..2ce0da8c1 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,10 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "helpers:pinGitHubActionDigests", "group:allNonMajor"], + "extends": [ + "config:recommended", + "helpers:pinGitHubActionDigests", + "group:allNonMajor" + ], "labels": ["dependencies"], "schedule": ["before 12pm on Sunday"], "npm": { @@ -12,10 +16,6 @@ "automerge": true, "commitMessagePrefix": "chore(deps):" }, - { - "matchPackagePatterns": ["chalk", "@swc/cli", "@swc/core", "@swc/jest"], - "enabled": false - }, { "matchDepTypes": ["engines"], "enabled": false From 26c2b38306d145342712e374b069478312a4793e Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 2 Jun 2026 19:08:15 -0600 Subject: [PATCH 14/15] chore: add .DS_Store to .gitignore (#833) * chore: add .DS_Store to gitignore * chore: ci run build on all packages * chore: ci run build on all packages --------- Co-authored-by: jacobk999 --- .github/workflows/ci.yml | 2 +- .gitignore | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fdcad16a..e78a738b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: run: pnpm typecheck --affected - name: Build - run: pnpm build --affected + run: pnpm build - name: Test run: pnpm test:coverage --changed=$TURBO_SCM_BASE diff --git a/.gitignore b/.gitignore index 589536b4e..d9bad3af3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ out *.tar.gz *.7z *.rar +.DS_Store +**/.DS_Store .swc .next . From 719c644d83762a936531d7a24a639ad3fa8b0f29 Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:12:56 -0400 Subject: [PATCH 15/15] fix: add spacing between fields Co-authored-by: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> --- packages/schemas/src/player/gamemodes/duels/mode.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/schemas/src/player/gamemodes/duels/mode.ts b/packages/schemas/src/player/gamemodes/duels/mode.ts index 51bff22e0..305966015 100644 --- a/packages/schemas/src/player/gamemodes/duels/mode.ts +++ b/packages/schemas/src/player/gamemodes/duels/mode.ts @@ -97,6 +97,7 @@ export class BowPVPBaseDuelsGameMode extends PVPBaseDuelsGameMode { export class BowBaseDuelsGameMode extends PVPBaseDuelsGameMode { @Field() public shotsFired: number; + @Field() public shotsHit: number; @@ -290,6 +291,7 @@ export class SinglePVPDuelsGameMode extends PVPBaseDuelsGameMode { export class SingleBowPVPDuelsGameMode extends SinglePVPDuelsGameMode { @Field() public shotsFired: number; + @Field() public shotsHit: number;