From fef8e90c86e8ea539af4578aeb6169516a210adc Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:26:23 +0200 Subject: [PATCH 01/26] feat(core): migrate common/ render, ops, http, calculateRank to TypeScript (#322) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second wave of the `packages/core` TypeScript migration (#140), continuing #292. Converts the remaining `common/` modules and their tests from JSDoc `.js` to real `.ts`. ## Changes - **Modules ➡️ `.ts`**: `common/http`, `common/ops`, `common/render`, `calculateRank`. - **Tests ➡️ `.ts`**: `ops`, `flexLayout`, `render`, `calculateRank`. - **`src/_emoji-name-map.d.ts`**: `declare module` shim. `emoji-name-map` ships no types and has no `@types` package (same as the existing `@uppercod/css-to-object` shim). - **`common/color.ts`**: widened `getCardColors` optional params to `?: string | undefined` so `renderError` can forward possibly-`undefined` colors under `exactOptionalPropertyTypes`. --- packages/core/src/_emoji-name-map.d.ts | 10 + .../{calculateRank.js => calculateRank.ts} | 48 ++-- packages/core/src/common/color.ts | 14 +- packages/core/src/common/http.js | 19 -- packages/core/src/common/http.ts | 31 +++ packages/core/src/common/{ops.js => ops.ts} | 98 ++++----- .../core/src/common/{render.js => render.ts} | 206 +++++++++++------- ...lateRank.test.js => calculateRank.test.ts} | 0 ...{flexLayout.test.js => flexLayout.test.ts} | 0 .../core/tests/{ops.test.js => ops.test.ts} | 8 +- .../tests/{render.test.js => render.test.ts} | 0 11 files changed, 257 insertions(+), 177 deletions(-) create mode 100644 packages/core/src/_emoji-name-map.d.ts rename packages/core/src/{calculateRank.js => calculateRank.ts} (58%) delete mode 100644 packages/core/src/common/http.js create mode 100644 packages/core/src/common/http.ts rename packages/core/src/common/{ops.js => ops.ts} (54%) rename packages/core/src/common/{render.js => render.ts} (70%) rename packages/core/tests/{calculateRank.test.js => calculateRank.test.ts} (100%) rename packages/core/tests/{flexLayout.test.js => flexLayout.test.ts} (100%) rename packages/core/tests/{ops.test.js => ops.test.ts} (95%) rename packages/core/tests/{render.test.js => render.test.ts} (100%) diff --git a/packages/core/src/_emoji-name-map.d.ts b/packages/core/src/_emoji-name-map.d.ts new file mode 100644 index 0000000000000..a22d709a0c074 --- /dev/null +++ b/packages/core/src/_emoji-name-map.d.ts @@ -0,0 +1,10 @@ +/** + * `emoji-name-map` ships no type definitions and exposes no `exports` map, so it + * cannot be resolved under `nodenext`. Declare the minimal surface used here. + */ +declare module "emoji-name-map" { + const emojiNameMap: { + get(name: string): string | undefined; + }; + export default emojiNameMap; +} diff --git a/packages/core/src/calculateRank.js b/packages/core/src/calculateRank.ts similarity index 58% rename from packages/core/src/calculateRank.js rename to packages/core/src/calculateRank.ts index 377b3fbe11597..586752c314737 100644 --- a/packages/core/src/calculateRank.js +++ b/packages/core/src/calculateRank.ts @@ -1,20 +1,20 @@ /** * Calculates the exponential cdf. * - * @param {number} x The value. - * @returns {number} The exponential cdf. + * @param x The value. + * @returns The exponential cdf. */ -function exponential_cdf(x) { +function exponential_cdf(x: number): number { return 1 - 2 ** -x; } /** * Calculates the log normal cdf. * - * @param {number} x The value. - * @returns {number} The log normal cdf. + * @param x The value. + * @returns The log normal cdf. */ -function log_normal_cdf(x) { +function log_normal_cdf(x: number): number { // approximation return x / (1 + x); } @@ -22,16 +22,16 @@ function log_normal_cdf(x) { /** * Calculates the users rank. * - * @param {object} params Parameters on which the user's rank depends. - * @param {boolean} params.all_commits Whether `include_all_commits` was used. - * @param {number} params.commits Number of commits. - * @param {number} params.prs The number of pull requests. - * @param {number} params.issues The number of issues. - * @param {number} params.reviews The number of reviews. - * @param {number} params.repos Total number of repos. - * @param {number} params.stars The number of stars. - * @param {number} params.followers The number of followers. - * @returns {{ level: string, percentile: number }} The users rank. + * @param params Parameters on which the user's rank depends. + * @param params.all_commits Whether `include_all_commits` was used. + * @param params.commits Number of commits. + * @param params.prs The number of pull requests. + * @param params.issues The number of issues. + * @param params.reviews The number of reviews. + * @param params.repos Total number of repos (accepted for compatibility, unused in the calculation). + * @param params.stars The number of stars. + * @param params.followers The number of followers. + * @returns The users rank. */ function calculateRank({ all_commits, @@ -39,11 +39,18 @@ function calculateRank({ prs, issues, reviews, - // eslint-disable-next-line no-unused-vars - repos, // unused stars, followers, -}) { +}: { + all_commits: boolean; + commits: number; + prs: number; + issues: number; + reviews: number; + repos: number; + stars: number; + followers: number; +}): { level: string; percentile: number } { const COMMITS_MEDIAN = all_commits ? 1000 : 250, COMMITS_WEIGHT = 2; const PRS_MEDIAN = 50, @@ -79,6 +86,9 @@ function calculateRank({ TOTAL_WEIGHT; const level = LEVELS[THRESHOLDS.findIndex((t) => rank * 100 <= t)]; + if (level === undefined) { + throw new Error("Unable to determine rank level"); + } return { level, percentile: rank * 100 }; } diff --git a/packages/core/src/common/color.ts b/packages/core/src/common/color.ts index 2e9de30545e01..2ad524a5daf75 100644 --- a/packages/core/src/common/color.ts +++ b/packages/core/src/common/color.ts @@ -82,13 +82,13 @@ const getCardColors = ({ ring_color, theme, }: { - title_color?: string; - text_color?: string; - icon_color?: string; - bg_color?: string; - border_color?: string; - ring_color?: string; - theme?: string; + title_color?: string | undefined; + text_color?: string | undefined; + icon_color?: string | undefined; + bg_color?: string | undefined; + border_color?: string | undefined; + ring_color?: string | undefined; + theme?: string | undefined; }): CardColors => { const defaultTheme = themes.default; const isThemeProvided = theme !== undefined && theme in themes; diff --git a/packages/core/src/common/http.js b/packages/core/src/common/http.js deleted file mode 100644 index 388d105289906..0000000000000 --- a/packages/core/src/common/http.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from "axios"; - -/** - * Send GraphQL request to GitHub API. - * - * @param {import('axios').AxiosRequestConfig['data']} data Request data. - * @param {import('axios').AxiosRequestConfig['headers']} headers Request headers. - * @returns {Promise} Request response. - */ -const request = (data, headers) => { - return axios({ - url: "https://api.github.com/graphql", - method: "post", - headers, - data, - }); -}; - -export { request }; diff --git a/packages/core/src/common/http.ts b/packages/core/src/common/http.ts new file mode 100644 index 0000000000000..4c03701d8380c --- /dev/null +++ b/packages/core/src/common/http.ts @@ -0,0 +1,31 @@ +import axios from "axios"; +import type { AxiosRequestConfig, AxiosResponse } from "axios"; + +/** Body of a GraphQL request sent to the GitHub API. */ +interface GraphQLRequest { + /** The GraphQL query. */ + query: string; + /** Variables referenced by the query. */ + variables: Record; +} + +/** + * Send GraphQL request to GitHub API. + * + * @param data Request data. + * @param headers Request headers. + * @returns Request response. + */ +const request = ( + data: GraphQLRequest, + headers: NonNullable, +): Promise => { + return axios({ + url: "https://api.github.com/graphql", + method: "post", + headers, + data, + }); +}; + +export { request }; diff --git a/packages/core/src/common/ops.js b/packages/core/src/common/ops.ts similarity index 54% rename from packages/core/src/common/ops.js rename to packages/core/src/common/ops.ts index 04df76eed4092..2331e9ec704c6 100644 --- a/packages/core/src/common/ops.js +++ b/packages/core/src/common/ops.ts @@ -6,10 +6,10 @@ import { CustomError } from "./error.js"; /** * Returns boolean if value is either "true" or "false" else the value as it is. * - * @param {string | boolean} value The value to parse. - * @returns {boolean | undefined } The parsed value. + * @param value The value to parse. + * @returns The parsed value. */ -const parseBoolean = (value) => { +const parseBoolean = (value: string | boolean): boolean | undefined => { if (typeof value === "boolean") { return value; } @@ -27,10 +27,10 @@ const parseBoolean = (value) => { /** * Parse string to array of strings. * - * @param {string} str The string to parse. - * @returns {string[]} The array of strings. + * @param str The string to parse. + * @returns The array of strings. */ -const parseArray = (str) => { +const parseArray = (str: string): Array => { if (!str) { return []; } @@ -40,47 +40,44 @@ const parseArray = (str) => { /** * Clamp the given number between the given range. * - * @param {number} number The number to clamp. - * @param {number} min The minimum value. - * @param {number} max The maximum value. - * @returns {number} The clamped number. + * @param number The number to clamp. + * @param min The minimum value. + * @param max The maximum value. + * @returns The clamped number. */ -const clampValue = (number, min, max) => { - // @ts-ignore - if (Number.isNaN(parseInt(number, 10))) { +const clampValue = ( + number: string | number, + min: number, + max: number, +): number => { + if (Number.isNaN(parseInt(String(number), 10))) { return min; } - return Math.max(min, Math.min(number, max)); + return Math.max(min, Math.min(Number(number), max)); }; /** * Lowercase and trim string. * - * @param {string} name String to lowercase and trim. - * @returns {string} Lowercased and trimmed string. + * @param name String to lowercase and trim. + * @returns Lowercased and trimmed string. */ -const lowercaseTrim = (name) => name.toLowerCase().trim(); +const lowercaseTrim = (name: string): string => name.toLowerCase().trim(); /** * Split array of languages in two columns. * * @template T Language object. - * @param {Array} arr Array of languages. - * @param {number} perChunk Number of languages per column. - * @returns {Array} Array of languages split in two columns. + * @param arr Array of languages. + * @param perChunk Number of languages per column. + * @returns Array of languages split in two columns. */ -const chunkArray = (arr, perChunk) => { - return arr.reduce((resultArray, item, index) => { +const chunkArray = (arr: Array, perChunk: number): Array> => { + return arr.reduce>>((resultArray, item, index) => { const chunkIndex = Math.floor(index / perChunk); - - if (!resultArray[chunkIndex]) { - // @ts-ignore - resultArray[chunkIndex] = []; // start a new chunk - } - - // @ts-ignore - resultArray[chunkIndex].push(item); - + const chunk = resultArray[chunkIndex] ?? []; + chunk.push(item); + resultArray[chunkIndex] = chunk; return resultArray; }, []); }; @@ -88,10 +85,10 @@ const chunkArray = (arr, perChunk) => { /** * Parse emoji from string. * - * @param {string} str String to parse emoji from. - * @returns {string} String with emoji parsed. + * @param str String to parse emoji from. + * @returns String with emoji parsed. */ -const parseEmojis = (str) => { +const parseEmojis = (str: string): string => { if (!str) { throw new Error("[parseEmoji]: str argument not provided"); } @@ -103,11 +100,11 @@ const parseEmojis = (str) => { /** * Get diff in minutes between two dates. * - * @param {Date} d1 First date. - * @param {Date} d2 Second date. - * @returns {number} Number of minutes between the two dates. + * @param d1 First date. + * @param d2 Second date. + * @returns Number of minutes between the two dates. */ -const dateDiff = (d1, d2) => { +const dateDiff = (d1: Date, d2: Date): number => { const date1 = new Date(d1); const date2 = new Date(d2); const diff = date1.getTime() - date2.getTime(); @@ -117,40 +114,41 @@ const dateDiff = (d1, d2) => { /** * Parse owner affiliations. * - * @param {string[]} affiliations input affiliations to be parsed. - * @returns {string[]} Parsed affiliations. + * @param affiliations input affiliations to be parsed. + * @returns Parsed affiliations. * * @throws {CustomError} If affiliations contains invalid values. */ -const parseOwnerAffiliations = (affiliations) => { +const parseOwnerAffiliations = (affiliations: Array): Array => { // Set default value for ownerAffiliations. // NOTE: Done here since parseArray() will always return an empty array even nothing //was specified. - affiliations = - affiliations && affiliations.length > 0 + const normalized = + affiliations.length > 0 ? affiliations.map((affiliation) => affiliation.toUpperCase()) : ["OWNER"]; // Check if ownerAffiliations contains valid values. if ( - affiliations.some( - (affiliation) => !OWNER_AFFILIATIONS.includes(affiliation), - ) + normalized.some((affiliation) => !OWNER_AFFILIATIONS.includes(affiliation)) ) { throw new CustomError( "Invalid query parameter", CustomError.INVALID_AFFILIATION, ); } - return affiliations; + return normalized; }; -const buildSearchFilter = (repos = [], owners = []) => { - let repoFilter = +const buildSearchFilter = ( + repos: Array | string = [], + owners: Array | string = [], +): string => { + const repoFilter = Array.isArray(repos) && repos.length > 0 ? repos.map((r) => `repo:${r} `).join("") : ""; - let orgFilter = + const orgFilter = Array.isArray(owners) && owners.length > 0 ? owners.map((o) => `owner:${o} `).join("") : ""; diff --git a/packages/core/src/common/render.js b/packages/core/src/common/render.ts similarity index 70% rename from packages/core/src/common/render.js rename to packages/core/src/common/render.ts index 24dd8c624e2aa..f4a5517022c76 100644 --- a/packages/core/src/common/render.js +++ b/packages/core/src/common/render.ts @@ -7,14 +7,24 @@ import { clampValue } from "./ops.js"; * Auto layout utility, allows us to layout things vertically or horizontally with * proper gaping. * - * @param {object} props Function properties. - * @param {string[]} props.items Array of items to layout. - * @param {number} props.gap Gap between items. - * @param {"column" | "row"=} props.direction Direction to layout items. - * @param {number[]=} props.sizes Array of sizes for each item. - * @returns {string[]} Array of items with proper layout. + * @param props Function properties. + * @param props.items Array of items to layout. + * @param props.gap Gap between items. + * @param props.direction Direction to layout items. + * @param props.sizes Array of sizes for each item. + * @returns Array of items with proper layout. */ -const flexLayout = ({ items, gap, direction, sizes = [] }) => { +const flexLayout = ({ + items, + gap, + direction, + sizes = [], +}: { + items: Array; + gap: number; + direction?: "column" | "row"; + sizes?: Array; +}): Array => { let lastSize = 0; // filter() for filtering out empty strings return items.filter(Boolean).map((item, i) => { @@ -31,11 +41,11 @@ const flexLayout = ({ items, gap, direction, sizes = [] }) => { /** * Creates a node to display the primary programming language of the repository/gist. * - * @param {string} langName Language name. - * @param {string} langColor Language color. - * @returns {string} Language display SVG object. + * @param langName Language name. + * @param langColor Language color. + * @returns Language display SVG object. */ -const createLanguageNode = (langName, langColor) => { +const createLanguageNode = (langName: string, langColor: string): string => { return ` @@ -47,15 +57,15 @@ const createLanguageNode = (langName, langColor) => { /** * Create a node to indicate progress in percentage along a horizontal line. * - * @param {Object} params Object that contains the createProgressNode parameters. - * @param {number} params.x X-axis position. - * @param {number} params.y Y-axis position. - * @param {number} params.width Width of progress bar. - * @param {string} params.color Progress color. - * @param {number} params.progress Progress value. - * @param {string} params.progressBarBackgroundColor Progress bar bg color. - * @param {number} params.delay Delay before animation starts. - * @returns {string} Progress node. + * @param params Object that contains the createProgressNode parameters. + * @param params.x X-axis position. + * @param params.y Y-axis position. + * @param params.width Width of progress bar. + * @param params.color Progress color. + * @param params.progress Progress value. + * @param params.progressBarBackgroundColor Progress bar bg color. + * @param params.delay Delay before animation starts. + * @returns Progress node. */ const createProgressNode = ({ x, @@ -65,7 +75,15 @@ const createProgressNode = ({ progress, progressBarBackgroundColor, delay, -}) => { +}: { + x: number; + y: number; + width: number; + color: string; + progress: number; + progressBarBackgroundColor: string; + delay: number; +}): string => { const progressPercentage = clampValue(progress, 2, 100); return ` @@ -89,16 +107,16 @@ const createProgressNode = ({ * native, font-aware wrapping. Content overflowing `lineCount` lines is * clipped (with an ellipsis on the last visible line) by CSS line-clamp. * - * @param {object} props Function properties. - * @param {string} props.text Text to render (will be HTML-encoded). - * @param {number} props.x X position of the foreignObject. - * @param {number} props.y Y position of the foreignObject. - * @param {number} props.width Width of the wrap box. - * @param {number} props.height Height of the wrap box. - * @param {number} props.lineCount Maximum number of lines to display. - * @param {string} props.className CSS class applied to the inner element. - * @param {string=} props.testId Optional test id for the inner element. - * @returns {string} foreignObject SVG node. + * @param props Function properties. + * @param props.text Text to render (will be HTML-encoded). + * @param props.x X position of the foreignObject. + * @param props.y Y position of the foreignObject. + * @param props.width Width of the wrap box. + * @param props.height Height of the wrap box. + * @param props.lineCount Maximum number of lines to display. + * @param props.className CSS class applied to the inner element. + * @param props.testId Optional test id for the inner element. + * @returns foreignObject SVG node. */ const wrappedTextNode = ({ text, @@ -109,7 +127,16 @@ const wrappedTextNode = ({ lineCount, className, testId, -}) => { +}: { + text: string; + x: number; + y: number; + width: number; + height: number; + lineCount: number; + className: string; + testId?: string; +}): string => { const testIdAttr = testId ? ` data-testid="${testId}"` : ""; return ` @@ -126,10 +153,10 @@ const wrappedTextNode = ({ * browser handles wrapping and the line count is taken from the `--lines` * custom property set on the element. * - * @param {string} color Text color (CSS `color` property). - * @returns {string} CSS rules block (without the surrounding selector). + * @param color Text color (CSS `color` property). + * @returns CSS rules block (without the surrounding selector). */ -const wrappedTextStyles = (color) => ` +const wrappedTextStyles = (color: string): string => ` color: ${color}; margin: 0; line-height: 1.2; @@ -147,13 +174,18 @@ const wrappedTextStyles = (color) => ` /** * Creates an icon with label to display repository/gist stats like forks, stars, etc. * - * @param {string} icon The icon to display. - * @param {number|string} label The label to display. - * @param {string} testid The testid to assign to the label. - * @param {number} iconSize The size of the icon. - * @returns {string} Icon with label SVG object. + * @param icon The icon to display. + * @param label The label to display. + * @param testid The testid to assign to the label. + * @param iconSize The size of the icon. + * @returns Icon with label SVG object. */ -const iconWithLabel = (icon, label, testid, iconSize) => { +const iconWithLabel = ( + icon: string, + label: number | string, + testid: string, + iconSize: number, +): string => { if (typeof label === "number" && label <= 0) { return ""; } @@ -184,23 +216,34 @@ const UPSTREAM_API_ERRORS = [ /** * Renders error message on the card. * - * @param {object} args Function arguments. - * @param {string} args.message Main error message. - * @param {string} [args.secondaryMessage=""] The secondary error message. - * @param {object} [args.renderOptions={}] Render options. - * @param {string=} args.renderOptions.title_color Card title color. - * @param {string=} args.renderOptions.text_color Card text color. - * @param {string=} args.renderOptions.bg_color Card background color. - * @param {string=} args.renderOptions.border_color Card border color. - * @param {Parameters[0]["theme"]=} args.renderOptions.theme Card theme. - * @param {boolean=} args.renderOptions.show_repo_link Whether to show repo link or not. - * @returns {string} The SVG markup. + * @param args Function arguments. + * @param args.message Main error message. + * @param args.secondaryMessage The secondary error message. + * @param args.renderOptions Render options. + * @param args.renderOptions.title_color Card title color. + * @param args.renderOptions.text_color Card text color. + * @param args.renderOptions.bg_color Card background color. + * @param args.renderOptions.border_color Card border color. + * @param args.renderOptions.theme Card theme. + * @param args.renderOptions.show_repo_link Whether to show repo link or not. + * @returns The SVG markup. */ const renderError = ({ message, secondaryMessage = "", renderOptions = {}, -}) => { +}: { + message: string; + secondaryMessage?: string; + renderOptions?: { + title_color?: string; + text_color?: string; + bg_color?: string; + border_color?: string; + theme?: string; + show_repo_link?: boolean; + }; +}): string => { const { title_color, text_color, @@ -222,7 +265,7 @@ const renderError = ({ }); return ` - + + }" height="99%" rx="4.5" fill="${String(bgColor)}" stroke="${borderColor}"/> Something went wrong!${ UPSTREAM_API_ERRORS.includes(secondaryMessage) || !show_repo_link ? "" @@ -248,11 +291,11 @@ const renderError = ({ * Retrieve text length based on Segoe UI font. * * @see https://stackoverflow.com/a/48172630/10629172 - * @param {string} str String to measure. - * @param {number} fontSize Font size. - * @returns {number} Text length. + * @param str String to measure. + * @param fontSize Font size. + * @returns Text length. */ -const measureText = (str, fontSize = 10) => { +const measureText = (str: string, fontSize = 10): number => { // prettier-ignore const widths = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -304,7 +347,7 @@ const measureText = (str, fontSize = 10) => { return 1; } if (c.charCodeAt(0) < widths.length) { - return widths[c.charCodeAt(0)]; + return widths[c.charCodeAt(0)] ?? avg; } else { return avg; } @@ -320,12 +363,16 @@ const measureText = (str, fontSize = 10) => { * The browser still does the real wrap inside the foreignObject; this is only * used to size the SVG. * - * @param {string} text Text to split. - * @param {number} fontSize Font size in px (matches `measureText`). - * @param {number} maxWidth Available wrap width in px. - * @returns {string[]} Estimated wrapped lines. + * @param text Text to split. + * @param fontSize Font size in px (matches `measureText`). + * @param maxWidth Available wrap width in px. + * @returns Estimated wrapped lines. */ -const splitWrappedText = (text, fontSize, maxWidth) => { +const splitWrappedText = ( + text: string, + fontSize: number, + maxWidth: number, +): Array => { if (!text) { return []; } @@ -340,15 +387,15 @@ const splitWrappedText = (text, fontSize, maxWidth) => { // Korean Hangul (U+AC00–U+D7AF) is intentionally NOT in the CJK range // because Korean wraps at word boundaries by default in HTML. // ASCII whitespace is collapsed to a single space per CSS `white-space: normal;` - text = text.replace(/[\t\n\r ]+/g, " "); - const tokens = text.match( + const normalizedText = text.replace(/[\t\n\r ]+/g, " "); + const tokens = normalizedText.match( /\s|[\u3000-\u9FFF\uFF00-\uFFEF]|[^\s\u3000-\u9FFF\uFF00-\uFFEF]+/g, ); if (!tokens) { return []; } - const takeFittingSegment = (token, availableWidth) => { + const takeFittingSegment = (token: string, availableWidth: number) => { const characters = token.split(""); let segment = ""; let width = 0; @@ -377,7 +424,7 @@ const splitWrappedText = (text, fontSize, maxWidth) => { if (currentWidth === 0) { continue; } - lines[lines.length - 1] += token; + lines[lines.length - 1] = (lines[lines.length - 1] ?? "") + token; currentWidth += measureText(token, fontSize); continue; } @@ -387,7 +434,7 @@ const splitWrappedText = (text, fontSize, maxWidth) => { while (remaining) { const w = measureText(remaining, fontSize); if (currentWidth + w <= maxWidth) { - lines[lines.length - 1] += remaining; + lines[lines.length - 1] = (lines[lines.length - 1] ?? "") + remaining; currentWidth += w; break; } @@ -400,7 +447,7 @@ const splitWrappedText = (text, fontSize, maxWidth) => { // An atom wider than the box wraps mid-glyph (overflow-wrap: anywhere). const { segment, width } = takeFittingSegment(remaining, maxWidth); - lines[lines.length - 1] += segment; + lines[lines.length - 1] = (lines[lines.length - 1] ?? "") + segment; currentWidth = width; remaining = remaining.slice(segment.length); } @@ -413,13 +460,18 @@ const splitWrappedText = (text, fontSize, maxWidth) => { * Estimate how many lines a string will wrap to when laid out greedily at the * given font size inside a box of width `maxWidth`, capped at `maxLines`. * - * @param {string} text Text to estimate. - * @param {number} fontSize Font size in px (matches `measureText`). - * @param {number} maxWidth Available wrap width in px. - * @param {number} maxLines Cap on the returned line count. - * @returns {number} Estimated line count, at least 1, at most `maxLines`. + * @param text Text to estimate. + * @param fontSize Font size in px (matches `measureText`). + * @param maxWidth Available wrap width in px. + * @param maxLines Cap on the returned line count. + * @returns Estimated line count, at least 1, at most `maxLines`. */ -const countWrappedLines = (text, fontSize, maxWidth, maxLines) => { +const countWrappedLines = ( + text: string, + fontSize: number, + maxWidth: number, + maxLines: number, +): number => { return Math.min( Math.max(1, splitWrappedText(text, fontSize, maxWidth).length), maxLines, diff --git a/packages/core/tests/calculateRank.test.js b/packages/core/tests/calculateRank.test.ts similarity index 100% rename from packages/core/tests/calculateRank.test.js rename to packages/core/tests/calculateRank.test.ts diff --git a/packages/core/tests/flexLayout.test.js b/packages/core/tests/flexLayout.test.ts similarity index 100% rename from packages/core/tests/flexLayout.test.js rename to packages/core/tests/flexLayout.test.ts diff --git a/packages/core/tests/ops.test.js b/packages/core/tests/ops.test.ts similarity index 95% rename from packages/core/tests/ops.test.js rename to packages/core/tests/ops.test.ts index 9fa5b355a1574..7d6d1fdde156e 100644 --- a/packages/core/tests/ops.test.js +++ b/packages/core/tests/ops.test.ts @@ -25,7 +25,7 @@ describe("Test ops.js", () => { expect(parseBoolean("1")).toBe(undefined); expect(parseBoolean("0")).toBe(undefined); expect(parseBoolean("")).toBe(undefined); - // @ts-ignore + // @ts-expect-error testing invalid input expect(parseBoolean(undefined)).toBe(undefined); }); @@ -33,7 +33,7 @@ describe("Test ops.js", () => { expect(parseArray("a,b,c")).toEqual(["a", "b", "c"]); expect(parseArray("a, b, c")).toEqual(["a", " b", " c"]); // preserves spaces expect(parseArray("")).toEqual([]); - // @ts-ignore + // @ts-expect-error testing invalid input expect(parseArray(undefined)).toEqual([]); }); @@ -43,11 +43,9 @@ describe("Test ops.js", () => { expect(clampValue(15, 1, 10)).toBe(10); // string inputs are coerced numerically by Math.min/Math.max - // @ts-ignore expect(clampValue("7", 1, 10)).toBe(7); // non-numeric and NaN fall back to min - // @ts-ignore expect(clampValue("abc", 1, 10)).toBe(1); expect(clampValue(NaN, 2, 5)).toBe(2); }); @@ -73,7 +71,7 @@ describe("Test ops.js", () => { expect(out.endsWith(" OSS")).toBe(true); expect(() => parseEmojis("")).toThrow(/parseEmoji/); - // @ts-ignore + // @ts-expect-error testing missing argument expect(() => parseEmojis()).toThrow(/parseEmoji/); }); diff --git a/packages/core/tests/render.test.js b/packages/core/tests/render.test.ts similarity index 100% rename from packages/core/tests/render.test.js rename to packages/core/tests/render.test.ts From 748d8c543009e4ab7f8575f491d8f2ba7aea150b Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:27:36 +0200 Subject: [PATCH 02/26] refactor(frontend): replace eslint react plugins with `@eslint-react/eslint-plugin` (#326) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixes #325 `eslint-plugin-react@7.37.5` doesn't declare support for ESLint 10, producing an unmet-peer-dependency warning. ## Changes - Swapped `eslint-plugin-react` ➡️ `@eslint-react/eslint-plugin` and adopted its `recommended-typescript` config. This also replaces `eslint-plugin-react-hooks` (the preset ships equivalent `rules-of-hooks`/`exhaustive-deps`), so both old plugins are removed. - Fixed the violations the new preset surfaced: - IIFEs-in-JSX in `Home.tsx` ➡️ lifted to `const` bindings. - Ref naming (`*Ref`). - 4 `set-state-in-effect` cases ➡️ rewritten as render-phase state adjustment ([React docs](https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes)). - Extracted the shared debounced-input logic from `TextSection`/`NumericSection` into a `useDebouncedField` hook. - Added a standalone Playwright spec (`e2e/app-trends-auth.spec.ts`) covering the `AppTrends` auth-driven stage transition. --------- Co-authored-by: martin-mfg <2026226+martin-mfg@users.noreply.github.com> --- apps/frontend/e2e/app-trends-auth.spec.ts | 61 + .../src/components/Home/NumericSection.tsx | 41 +- .../src/components/Home/TextSection.tsx | 35 +- apps/frontend/src/hooks/useDebouncedField.ts | 82 + apps/frontend/src/pages/App/AppTrends.tsx | 26 +- apps/frontend/src/pages/Home/Home.tsx | 89 +- eslint.config.js | 36 +- package.json | 3 +- pnpm-lock.yaml | 1746 ++++------------- 9 files changed, 634 insertions(+), 1485 deletions(-) create mode 100644 apps/frontend/e2e/app-trends-auth.spec.ts create mode 100644 apps/frontend/src/hooks/useDebouncedField.ts diff --git a/apps/frontend/e2e/app-trends-auth.spec.ts b/apps/frontend/e2e/app-trends-auth.spec.ts new file mode 100644 index 0000000000000..6976e1eb0fc33 --- /dev/null +++ b/apps/frontend/e2e/app-trends-auth.spec.ts @@ -0,0 +1,61 @@ +import { expect, test } from "@playwright/test"; +import type { Page } from "@playwright/test"; + +/** + * Puts the SPA into an authenticated state without contacting GitHub by + * stubbing the OAuth code exchange and the follow-up user-access lookup: + * `authenticate` returns a userId (which flips `isAuthenticated` to true), and + * `user-access` returns metadata so AppTrends does not immediately log back out. + * @param page - The Playwright page to install the route handlers on. + */ +async function mockAuthEndpoints(page: Page): Promise { + await page.route("**/api/authenticate**", (route) => + route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ userId: "octocat", needDowngrade: false }), + }), + ); + await page.route("**/api/user-access**", (route) => + route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ token: "test-token", privateAccess: "false" }), + }), + ); +} + +test.describe("AppTrends auth-driven stage transition", () => { + test("auto-advances from Login to Select a Card once authenticated", async ({ + page, + }) => { + await mockAuthEndpoints(page); + + // Land on the app as GitHub does after the OAuth redirect (URL carries `code`). + await page.goto("?code=test-oauth-code"); + + // AppTrends starts unauthenticated on stage 0 ("Login"). When the code + // exchange flips `isAuthenticated` false -> true, the render-phase + // transition must advance the stepper to stage 1 ("Select a Card"). + await expect(page.getByRole("heading", { level: 1 })).toContainText( + "Select a Card", + ); + }); + + test("keeps a manually selected earlier step instead of re-forcing it", async ({ + page, + }) => { + await mockAuthEndpoints(page); + await page.goto("?code=test-oauth-code"); + + const heading = page.getByRole("heading", { level: 1 }); + await expect(heading).toContainText("Select a Card"); + + // Going back to "Login" while still authenticated must stick: the transition + // fires only on an auth *change*, so a later render must not snap the user + // forward again. A bug that dropped the previous-value guard would bounce + // the heading straight back to "Select a Card" here. + await page.getByRole("button", { name: "Login" }).click(); + await expect(heading).toContainText("Login"); + }); +}); diff --git a/apps/frontend/src/components/Home/NumericSection.tsx b/apps/frontend/src/components/Home/NumericSection.tsx index e665552c0a5b0..c69b4b4f50d95 100644 --- a/apps/frontend/src/components/Home/NumericSection.tsx +++ b/apps/frontend/src/components/Home/NumericSection.tsx @@ -1,6 +1,7 @@ -import { useEffect, useRef, useState } from "react"; import type { JSX, ReactNode } from "react"; +import { useDebouncedField } from "../../hooks/useDebouncedField"; + import { Section } from "./Section"; interface NumericSectionProps { @@ -26,35 +27,11 @@ export function NumericSection({ disabled = false, placeholder, }: NumericSectionProps): JSX.Element { - const [internalValue, setInternalValue] = useState(() => value?.toString()); - const debounceTimeout = useRef(null); - - useEffect(() => { - // Debounce onValueChange - if (debounceTimeout.current) { - clearTimeout(debounceTimeout.current); - } - if (internalValue === value) { - return undefined; - } - - debounceTimeout.current = window.setTimeout(() => { - const maybeNumber = internalValue && parseInt(internalValue, 10); - if (typeof maybeNumber !== "number" || Number.isNaN(maybeNumber)) { - onValueChange(undefined); - } else { - onValueChange(maybeNumber); - } - }, 700); - - return () => { - clearTimeout(debounceTimeout.current as number); - }; - }, [internalValue, onValueChange, value]); - - useEffect(() => { - setInternalValue(value?.toString()); - }, [value]); + const { inputValue, setInputValue } = useDebouncedField({ + value, + onValueChange, + type: "number", + }); return (
@@ -62,9 +39,9 @@ export function NumericSection({
{ - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - return `${selectedUserId}_card`; - case CardType.PIN: - return `${repo}_card`; - case CardType.GIST: - return `gist_card`; - case CardType.WAKATIME: - return `${wakatimeUser}_card`; - default: - selectedCard satisfies never; - return ""; - } - })()} - link={(() => { - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - return `https://${HOST}/api${themeSuffix}`; - - case CardType.PIN: { - let myRepo = repo; - if (!myRepo.includes("/")) { - myRepo = `${userId}/${myRepo}`; - } - return `https://github.com/${myRepo}`; - } - case CardType.GIST: - return gistUrl; - case CardType.WAKATIME: - return `https://wakatime.com/@${wakatimeUser}`; - default: - selectedCard satisfies never; - return ""; - } - })()} + filename={cardFilename} + link={cardLink} theme={theme} themeSuffix={themeSuffix} guestHint={ diff --git a/eslint.config.js b/eslint.config.js index c1b759dbeb113..909e6e84bc50f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,12 +2,14 @@ import { fileURLToPath } from "node:url"; import { includeIgnoreFile } from "@eslint/compat"; import js from "@eslint/js"; +import eslintReact from "@eslint-react/eslint-plugin"; import { defineConfig } from "eslint/config"; -import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript"; +import { + createTypeScriptImportResolver, + defaultConditionNames, +} from "eslint-import-resolver-typescript"; import { importX } from "eslint-plugin-import-x"; import { default as jsdoc } from "eslint-plugin-jsdoc"; -import react from "eslint-plugin-react"; -import reactHooks from "eslint-plugin-react-hooks"; import globals from "globals"; import { default as tseslint } from "typescript-eslint"; @@ -26,14 +28,7 @@ export default defineConfig( /** Keep in sync with `tsconfig.base.json#customConditions` */ "@stats/source", - "types", - "import", - - "require", - "node", - "node-addons", - "browser", - "default", + ...defaultConditionNames, ], }), ], @@ -176,23 +171,6 @@ export default defineConfig( }, { files: ["apps/frontend/**/*.{js,jsx,ts,tsx}"], - plugins: { - react, - "react-hooks": reactHooks, - }, - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, - rules: { - "react/jsx-no-undef": "error", - "react/jsx-uses-vars": "error", - "react/no-array-index-key": "warn", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - }, + ...eslintReact.configs["recommended-typescript"], }, ); diff --git a/package.json b/package.json index ba3912a571c72..d0e4ba19b5fea 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "type": "module", "packageManager": "pnpm@10.33.2+sha512.a90faf6feeab71ad6c6e57f94e0fe1a12f5dcc22cd754db40ae9593eb6a3e0b6b12e3540218bb37ae083404b1f2ce6db2a4121e979829b4aff94b99f49da1cf8", "devDependencies": { + "@eslint-react/eslint-plugin": "5.9.2", "@eslint/compat": "2.1.0", "@eslint/js": "10.0.1", "@playwright/test": "1.60.0", @@ -13,8 +14,6 @@ "eslint-import-resolver-typescript": "4.4.5", "eslint-plugin-import-x": "4.16.2", "eslint-plugin-jsdoc": "63.0.2", - "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "7.1.1", "globals": "17.6.0", "husky": "9.1.7", "knip": "6.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baff1b51b6d25..f00f5876fa2f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: .: devDependencies: + '@eslint-react/eslint-plugin': + specifier: 5.9.2 + version: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@eslint/compat': specifier: 2.1.0 version: 2.1.0(eslint@10.4.1(jiti@2.7.0)) @@ -46,19 +49,13 @@ importers: version: 10.4.1(jiti@2.7.0) eslint-import-resolver-typescript: specifier: 4.4.5 - version: 4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)) + version: 4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) + version: 4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-jsdoc: specifier: 63.0.2 version: 63.0.2(eslint@10.4.1(jiti@2.7.0)) - eslint-plugin-react: - specifier: 7.37.5 - version: 7.37.5(eslint@10.4.1(jiti@2.7.0)) - eslint-plugin-react-hooks: - specifier: 7.1.1 - version: 7.1.1(eslint@10.4.1(jiti@2.7.0)) globals: specifier: 17.6.0 version: 17.6.0 @@ -246,36 +243,6 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -284,14 +251,6 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} @@ -301,14 +260,6 @@ packages: resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -384,6 +335,55 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-react/ast@5.9.2': + resolution: {integrity: sha512-206StJvea00Bs9etMOEG94muuBP/gQ6NPK2Tg/m/Dbx1o3hEOpoblxKqBF1jYx91C1DIrbuzqaqI1N/XTfGYxw==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/core@5.9.2': + resolution: {integrity: sha512-GcXEaMAyjFgbIP7g1TQ+p7VohhnM4g1wtEccj4MNXb1jzTKioPcWxRWN95lrBnrCYskvZXsPCWM4ERQjMQGU2g==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/eslint-plugin@5.9.2': + resolution: {integrity: sha512-o1rSyib/uWlWU8qPg6E1U0ME/mrS/YZYSr4ruSw7dGoQTNZBOFVs0T0KivioK5YfLksHH2ynPOCn6w4EUnH47w==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/eslint@5.9.2': + resolution: {integrity: sha512-8Fr+dqE8NoB7XRlp8AQp/IE5koQYxprXYAzktCmySVtwH6/I2HDQsVy/wcNMuIcCM7EPkiAbtl9MOiFvcbTAkw==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/jsx@5.9.2': + resolution: {integrity: sha512-rag1x+7lZHDOTT8WfWeS22fymh5JVr11O8m2SptTyI68ao0TWjTc5+BBHtv/lvQlea+VZpRH1n4pZV3e4Hkspw==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/shared@5.9.2': + resolution: {integrity: sha512-NU3pHMA3iADBH7HEPql/KSZTgooGp1HShT6TyeG46TApA42Z+X+gBk5MFmwazF/HPd/q3T2N6KU5gLWRNqXgng==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + '@eslint-react/var@5.9.2': + resolution: {integrity: sha512-9+J8GmsKi3diHF2Ij++vb5HVs6IO9rbLUs2i4pzCeqrGZstyrTVp3BMSSzn2GamRODCU9Zz/Shl8vhwrSkqYsQ==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + '@eslint/compat@2.1.0': resolution: {integrity: sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -983,9 +983,6 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -1027,16 +1024,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.62.0': + resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.61.0': resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.62.0': + resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.61.0': resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/tsconfig-utils@8.62.0': + resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.61.0': resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1044,20 +1057,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/type-utils@8.62.0': + resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/types@8.61.0': resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.62.0': + resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.61.0': resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/typescript-estree@8.62.0': + resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.61.0': resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1065,10 +1091,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.62.0': + resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.61.0': resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.62.0': + resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} + 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] @@ -1281,34 +1318,6 @@ packages: 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-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.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'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1316,17 +1325,9 @@ packages: ast-v8-to-istanbul@1.0.0: resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - axios-cache-interceptor@1.12.0: resolution: {integrity: sha512-15XuJkdeJmQo/HY2b0xx3zim8DMx7Nu+G8R4z6OG2VZLtbIDnsfn4qZsLLvkPfK4SVNRzXnoG4jPR7dqdQznRA==} engines: {node: '>=12'} @@ -1341,37 +1342,24 @@ packages: axios@1.17.0: resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.20: - resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==} - engines: {node: '>=6.0.0'} - hasBin: true - bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1383,17 +1371,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001788: - resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -1414,16 +1395,12 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comment-parser@1.4.6: - resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} - engines: {node: '>= 12.0.0'} - comment-parser@1.4.7: resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} engines: {node: '>= 12.0.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} @@ -1465,18 +1442,6 @@ packages: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - 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'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1492,14 +1457,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - 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'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1516,10 +1473,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1533,9 +1486,6 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.340: - resolution: {integrity: sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==} - emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1558,10 +1508,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1570,10 +1516,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} - engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} @@ -1585,18 +1527,6 @@ 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'} - - 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==} @@ -1645,17 +1575,47 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-react-hooks@7.1.1: - resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} - engines: {node: '>=18'} + eslint-plugin-react-dom@5.9.2: + resolution: {integrity: sha512-9pOLfUWBSR49OLZxCIDLngyfqOozsoilPl1Tv3pxoW389AVB/Gg3So4Rf+UPpQtEjJP6840hnTZkmY+A44umng==} + engines: {node: '>=22.0.0'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + eslint: '*' + typescript: '*' - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} + eslint-plugin-react-jsx@5.9.2: + resolution: {integrity: sha512-LPogjhB5FevfPp7dUdh2qrku+DbWvVuqWYwO4Kb9ty1RYKQN9DsZx1Db1WVmd8x/W2NBDLgzkupH76SJ+ukR1w==} + engines: {node: '>=22.0.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint: '*' + typescript: '*' + + eslint-plugin-react-naming-convention@5.9.2: + resolution: {integrity: sha512-ODgENIpcxYoE4SjvlyA7loPVTjcphpU2Y2jehdRI6LZluxmtkUgKTJc8MAk/vSCJoKfWK6+kVu7oMqGAyW/wuQ==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + eslint-plugin-react-rsc@5.9.2: + resolution: {integrity: sha512-jb5nqTKn7ODscQWffvdUIy4qE+QJIL2tHY+7NlPFjfduPhnw2Daphx7qW0qfX5qSe1rcxQCBMDiEkS2/H6lgIA==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + eslint-plugin-react-web-api@5.9.2: + resolution: {integrity: sha512-uw/yBHdciPPsYEiuBABLfKYOtPaCBJmcKwxybEdKqIZFTCAweVlRqqucNulKEsWE1CnA5p6e25AyzUMB8xBgMw==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' + + eslint-plugin-react-x@5.9.2: + resolution: {integrity: sha512-aex/DzgcGdYF46LKShrTYVmZFWEd7lrX9PD85pADbTUmFpQoovGFQOK3nO6uqPUCrMuG97g/v66RyfzPBx0g5A==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: '*' + typescript: '*' eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} @@ -1769,10 +1729,6 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -1803,21 +1759,6 @@ 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==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-east-asian-width@1.5.0: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} @@ -1830,10 +1771,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -1848,10 +1785,6 @@ packages: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} 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'} @@ -1859,21 +1792,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.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'} @@ -1886,12 +1808,6 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1944,30 +1860,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - 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-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} @@ -1975,99 +1871,24 @@ packages: 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-core-module@2.16.1: - 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@5.1.0: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - 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-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2083,10 +1904,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -2114,11 +1931,6 @@ packages: canvas: optional: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2128,15 +1940,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2240,17 +2043,10 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2308,9 +2104,6 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2331,17 +2124,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} - - node-releases@2.0.37: - resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - object-code@2.0.0: resolution: {integrity: sha512-qOwMF43O/VAD51nJAB7MKsf1yWksql6O1i0DHRo1yaOQM6xJQH0NAE9UKJzYB7lyKw1jnpeb2BmB8qakjxiYZA==} @@ -2352,26 +2134,6 @@ packages: 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'} - - 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==} @@ -2390,10 +2152,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - oxc-parser@0.133.0: resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2430,9 +2188,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -2490,10 +2245,6 @@ packages: engines: {node: '>=18'} hasBin: true - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss@8.5.15: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} @@ -2527,9 +2278,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2564,9 +2312,6 @@ packages: peerDependencies: react: '*' - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -2615,14 +2360,6 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2637,11 +2374,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} - engines: {node: '>= 0.4'} - hasBin: true - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -2658,20 +2390,8 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} - engines: {node: '>=0.4'} - - 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'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} save-svg-as-png@1.4.17: resolution: {integrity: sha512-7QDaqJsVhdFPwviCxkgHiGm9omeaMBe1VKbHySWU6oFB2LtnGCcYS13eVoslUgq6VZC6Tjq/HddBd1K6p2PGpA==} @@ -2683,15 +2403,6 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} @@ -2705,18 +2416,6 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - 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==} @@ -2794,14 +2493,13 @@ packages: 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'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-ts@2.3.1: + resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -2810,25 +2508,6 @@ packages: resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} - 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'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -2845,10 +2524,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -2862,18 +2537,10 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.2.3: - resolution: {integrity: sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==} - engines: {node: '>=18'} - tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2914,6 +2581,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2929,22 +2599,6 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - 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'} - typescript-eslint@8.61.0: resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2961,10 +2615,6 @@ packages: resolution: {integrity: sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA==} engines: {node: '>=14'} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -2979,12 +2629,6 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3105,22 +2749,6 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - 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.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3157,9 +2785,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -3169,12 +2794,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -3208,97 +2827,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} - - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.29.2': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 '@babel/runtime@7.29.2': {} - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -3353,7 +2891,7 @@ snapshots: '@es-joy/jsdoccomment@0.87.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/types': 8.62.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -3367,6 +2905,93 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint-react/ast@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + string-ts: 2.3.1 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/core@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/eslint-plugin@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + eslint-plugin-react-dom: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-jsx: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-naming-convention: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-rsc: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-web-api: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-x: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/eslint@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/jsx@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/shared@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + '@eslint-react/var@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@eslint/compat@2.1.0(eslint@10.4.1(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 @@ -3775,8 +3400,6 @@ snapshots: '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} - '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} @@ -3825,8 +3448,17 @@ snapshots: '@typescript-eslint/project-service@8.61.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.62.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: @@ -3837,10 +3469,19 @@ snapshots: '@typescript-eslint/types': 8.61.0 '@typescript-eslint/visitor-keys': 8.61.0 + '@typescript-eslint/scope-manager@8.62.0': + dependencies: + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/visitor-keys': 8.62.0 + '@typescript-eslint/tsconfig-utils@8.61.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 + '@typescript-eslint/tsconfig-utils@8.62.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + '@typescript-eslint/type-utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.61.0 @@ -3853,10 +3494,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/type-utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/types@8.61.0': {} + '@typescript-eslint/types@8.62.0': {} + '@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.61.0(typescript@6.0.3) @@ -3872,6 +3525,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.62.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.62.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/visitor-keys': 8.62.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.4 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) @@ -3883,11 +3551,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.61.0': dependencies: '@typescript-eslint/types': 8.61.0 eslint-visitor-keys: 5.0.1 + '@typescript-eslint/visitor-keys@8.62.0': + dependencies: + '@typescript-eslint/types': 8.62.0 + eslint-visitor-keys: 5.0.1 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -4055,63 +3739,6 @@ snapshots: 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-includes@3.1.9: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - assertion-error@2.0.1: {} ast-v8-to-istanbul@1.0.0: @@ -4120,14 +3747,8 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - async-function@1.0.0: {} - asynckit@0.4.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - axios-cache-interceptor@1.12.0(axios@1.17.0): dependencies: axios: 1.17.0 @@ -4153,16 +3774,14 @@ snapshots: - debug - supports-color - balanced-match@1.0.2: {} - balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.20: {} - bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 + birecord@0.1.1: {} + body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -4177,23 +3796,10 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.14: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 - browserslist@4.28.2: - dependencies: - baseline-browser-mapping: 2.10.20 - caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.340 - node-releases: 2.0.37 - update-browserslist-db: 1.2.3(browserslist@4.28.2) - bytes@3.1.2: {} cache-parser@1.2.6: {} @@ -4203,20 +3809,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.9: - 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 - caniuse-lite@1.0.30001788: {} - chai@6.2.2: {} cli-cursor@5.0.0: @@ -4234,11 +3831,9 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comment-parser@1.4.6: {} - comment-parser@1.4.7: {} - concat-map@0.0.1: {} + compare-versions@6.1.1: {} content-disposition@1.1.0: {} @@ -4274,24 +3869,6 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - 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 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -4300,18 +3877,6 @@ snapshots: deep-is@0.1.4: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -4320,10 +3885,6 @@ snapshots: detect-libc@2.1.2: {} - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -4336,8 +3897,6 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.340: {} - emoji-name-map@2.0.3: {} emoji-regex@10.6.0: {} @@ -4353,86 +3912,10 @@ snapshots: environment@1.1.0: {} - es-abstract@1.24.2: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.9 - 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.3 - 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.4 - 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.20 - es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.3.2: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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 - math-intrinsics: 1.1.0 - es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: @@ -4446,18 +3929,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.3 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.3 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - escalade@3.2.0: {} - escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} @@ -4469,7 +3940,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)): + eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)): dependencies: debug: 4.4.3 eslint: 10.4.1(jiti@2.7.0) @@ -4477,28 +3948,28 @@ snapshots: get-tsconfig: 4.14.0 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)): dependencies: '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.58.2 - comment-parser: 1.4.6 + '@typescript-eslint/types': 8.62.0 + comment-parser: 1.4.7 debug: 4.4.3 eslint: 10.4.1(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.4 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -4522,43 +3993,104 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.1.1(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-react-dom@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + compare-versions: 6.1.1 eslint: 10.4.1(jiti@2.7.0) - hermes-parser: 0.25.1 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-react-jsx@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): 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.3.2 + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) - estraverse: 5.3.0 - hasown: 2.0.3 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 - 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.6 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-naming-convention@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-rsc@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-web-api@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + birecord: 0.1.1 + eslint: 10.4.1(jiti@2.7.0) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-x@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/type-utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + compare-versions: 6.1.1 + eslint: 10.4.1(jiti@2.7.0) + string-ts: 2.3.1 + ts-api-utils: 2.5.0(typescript@6.0.3) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -4577,7 +4109,7 @@ snapshots: '@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 ajv: 6.14.0 cross-spawn: 7.0.6 debug: 4.4.3 @@ -4709,10 +4241,6 @@ snapshots: follow-redirects@1.16.0: {} - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -4737,21 +4265,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.3 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - generator-function@2.0.1: {} - - gensync@1.0.0-beta.2: {} - get-east-asian-width@1.5.0: {} get-intrinsic@1.3.0: @@ -4772,12 +4285,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -4790,27 +4297,12 @@ snapshots: globals@17.6.0: {} - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} - has-bigints@1.1.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: @@ -4821,12 +4313,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.15.0 @@ -4872,136 +4358,28 @@ snapshots: inherits@2.0.4: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 - ipaddr.js@1.9.1: {} - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - 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-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-buffer@2.0.5: {} is-bun-module@2.0.0: dependencies: semver: 7.8.4 - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.3 - - 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@5.1.0: dependencies: get-east-asian-width: 1.5.0 - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - 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-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-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.3 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - 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-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.20 - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - isarray@2.0.5: {} - isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -5017,15 +4395,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.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 - jiti@2.7.0: {} js-tokens@10.0.0: {} @@ -5064,23 +4433,12 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - jsesc@3.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - json5@2.2.3: {} - - 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 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -5096,7 +4454,7 @@ snapshots: picomatch: 4.0.4 smol-toml: 1.6.1 strip-json-comments: 5.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unbash: 3.0.0 yaml: 2.9.0 zod: 4.3.6 @@ -5184,16 +4542,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lru-cache@11.3.5: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lz-string@1.5.0: {} magic-string@0.30.21: @@ -5238,10 +4588,6 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.14 - ms@2.1.3: {} nanoid@3.3.12: {} @@ -5252,55 +4598,12 @@ snapshots: negotiator@1.0.0: {} - node-exports-info@1.6.0: - dependencies: - array.prototype.flatmap: 1.3.3 - es-errors: 1.3.0 - object.entries: 1.1.9 - semver: 6.3.1 - - node-releases@2.0.37: {} - - object-assign@4.1.1: {} - object-code@2.0.0: {} object-deep-merge@2.0.1: {} object-inspect@1.13.4: {} - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.9 - 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.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.1 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - obug@2.1.1: {} on-finished@2.4.1: @@ -5324,12 +4627,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - oxc-parser@0.133.0: dependencies: '@oxc-project/types': 0.133.0 @@ -5401,8 +4698,6 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} - path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -5454,8 +4749,6 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - possible-typed-array-names@1.1.0: {} - postcss@8.5.15: dependencies: nanoid: 3.3.12 @@ -5482,12 +4775,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -5519,8 +4806,6 @@ snapshots: dependencies: react: 19.2.7 - react-is@16.13.1: {} - react-is@17.0.2: {} react-loading-skeleton@3.5.0(react@19.2.7): @@ -5560,26 +4845,6 @@ snapshots: redux@5.0.1: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.9 - 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 - require-from-string@2.0.2: {} reselect@5.1.1: {} @@ -5588,15 +4853,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@2.0.0-next.6: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 - object-keys: 1.1.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -5635,25 +4891,6 @@ snapshots: transitivePeerDependencies: - supports-color - safe-array-concat@1.1.4: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - 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 - safer-buffer@2.1.2: {} save-svg-as-png@1.4.17: {} @@ -5664,10 +4901,6 @@ snapshots: scheduler@0.27.0: {} - semver@6.3.1: {} - - semver@7.7.4: {} - semver@7.8.4: {} send@1.2.1: @@ -5695,28 +4928,6 @@ snapshots: transitivePeerDependencies: - supports-color - 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 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - setprototypeof@1.2.0: {} shebang-command@2.0.0: @@ -5790,13 +5001,10 @@ snapshots: std-env@4.1.0: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - string-argv@0.3.2: {} + string-ts@2.3.1: {} + string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -5808,50 +5016,6 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - 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.2 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.9 - 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.9 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -5866,8 +5030,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} tailwindcss@4.3.0: {} @@ -5876,15 +5038,8 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.2.3: {} - tinyexec@1.2.4: {} - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -5919,6 +5074,8 @@ snapshots: dependencies: typescript: 6.0.3 + ts-pattern@5.9.0: {} + tslib@2.8.1: optional: true @@ -5941,39 +5098,6 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - 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.9 - 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.9 - 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.9 - 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 - typescript-eslint@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) @@ -5989,13 +5113,6 @@ snapshots: unbash@3.0.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 - undici-types@7.18.2: {} undici@7.25.0: {} @@ -6026,12 +5143,6 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.2.3(browserslist@4.28.2): - dependencies: - browserslist: 4.28.2 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -6074,8 +5185,8 @@ snapshots: picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.2.3 - tinyglobby: 0.2.16 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 @@ -6104,47 +5215,6 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - 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.2 - 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.20 - - 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.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.9 - 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@2.0.2: dependencies: isexe: 2.0.0 @@ -6176,14 +5246,8 @@ snapshots: xtend@4.0.2: {} - yallist@3.1.1: {} - yaml@2.9.0: {} yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.3.6): - dependencies: - zod: 4.3.6 - zod@4.3.6: {} From ed9d28497333dd588c9969d70e8307436cf046f5 Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Sun, 5 Jul 2026 09:48:23 +0200 Subject: [PATCH 03/26] feat(frontend): build card URLs with a typed per-card builder (#328) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Card URLs were built by hand-concatenating paths and query strings in several places. This replaces that with a typed, immutable per-card URL builder (`cardUrl(cardType)`), so URLs are assembled in one place with proper encoding. ## Changes - New `models/CardUrl.ts`: one builder per card type, exposing only the params that card supports. `URLSearchParams` handles joining + encoding. Also carries a per-card `filename()` for downloads. - `getFullSuffix.ts` ➡️ `buildCardUrl.ts`: returns a builder instead of a string. - The builder is passed as a prop through all card components; no hand-written `?`/`&` concatenation left. - New `useCardDescriptor` hook resolves per-card display metadata (guest hint + link) and owns the Gist URL fetch, replacing the repeated `switch (selectedCard)` blocks in `Home`. - Added tests for `CardUrl`. ### Notes - Params now go through `URLSearchParams`, so commas become `%2C` and spaces `%20`. The server decodes these before use, so rendered cards are unchanged. - Builders are `useMemo`'d in `Home` to keep stable references. --------- Co-authored-by: martin-mfg <2026226+martin-mfg@users.noreply.github.com> --- apps/frontend/src/components/Card/Card.tsx | 8 +- .../src/components/Card/CardImage.tsx | 8 +- apps/frontend/src/models/CardUrl.test.ts | 77 +++++ apps/frontend/src/models/CardUrl.ts | 275 ++++++++++++++++++ apps/frontend/src/pages/Home/Home.tsx | 198 ++++++------- ...ullSuffix.test.ts => buildCardUrl.test.ts} | 35 +-- apps/frontend/src/pages/Home/buildCardUrl.ts | 181 ++++++++++++ apps/frontend/src/pages/Home/getFullSuffix.ts | 173 ----------- .../src/pages/Home/stages/Customize.tsx | 7 +- .../src/pages/Home/stages/Display.tsx | 11 +- .../Home/stages/Login/LoginBoxDemoCards.tsx | 70 ++--- .../src/pages/Home/stages/SelectCard.tsx | 65 +++-- apps/frontend/src/pages/Home/stages/Theme.tsx | 7 +- .../src/pages/Home/useCardDescriptor.ts | 89 ++++++ 14 files changed, 818 insertions(+), 386 deletions(-) create mode 100644 apps/frontend/src/models/CardUrl.test.ts create mode 100644 apps/frontend/src/models/CardUrl.ts rename apps/frontend/src/pages/Home/{getFullSuffix.test.ts => buildCardUrl.test.ts} (73%) create mode 100644 apps/frontend/src/pages/Home/buildCardUrl.ts delete mode 100644 apps/frontend/src/pages/Home/getFullSuffix.ts create mode 100644 apps/frontend/src/pages/Home/useCardDescriptor.ts diff --git a/apps/frontend/src/components/Card/Card.tsx b/apps/frontend/src/components/Card/Card.tsx index b5f35c5c11d65..17f8fb3118d44 100644 --- a/apps/frontend/src/components/Card/Card.tsx +++ b/apps/frontend/src/components/Card/Card.tsx @@ -1,13 +1,15 @@ import { clsx } from "clsx"; import type { CSSProperties, JSX } from "react"; +import type { CardUrlBuilder } from "../../models/CardUrl"; + import { CardImage } from "./CardImage"; import { LIGHT_CARD_BG } from "./themeBackdrop"; interface CardProps { title: string; description: string; - imageSrc: string; + card: CardUrlBuilder; stage: number; selected?: boolean; compact?: boolean; @@ -21,7 +23,7 @@ interface CardProps { export const Card = ({ title, description, - imageSrc, + card, stage, selected = false, compact = false, @@ -68,7 +70,7 @@ export const Card = ({

{description}

{ - const fullImageSrc = `https://${HOST}/api${imageSrc}&client=wizard`; + // `client=wizard` marks requests coming from the wizard preview. + const fullImageSrc = card.client("wizard").toApiUrl(HOST); return (
diff --git a/apps/frontend/src/models/CardUrl.test.ts b/apps/frontend/src/models/CardUrl.test.ts new file mode 100644 index 0000000000000..36238b4effaa5 --- /dev/null +++ b/apps/frontend/src/models/CardUrl.test.ts @@ -0,0 +1,77 @@ +import { describe, expect, it } from "vitest"; + +import { CardType } from "./CardType"; +import { cardUrl } from "./CardUrl"; + +describe("cardUrl", () => { + it("maps each card type to its path", () => { + expect(cardUrl(CardType.STATS).toString()).toBe(""); + expect(cardUrl(CardType.TOP_LANGS).toString()).toBe("/top-langs"); + expect(cardUrl(CardType.PIN).toString()).toBe("/pin"); + expect(cardUrl(CardType.GIST).toString()).toBe("/gist"); + expect(cardUrl(CardType.WAKATIME).toString()).toBe("/wakatime"); + }); + + it("builds a suffix with params", () => { + expect( + cardUrl(CardType.TOP_LANGS).username("john").langsCount(4).toString(), + ).toBe("/top-langs?username=john&langs_count=4"); + }); + + it("derives a download filename per card", () => { + expect(cardUrl(CardType.STATS).username("john").filename()).toBe( + "john_card", + ); + expect(cardUrl(CardType.TOP_LANGS).username("john").filename()).toBe( + "john_card", + ); + expect(cardUrl(CardType.PIN).repo("owner/repo1").filename()).toBe( + "owner/repo1_card", + ); + expect(cardUrl(CardType.GIST).gistId("abc").filename()).toBe("gist_card"); + expect(cardUrl(CardType.WAKATIME).username("waka").filename()).toBe( + "waka_card", + ); + }); + + it("is immutable: setters return new instances", () => { + const base = cardUrl(CardType.STATS).username("john"); + const withIcons = base.showIcons(); + + expect(base.toString()).toBe("?username=john"); + expect(withIcons.toString()).toBe("?username=john&show_icons=true"); + }); + + it("sets values verbatim (callers decide whether to include a param)", () => { + // no dropping of empty/false — the value is set as given + expect(cardUrl(CardType.STATS).username("").toString()).toBe("?username="); + }); + + it("encodes special characters", () => { + // spaces as %20 (not +), commas as %2C + expect( + cardUrl(CardType.STATS) + .username("john") + .customTitle("My Stats") + .toString(), + ).toBe("?username=john&custom_title=My%20Stats"); + expect( + cardUrl(CardType.STATS).username("john").show("a,b,c").toString(), + ).toBe("?username=john&show=a%2Cb%2Cc"); + }); + + it("builds an absolute api url with the given host", () => { + expect( + cardUrl(CardType.STATS) + .username("john") + .client("wizard") + .toApiUrl("example.com"), + ).toBe("https://example.com/api?username=john&client=wizard"); + }); + + it("applies a theme via the universal setter", () => { + expect( + cardUrl(CardType.STATS).username("john").theme("github_dark").toString(), + ).toBe("?username=john&theme=github_dark"); + }); +}); diff --git a/apps/frontend/src/models/CardUrl.ts b/apps/frontend/src/models/CardUrl.ts new file mode 100644 index 0000000000000..3b5fc4073cedf --- /dev/null +++ b/apps/frontend/src/models/CardUrl.ts @@ -0,0 +1,275 @@ +import { CardType } from "./CardType"; + +/** + * Immutable, per-card builders for the query-string suffix of a card URL. + * + * Each card type accepts a different set of query params, so there is one + * builder class per card exposing only the params that card supports. Setters + * return a new instance (immutable); {@link CardUrlBase.toString} produces the + * relative suffix (e.g. `/top-langs?username=foo&langs_count=4`). + * + * Which card accepts which param: + * + * | param | STATS | TOP_LANGS | PIN | GIST | WAKATIME | + * | ----------------------- | :---: | :-------: | :-: | :--: | :------: | + * | username | ✓ | ✓ | ✓ | | ✓ | + * | hide_title | ✓ | ✓ | | | ✓ | + * | custom_title | ✓ | | | | ✓ | + * | rank_icon | ✓ | | | | | + * | show | ✓ | | | | | + * | show_icons | ✓ | | | | | + * | include_all_commits | ✓ | | | | | + * | hide_values | | ✓ | | | | + * | layout | | ✓ | | | ✓ | + * | langs_count | | ✓ | | | ✓ | + * | repo | | | ✓ | | | + * | description_lines_count | | | ✓ | | | + * | show_owner | | | ✓ | ✓ | | + * | id (gist) | | | | ✓ | | + * | display_format | | | | | ✓ | + * | card_width | | | | | ✓ | + * | theme | ✓ | ✓ | ✓ | ✓ | ✓ | + * | client | ✓ | ✓ | ✓ | ✓ | ✓ | + * | disable_animations | ✓ | ✓ | ✓ | ✓ | ✓ | + */ +abstract class CardUrlBase> { + protected constructor( + protected readonly params: ReadonlyMap, + ) {} + + /** Build a new instance of the concrete card builder. */ + protected abstract create(params: ReadonlyMap): S; + + /** Path segment appended after `/api` (empty for the stats card). */ + protected abstract readonly path: string; + + /** + * The single place that produces a new instance. Sets the param verbatim; + * callers decide whether a param should be included (see `buildCardUrl`). + */ + protected with(key: string, value: string | number | boolean): S { + const next = new Map(this.params); + next.set(key, String(value)); + return this.create(next); + } + + // ---- universal setters (valid on every card) ---- + theme(v: string): S { + return this.with("theme", v); + } + client(v: string): S { + return this.with("client", v); + } + disableAnimations(v = true): S { + return this.with("disable_animations", v); + } + + /** Suggested download filename (without extension) for this card. */ + abstract filename(): string; + + /** Relative suffix, e.g. `/top-langs?username=foo&langs_count=4`. */ + toString(): string { + const search = new URLSearchParams(); + for (const [k, v] of this.params) { + search.set(k, v); + } + // URLSearchParams encodes spaces as `+`; normalize to `%20` for parity with + // encodeURIComponent and universal query parsing. + const qs = search.toString().replace(/\+/g, "%20"); + return `${this.path}${qs ? `?${qs}` : ""}`; + } + + /** + * Absolute URL the ``/SvgInline loads. `host` is passed in so this + * module stays free of the `window`-dependent constants. + */ + toApiUrl(host: string): string { + return `https://${host}/api${this.toString()}`; + } +} + +class StatsCardUrl extends CardUrlBase { + protected readonly path = ""; + protected create(p: ReadonlyMap) { + return new StatsCardUrl(p); + } + static create() { + return new StatsCardUrl(new Map()); + } + + filename() { + return `${this.params.get("username") ?? ""}_card`; + } + + username(v: string) { + return this.with("username", v); + } + rankIcon(v: string) { + return this.with("rank_icon", v); + } + hideTitle(v = true) { + return this.with("hide_title", v); + } + customTitle(v: string) { + return this.with("custom_title", v); + } + show(v: string) { + return this.with("show", v); + } + showIcons(v = true) { + return this.with("show_icons", v); + } + includeAllCommits(v = true) { + return this.with("include_all_commits", v); + } +} + +class TopLangsCardUrl extends CardUrlBase { + protected readonly path = "/top-langs"; + protected create(p: ReadonlyMap) { + return new TopLangsCardUrl(p); + } + static create() { + return new TopLangsCardUrl(new Map()); + } + + filename() { + return `${this.params.get("username") ?? ""}_card`; + } + + username(v: string) { + return this.with("username", v); + } + layout(v: string) { + return this.with("layout", v); + } + hideTitle(v = true) { + return this.with("hide_title", v); + } + langsCount(v: number) { + return this.with("langs_count", v); + } + hideValues(v = true) { + return this.with("hide_values", v); + } +} + +class PinCardUrl extends CardUrlBase { + protected readonly path = "/pin"; + protected create(p: ReadonlyMap) { + return new PinCardUrl(p); + } + static create() { + return new PinCardUrl(new Map()); + } + + filename() { + return `${this.params.get("repo") ?? ""}_card`; + } + + username(v: string) { + return this.with("username", v); + } + repo(v: string) { + return this.with("repo", v); + } + showOwner(v = true) { + return this.with("show_owner", v); + } + descriptionLines(v: number) { + return this.with("description_lines_count", v); + } +} + +class GistCardUrl extends CardUrlBase { + protected readonly path = "/gist"; + protected create(p: ReadonlyMap) { + return new GistCardUrl(p); + } + static create() { + return new GistCardUrl(new Map()); + } + + filename() { + return "gist_card"; + } + + gistId(v: string) { + return this.with("id", v); + } + showOwner(v = true) { + return this.with("show_owner", v); + } +} + +class WakatimeCardUrl extends CardUrlBase { + protected readonly path = "/wakatime"; + protected create(p: ReadonlyMap) { + return new WakatimeCardUrl(p); + } + static create() { + return new WakatimeCardUrl(new Map()); + } + + filename() { + return `${this.params.get("username") ?? ""}_card`; + } + + username(v: string) { + return this.with("username", v); + } + layout(v: string) { + return this.with("layout", v); + } + hideTitle(v = true) { + return this.with("hide_title", v); + } + customTitle(v: string) { + return this.with("custom_title", v); + } + langsCount(v: number) { + return this.with("langs_count", v); + } + displayFormat(v: string) { + return this.with("display_format", v); + } + cardWidth(v: number) { + return this.with("card_width", v); + } +} + +/** Any card-URL builder, regardless of card type (all share the universal API). */ +export type CardUrlBuilder = + | StatsCardUrl + | TopLangsCardUrl + | PinCardUrl + | GistCardUrl + | WakatimeCardUrl; + +/** + * Create a card-URL builder typed to the given card, so only the params that + * card supports are in scope (e.g. `cardUrl(CardType.GIST)` has no + * `langsCount`). + */ +export function cardUrl(c: typeof CardType.STATS): StatsCardUrl; +export function cardUrl(c: typeof CardType.TOP_LANGS): TopLangsCardUrl; +export function cardUrl(c: typeof CardType.PIN): PinCardUrl; +export function cardUrl(c: typeof CardType.GIST): GistCardUrl; +export function cardUrl(c: typeof CardType.WAKATIME): WakatimeCardUrl; +export function cardUrl(c: CardType) { + switch (c) { + case CardType.STATS: + return StatsCardUrl.create(); + case CardType.TOP_LANGS: + return TopLangsCardUrl.create(); + case CardType.PIN: + return PinCardUrl.create(); + case CardType.GIST: + return GistCardUrl.create(); + case CardType.WAKATIME: + return WakatimeCardUrl.create(); + default: + c satisfies never; + throw new Error(`unknown card type: ${c as string}`); + } +} diff --git a/apps/frontend/src/pages/Home/Home.tsx b/apps/frontend/src/pages/Home/Home.tsx index 75bb3c7ba6de3..b475fa2b69c59 100644 --- a/apps/frontend/src/pages/Home/Home.tsx +++ b/apps/frontend/src/pages/Home/Home.tsx @@ -1,4 +1,3 @@ -import axios from "axios"; import { useEffect, useMemo, useRef, useState } from "react"; import type { JSX } from "react"; import { useDispatch } from "react-redux"; @@ -27,12 +26,13 @@ import { } from "../../redux/selectors/userSelectors"; import { login } from "../../redux/slices/user"; -import { getFullSuffix } from "./getFullSuffix"; +import { buildCardUrl } from "./buildCardUrl"; import { CustomizeStage } from "./stages/Customize"; import { DisplayStage } from "./stages/Display"; import { LoginStage } from "./stages/Login/Login"; import { SelectCardStage } from "./stages/SelectCard"; import { ThemeStage } from "./stages/Theme"; +import { useCardDescriptor } from "./useCardDescriptor"; interface HomeScreenProps { stage: StageIndex; @@ -90,7 +90,6 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { const [usePercent, setUsePercent] = useState(false); const { isDark } = useTheme(); - const themeParam = isDark ? "&theme=github_dark" : ""; const [theme, setTheme] = useState(isDark ? "dark" : "default"); const handleCardTypeChange = (cardType: CardType) => { @@ -115,77 +114,84 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { setStage(2); }; - const fullSuffix = getFullSuffix({ - userId, - selectedCard, - selectedUserId, - repo, - gist, - wakatimeUser, - selectedStatsRank, - selectedLanguagesLayout, - selectedWakatimeLayout, - showTitle, - showOwner, - descriptionLines, - customTitle, - langsCount, - hideValues, - showAllStats, - showIcons, - includeAllCommits, - enableAnimations, - usePercent, - }); + // Memoized so the builder keeps a stable reference across renders when its + // inputs are unchanged. Card components consume it by value (they derive a URL + // string), but memoizing keeps it safe to pass as a prop if any of them are + // ever wrapped in React.memo. + const cardBuilder = useMemo( + () => + buildCardUrl({ + userId, + selectedCard, + selectedUserId, + repo, + gist, + wakatimeUser, + selectedStatsRank, + selectedLanguagesLayout, + selectedWakatimeLayout, + showTitle, + showOwner, + descriptionLines, + customTitle, + langsCount, + hideValues, + showAllStats, + showIcons, + includeAllCommits, + enableAnimations, + usePercent, + }), + [ + userId, + selectedCard, + selectedUserId, + repo, + gist, + wakatimeUser, + selectedStatsRank, + selectedLanguagesLayout, + selectedWakatimeLayout, + showTitle, + showOwner, + descriptionLines, + customTitle, + langsCount, + hideValues, + showAllStats, + showIcons, + includeAllCommits, + enableAnimations, + usePercent, + ], + ); - // for stage four - let themeSuffix = fullSuffix; + // Preview builder for the customize stage, dark-themed to match the surroundings. + const customizeCardBuilder = useMemo( + () => (isDark ? cardBuilder.theme("github_dark") : cardBuilder), + [cardBuilder, isDark], + ); - if ( - !( - (theme === "default" && - [CardType.STATS, CardType.TOP_LANGS, CardType.WAKATIME].includes( - selectedCard as never, - )) || - (theme === "default_repocard" && - [CardType.PIN, CardType.GIST].includes(selectedCard as never)) - ) - ) { - themeSuffix += `&theme=${theme}`; - } + // for stage four + const isRepoCard = + selectedCard === CardType.PIN || selectedCard === CardType.GIST; + const defaultTheme = isRepoCard ? "default_repocard" : "default"; + const isDefaultTheme = theme === defaultTheme; + + const themeBuilder = useMemo( + () => (isDefaultTheme ? cardBuilder : cardBuilder.theme(theme)), + [cardBuilder, isDefaultTheme, theme], + ); // for stage five - const [gistUrl, setGistUrl] = useState(""); - - const guestHint = useMemo(() => { - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - return `username "${DEMO_USER}"`; - case CardType.PIN: - return `repo "${DEMO_REPO}"`; - case CardType.GIST: - return `Gist ID "${DEMO_GIST}"`; - case CardType.WAKATIME: - return `WakaTime username "${DEMO_WAKATIME_USER}"`; - default: - selectedCard satisfies never; - return ""; - } - }, [selectedCard]); - - useEffect(() => { - async function fetchGistURL() { - try { - const fullUrl = `https://api.github.com/gists/${gist}`; - const result = await axios.get<{ html_url: string }>(fullUrl); - setGistUrl(result.data.html_url); - } catch (error) { - console.error(error); - } - } - void fetchGistURL(); - }, [gist]); + const cardDescriptor = useCardDescriptor({ + selectedCard, + themeBuilder, + repo, + userId, + wakatimeUser, + gist, + }); const contentSectionRef = useRef(null); @@ -237,46 +243,6 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { ); } - const cardFilename = ((): string => { - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - return `${selectedUserId}_card`; - case CardType.PIN: - return `${repo}_card`; - case CardType.GIST: - return `gist_card`; - case CardType.WAKATIME: - return `${wakatimeUser}_card`; - default: - selectedCard satisfies never; - return ""; - } - })(); - - const cardLink = ((): string => { - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - return `https://${HOST}/api${themeSuffix}`; - - case CardType.PIN: { - let myRepo = repo; - if (!myRepo.includes("/")) { - myRepo = `${userId}/${myRepo}`; - } - return `https://github.com/${myRepo}`; - } - case CardType.GIST: - return gistUrl; - case CardType.WAKATIME: - return `https://wakatime.com/@${wakatimeUser}`; - default: - selectedCard satisfies never; - return ""; - } - })(); - return (
)} {stage === 3 && ( { setTheme(theme); @@ -395,14 +361,14 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { )} {stage === 4 && ( )} diff --git a/apps/frontend/src/pages/Home/getFullSuffix.test.ts b/apps/frontend/src/pages/Home/buildCardUrl.test.ts similarity index 73% rename from apps/frontend/src/pages/Home/getFullSuffix.test.ts rename to apps/frontend/src/pages/Home/buildCardUrl.test.ts index 5351cb9fb858c..2f36b4ad0c979 100644 --- a/apps/frontend/src/pages/Home/getFullSuffix.test.ts +++ b/apps/frontend/src/pages/Home/buildCardUrl.test.ts @@ -5,7 +5,7 @@ import { DEFAULT_OPTION as STATS_DEFAULT_RANK } from "../../components/Home/Stat import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home/WakatimeLayoutSection"; import { CardType } from "../../models/CardType"; -import { getFullSuffix } from "./getFullSuffix"; +import { buildCardUrl } from "./buildCardUrl"; const baseOptions = { selectedCard: CardType.STATS, @@ -30,15 +30,15 @@ const baseOptions = { usePercent: false, }; -describe("getFullSuffix", () => { +describe("buildCardUrl", () => { it("builds stats suffix with defaults", () => { - const result = getFullSuffix(baseOptions); + const result = buildCardUrl(baseOptions); - expect(result).toBe("?username=john"); + expect(result.toString()).toBe("?username=john"); }); it("adds stats options", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, showIcons: true, includeAllCommits: true, @@ -46,53 +46,54 @@ describe("getFullSuffix", () => { showTitle: false, }); - expect(result).toBe( + expect(result.toString()).toBe( "?username=john" + "&hide_title=true" + - "&show=reviews,discussions_started,discussions_answered,prs_merged,prs_merged_percentage,prs_commented,prs_reviewed,issues_commented" + + // commas are percent-encoded (%2C) now that params go through URLSearchParams + "&show=reviews%2Cdiscussions_started%2Cdiscussions_answered%2Cprs_merged%2Cprs_merged_percentage%2Cprs_commented%2Cprs_reviewed%2Cissues_commented" + "&show_icons=true" + "&include_all_commits=true", ); }); it("builds top-langs suffix", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, selectedCard: CardType.TOP_LANGS, langsCount: 5, showTitle: false, }); - expect(result).toBe( + expect(result.toString()).toBe( "/top-langs?username=john&hide_title=true&langs_count=5", ); }); it("builds pin suffix using userId not selectedUserId", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, selectedCard: CardType.PIN, showOwner: true, descriptionLines: 3, }); - expect(result).toBe( + expect(result.toString()).toBe( "/pin?username=john-github&repo=repo1&show_owner=true&description_lines_count=3", ); }); it("builds gist suffix", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, selectedCard: CardType.GIST, showOwner: true, }); - expect(result).toBe("/gist?id=gist1&show_owner=true"); + expect(result.toString()).toBe("/gist?id=gist1&show_owner=true"); }); it("builds wakatime suffix with percent and custom title", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, selectedCard: CardType.WAKATIME, wakatimeUser: "waka", @@ -101,18 +102,18 @@ describe("getFullSuffix", () => { showTitle: false, }); - expect(result).toBe( + expect(result.toString()).toBe( "/wakatime?username=waka&hide_title=true&custom_title=My%20Stats&display_format=percent", ); }); it("adds non-default layouts", () => { - const result = getFullSuffix({ + const result = buildCardUrl({ ...baseOptions, selectedCard: CardType.TOP_LANGS, selectedLanguagesLayout: { id: 2, value: "compact", label: "Compact" }, }); - expect(result).toBe("/top-langs?username=john&layout=compact"); + expect(result.toString()).toBe("/top-langs?username=john&layout=compact"); }); }); diff --git a/apps/frontend/src/pages/Home/buildCardUrl.ts b/apps/frontend/src/pages/Home/buildCardUrl.ts new file mode 100644 index 0000000000000..b129930c71547 --- /dev/null +++ b/apps/frontend/src/pages/Home/buildCardUrl.ts @@ -0,0 +1,181 @@ +import type { SelectOption } from "../../components/Generic/Select"; +import { DEFAULT_OPTION as LANGUAGES_DEFAULT_LAYOUT } from "../../components/Home/LanguagesLayoutSection"; +import { DEFAULT_OPTION as STATS_DEFAULT_RANK } from "../../components/Home/StatsRankSection"; +import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home/WakatimeLayoutSection"; +import { CardType } from "../../models/CardType"; +import { cardUrl } from "../../models/CardUrl"; +import type { CardUrlBuilder } from "../../models/CardUrl"; + +interface Options { + userId: string; + selectedUserId: string; + selectedCard: CardType; + repo: string; + gist: string; + wakatimeUser: string; + selectedStatsRank: SelectOption; + selectedLanguagesLayout: SelectOption; + selectedWakatimeLayout: SelectOption; + showTitle: boolean; + showOwner: boolean; + descriptionLines: number | undefined; + customTitle: string; + langsCount: number | undefined; + hideValues: boolean; + showAllStats: boolean; + showIcons: boolean; + includeAllCommits: boolean; + enableAnimations: boolean; + usePercent: boolean; +} + +export function buildCardUrl({ + userId, + selectedCard, + selectedUserId, + repo, + gist, + wakatimeUser, + selectedStatsRank, + selectedLanguagesLayout, + selectedWakatimeLayout, + showTitle, + showOwner, + descriptionLines, + customTitle, + langsCount, + hideValues, + showAllStats, + showIcons, + includeAllCommits, + enableAnimations, + usePercent, +}: Options): CardUrlBuilder { + switch (selectedCard) { + case CardType.STATS: { + let url = cardUrl(CardType.STATS); + if (selectedUserId) { + url = url.username(selectedUserId); + } + if (selectedStatsRank !== STATS_DEFAULT_RANK) { + url = url.rankIcon(selectedStatsRank.value); + } + if (!showTitle) { + url = url.hideTitle(); + } + if (customTitle) { + url = url.customTitle(customTitle); + } + if (showAllStats) { + url = url.show( + "reviews,discussions_started,discussions_answered,prs_merged,prs_merged_percentage,prs_commented,prs_reviewed,issues_commented", + ); + } + if (showIcons) { + url = url.showIcons(); + } + if (includeAllCommits) { + url = url.includeAllCommits(); + } + if (!enableAnimations) { + url = url.disableAnimations(); + } + return url; + } + + case CardType.TOP_LANGS: { + let url = cardUrl(CardType.TOP_LANGS); + if (selectedUserId) { + url = url.username(selectedUserId); + } + if (selectedLanguagesLayout !== LANGUAGES_DEFAULT_LAYOUT) { + url = url.layout(selectedLanguagesLayout.value); + } + if (!showTitle) { + url = url.hideTitle(); + } + if (langsCount) { + url = url.langsCount(langsCount); + } + if (hideValues) { + url = url.hideValues(); + } + if (!enableAnimations) { + url = url.disableAnimations(); + } + return url; + } + + case CardType.PIN: { + /** + * We should use the name of the logged-in user, not the value entered in the + * username field in step 3. + * + * This input is not shown when the PIN card type is selected, + * but it may still contain a different value if the user previously chose another card type. + * + * For example, + * 1. the user could select the STATS card + * 2. enter a username + * 3. then go back and switch to the PIN card, leaving the old value behind. + * + * @see https://github.com/stats-organization/github-stats-extended/pull/73#discussion_r2792177515 + */ + let url = cardUrl(CardType.PIN); + if (userId) { + url = url.username(userId); + } + if (repo) { + url = url.repo(repo); + } + if (showOwner) { + url = url.showOwner(); + } + if (descriptionLines) { + url = url.descriptionLines(descriptionLines); + } + return url; + } + + case CardType.GIST: { + let url = cardUrl(CardType.GIST); + if (gist) { + url = url.gistId(gist); + } + if (showOwner) { + url = url.showOwner(); + } + return url; + } + + case CardType.WAKATIME: { + let url = cardUrl(CardType.WAKATIME); + if (wakatimeUser) { + url = url.username(wakatimeUser); + } + if (selectedWakatimeLayout !== WAKATIME_DEFAULT_LAYOUT) { + url = url.layout(selectedWakatimeLayout.value); + } + if (!showTitle) { + url = url.hideTitle(); + } + if (customTitle) { + url = url.customTitle(customTitle); + } + if (langsCount) { + url = url.langsCount(langsCount); + } + if (!enableAnimations) { + url = url.disableAnimations(); + } + if (usePercent) { + url = url.displayFormat("percent"); + } + return url; + } + + default: + selectedCard satisfies never; + throw new Error(`unknown card type: ${selectedCard as string}`); + } +} diff --git a/apps/frontend/src/pages/Home/getFullSuffix.ts b/apps/frontend/src/pages/Home/getFullSuffix.ts deleted file mode 100644 index e6dc776d7f199..0000000000000 --- a/apps/frontend/src/pages/Home/getFullSuffix.ts +++ /dev/null @@ -1,173 +0,0 @@ -import type { SelectOption } from "../../components/Generic/Select"; -import { DEFAULT_OPTION as LANGUAGES_DEFAULT_LAYOUT } from "../../components/Home/LanguagesLayoutSection"; -import { DEFAULT_OPTION as STATS_DEFAULT_RANK } from "../../components/Home/StatsRankSection"; -import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home/WakatimeLayoutSection"; -import { CardType } from "../../models/CardType"; - -interface Options { - userId: string; - selectedUserId: string; - selectedCard: CardType; - repo: string; - gist: string; - wakatimeUser: string; - selectedStatsRank: SelectOption; - selectedLanguagesLayout: SelectOption; - selectedWakatimeLayout: SelectOption; - showTitle: boolean; - showOwner: boolean; - descriptionLines: number | undefined; - customTitle: string; - langsCount: number | undefined; - hideValues: boolean; - showAllStats: boolean; - showIcons: boolean; - includeAllCommits: boolean; - enableAnimations: boolean; - usePercent: boolean; -} - -export function getFullSuffix({ - userId, - selectedCard, - selectedUserId, - repo, - gist, - wakatimeUser, - selectedStatsRank, - selectedLanguagesLayout, - selectedWakatimeLayout, - showTitle, - showOwner, - descriptionLines, - customTitle, - langsCount, - hideValues, - showAllStats, - showIcons, - includeAllCommits, - enableAnimations, - usePercent, -}: Options): string { - let fullSuffix = `${selectedCard === CardType.STATS ? "" : "/" + selectedCard}?`; - - switch (selectedCard) { - case CardType.STATS: - case CardType.TOP_LANGS: - fullSuffix += `username=${selectedUserId}`; - break; - case CardType.PIN: - /** - * We should use the name of the logged-in user, not the value entered in the - * username field in step 3. - * - * This input is not shown when the PIN card type is selected, - * but it may still contain a different value if the user previously chose another card type. - * - * For example, - * 1. the user could select the STATS card - * 2. enter a username - * 3. then go back and switch to the PIN card, leaving the old value behind. - * - * @see https://github.com/stats-organization/github-stats-extended/pull/73#discussion_r2792177515 - */ - fullSuffix += `username=${userId}&repo=${repo}`; - break; - case CardType.GIST: - fullSuffix += `id=${gist}`; - break; - case CardType.WAKATIME: - fullSuffix += `username=${wakatimeUser}`; - break; - - default: - selectedCard satisfies never; - } - - if ( - selectedStatsRank !== STATS_DEFAULT_RANK && - selectedCard === CardType.STATS - ) { - fullSuffix += `&rank_icon=${selectedStatsRank.value}`; - } - - if ( - selectedLanguagesLayout !== LANGUAGES_DEFAULT_LAYOUT && - selectedCard === CardType.TOP_LANGS - ) { - fullSuffix += `&layout=${selectedLanguagesLayout.value}`; - } - - if ( - selectedWakatimeLayout !== WAKATIME_DEFAULT_LAYOUT && - selectedCard === CardType.WAKATIME - ) { - fullSuffix += `&layout=${selectedWakatimeLayout.value}`; - } - - if ( - !showTitle && - (selectedCard === CardType.STATS || - selectedCard === CardType.TOP_LANGS || - selectedCard === CardType.WAKATIME) - ) { - fullSuffix += "&hide_title=true"; - } - - if ( - showOwner && - (selectedCard === CardType.PIN || selectedCard === CardType.GIST) - ) { - fullSuffix += "&show_owner=true"; - } - - if (descriptionLines && selectedCard === CardType.PIN) { - fullSuffix += `&description_lines_count=${descriptionLines}`; - } - - if ( - customTitle && - (selectedCard === CardType.STATS || selectedCard === CardType.WAKATIME) - ) { - const encodedTitle = encodeURIComponent(customTitle); - fullSuffix += `&custom_title=${encodedTitle}`; - } - - if ( - langsCount && - (selectedCard === CardType.TOP_LANGS || selectedCard === CardType.WAKATIME) - ) { - fullSuffix += `&langs_count=${langsCount}`; - } - - if (hideValues && selectedCard === CardType.TOP_LANGS) { - fullSuffix += `&hide_values=true`; - } - - if (showAllStats && selectedCard === CardType.STATS) { - fullSuffix += `&show=reviews,discussions_started,discussions_answered,prs_merged,prs_merged_percentage,prs_commented,prs_reviewed,issues_commented`; - } - - if (showIcons && selectedCard === CardType.STATS) { - fullSuffix += `&show_icons=true`; - } - - if (includeAllCommits && selectedCard === CardType.STATS) { - fullSuffix += `&include_all_commits=true`; - } - - if ( - !enableAnimations && - (selectedCard === CardType.STATS || - selectedCard === CardType.TOP_LANGS || - selectedCard === CardType.WAKATIME) - ) { - fullSuffix += `&disable_animations=${!enableAnimations}`; - } - - if (usePercent && selectedCard === CardType.WAKATIME) { - fullSuffix += `&display_format=percent`; - } - - return fullSuffix; -} diff --git a/apps/frontend/src/pages/Home/stages/Customize.tsx b/apps/frontend/src/pages/Home/stages/Customize.tsx index 20efee355bd42..414231c0dae2d 100644 --- a/apps/frontend/src/pages/Home/stages/Customize.tsx +++ b/apps/frontend/src/pages/Home/stages/Customize.tsx @@ -15,6 +15,7 @@ import { DEMO_WAKATIME_USER, } from "../../../constants"; import { CardType } from "../../../models/CardType"; +import type { CardUrlBuilder } from "../../../models/CardUrl"; import type { StageIndex } from "../../../models/Stage"; import { useIsAuthenticated } from "../../../redux/selectors/userSelectors"; @@ -59,7 +60,7 @@ interface CustomizeStageProps { setEnableAnimations: Updater; usePercent: boolean; setUsePercent: Updater; - fullSuffix: string; + card: CardUrlBuilder; setStage: (stageIndex: StageIndex) => void; } @@ -101,7 +102,7 @@ export function CustomizeStage({ setEnableAnimations, usePercent, setUsePercent, - fullSuffix, + card, setStage, }: CustomizeStageProps): JSX.Element { const cardType = selectedCard; @@ -420,7 +421,7 @@ export function CustomizeStage({
- +
diff --git a/apps/frontend/src/pages/Home/stages/Display.tsx b/apps/frontend/src/pages/Home/stages/Display.tsx index fcd9fc85241d8..a04e1f7ad8ad7 100644 --- a/apps/frontend/src/pages/Home/stages/Display.tsx +++ b/apps/frontend/src/pages/Home/stages/Display.tsx @@ -6,13 +6,14 @@ import { CardImage } from "../../../components/Card/CardImage"; import { getCardThemeBackdrop } from "../../../components/Card/themeBackdrop"; import { Button } from "../../../components/Generic/Button"; import { HOST } from "../../../constants"; +import type { CardUrlBuilder } from "../../../models/CardUrl"; import { useTheme } from "../../../redux/selectors/themeSelectors"; interface DisplayStageProps { filename: string; link: string; theme: string; - themeSuffix: string; + card: CardUrlBuilder; guestHint: string | null; } @@ -20,7 +21,7 @@ export function DisplayStage({ filename, link, theme, - themeSuffix, + card, guestHint, }: DisplayStageProps): JSX.Element { const { isDark } = useTheme(); @@ -39,7 +40,7 @@ export function DisplayStage({ const copyMarkdown = () => { void navigator.clipboard.writeText( - `[![GitHub Stats](https://${HOST}/api${themeSuffix})](${link})`, + `[![GitHub Stats](${card.toApiUrl(HOST)})](${link})`, ); toast.info("Copied to Clipboard!", { position: "bottom-right", @@ -52,7 +53,7 @@ export function DisplayStage({ }; const copyUrl = () => { - void navigator.clipboard.writeText(`https://${HOST}/api${themeSuffix}`); + void navigator.clipboard.writeText(card.toApiUrl(HOST)); toast.info("Copied to Clipboard!", { position: "bottom-right", autoClose: 1500, @@ -104,7 +105,7 @@ export function DisplayStage({ style={{ background: getCardThemeBackdrop(theme, isDark) }} > diff --git a/apps/frontend/src/pages/Home/stages/Login/LoginBoxDemoCards.tsx b/apps/frontend/src/pages/Home/stages/Login/LoginBoxDemoCards.tsx index a262ef11364f4..d8b92ea622a41 100644 --- a/apps/frontend/src/pages/Home/stages/Login/LoginBoxDemoCards.tsx +++ b/apps/frontend/src/pages/Home/stages/Login/LoginBoxDemoCards.tsx @@ -7,24 +7,26 @@ import { DEMO_USER, DEMO_WAKATIME_USER, } from "../../../../constants"; +import { CardType } from "../../../../models/CardType"; +import { cardUrl } from "../../../../models/CardUrl"; import { useTheme } from "../../../../redux/selectors/themeSelectors"; -const cards: Array<{ demoImageSrc: string }> = [ - { - demoImageSrc: `/pin?repo=${DEMO_REPO}&disable_animations=true`, - }, - { - demoImageSrc: `/top-langs?username=${DEMO_USER}&langs_count=4&disable_animations=true`, - }, - { - demoImageSrc: `?username=${DEMO_USER}&include_all_commits=true&disable_animations=true`, - }, - { - demoImageSrc: `/wakatime?username=${DEMO_WAKATIME_USER}&langs_count=6&card_width=450&disable_animations=true`, - }, - { - demoImageSrc: `/gist?id=${DEMO_GIST}&disable_animations=true`, - }, +const cards = [ + cardUrl(CardType.PIN).repo(DEMO_REPO).disableAnimations(), + cardUrl(CardType.TOP_LANGS) + .username(DEMO_USER) + .langsCount(4) + .disableAnimations(), + cardUrl(CardType.STATS) + .username(DEMO_USER) + .includeAllCommits() + .disableAnimations(), + cardUrl(CardType.WAKATIME) + .username(DEMO_WAKATIME_USER) + .langsCount(6) + .cardWidth(450) + .disableAnimations(), + cardUrl(CardType.GIST).gistId(DEMO_GIST).disableAnimations(), ]; function getCardXPosition(cardIndex: number): number { @@ -41,29 +43,27 @@ function getCardXPosition(cardIndex: number): number { export function LoginBoxDemoCards(): JSX.Element { const { isDark } = useTheme(); - // Show dark-themed demo cards in dark mode so they fit the surroundings. - const themeParam = isDark ? "&theme=github_dark" : ""; return (
- {cards.map((card, index) => ( -
- -
- ))} + {cards.map((card, index) => { + // Show dark-themed demo cards in dark mode so they fit the surroundings. + const demoCard = isDark ? card.theme("github_dark") : card; + return ( +
+ +
+ ); + })}
); diff --git a/apps/frontend/src/pages/Home/stages/SelectCard.tsx b/apps/frontend/src/pages/Home/stages/SelectCard.tsx index bc2afb3723257..b961253916e05 100644 --- a/apps/frontend/src/pages/Home/stages/SelectCard.tsx +++ b/apps/frontend/src/pages/Home/stages/SelectCard.tsx @@ -9,6 +9,8 @@ import { DEMO_WAKATIME_USER, } from "../../../constants"; import { CardType } from "../../../models/CardType"; +import { cardUrl } from "../../../models/CardUrl"; +import type { CardUrlBuilder } from "../../../models/CardUrl"; import { useTheme } from "../../../redux/selectors/themeSelectors"; import { useUserId } from "../../../redux/selectors/userSelectors"; @@ -23,14 +25,12 @@ export function SelectCardStage({ }: SelectCardStageProps): JSX.Element { const userId = useUserId(DEMO_USER); const { isDark } = useTheme(); - // Show dark-themed demo cards in dark mode so they fit the surroundings. - const themeParam = isDark ? "&theme=github_dark" : ""; const options = useMemo< Array<{ title: string; description: string; - demoImageSrc: string; + demoCard: CardUrlBuilder; cardType: CardType; }> >( @@ -38,60 +38,69 @@ export function SelectCardStage({ { title: "GitHub Stats Card", description: "your overall GitHub statistics", - demoImageSrc: `?username=${userId}&include_all_commits=true${themeParam}`, + demoCard: cardUrl(CardType.STATS).username(userId).includeAllCommits(), cardType: CardType.STATS, }, { title: "Top Languages Card", description: "your most frequently used languages", - demoImageSrc: `/top-langs?username=${userId}&langs_count=4${themeParam}`, + demoCard: cardUrl(CardType.TOP_LANGS).username(userId).langsCount(4), cardType: CardType.TOP_LANGS, }, { title: "GitHub Extra Pin", description: "pin more than 6 repositories in your profile using a GitHub profile readme", - demoImageSrc: `/pin?repo=${DEMO_REPO}${themeParam}`, + demoCard: cardUrl(CardType.PIN).repo(DEMO_REPO), cardType: CardType.PIN, }, { title: "GitHub Gist Pin", description: "pin gists in your GitHub profile using a GitHub profile readme", - demoImageSrc: `/gist?id=${DEMO_GIST}${themeParam}`, + demoCard: cardUrl(CardType.GIST).gistId(DEMO_GIST), cardType: CardType.GIST, }, { title: "WakaTime Stats Card", description: "your coding activity from WakaTime", - demoImageSrc: `/wakatime?username=${DEMO_WAKATIME_USER}&langs_count=6&card_width=450${themeParam}`, + demoCard: cardUrl(CardType.WAKATIME) + .username(DEMO_WAKATIME_USER) + .langsCount(6) + .cardWidth(450), cardType: CardType.WAKATIME, }, ], - [userId, themeParam], + [userId], ); return (
- {options.map((card) => ( - - ))} + {options.map((card) => { + // Show dark-themed demo cards in dark mode so they fit the surroundings. + const demoCard = isDark + ? card.demoCard.theme("github_dark") + : card.demoCard; + return ( + + ); + })}
); } diff --git a/apps/frontend/src/pages/Home/stages/Theme.tsx b/apps/frontend/src/pages/Home/stages/Theme.tsx index fc5c1668b5bfb..7d386b812cb91 100644 --- a/apps/frontend/src/pages/Home/stages/Theme.tsx +++ b/apps/frontend/src/pages/Home/stages/Theme.tsx @@ -6,6 +6,7 @@ import { getCardThemeBackdrop, getThemeSortRank, } from "../../../components/Card/themeBackdrop"; +import type { CardUrlBuilder } from "../../../models/CardUrl"; import { useTheme } from "../../../redux/selectors/themeSelectors"; const excludedThemes = [ @@ -23,14 +24,14 @@ const themeList = Object.keys(themes) .sort((a, b) => getThemeSortRank(a) - getThemeSortRank(b)); interface ThemeStageProps { - fullSuffix: string; + card: CardUrlBuilder; theme: string; onThemeChange: (theme: string) => void; } export function ThemeStage({ theme, - fullSuffix, + card, onThemeChange, }: ThemeStageProps): JSX.Element { const { isDark } = useTheme(); @@ -52,7 +53,7 @@ export function ThemeStage({ { + async function fetchGistURL() { + try { + const result = await axios.get<{ html_url: string }>( + `https://api.github.com/gists/${gist}`, + ); + setGistUrl(result.data.html_url); + } catch (error) { + console.error(error); + } + } + void fetchGistURL(); + }, [gist]); + + return useMemo(() => { + const pinRepo = repo.includes("/") ? repo : `${userId}/${repo}`; + const statsCardLink = themeBuilder.toApiUrl(HOST); + + const descriptors: Record = { + [CardType.STATS]: { + guestHint: `username "${DEMO_USER}"`, + link: statsCardLink, + }, + [CardType.TOP_LANGS]: { + guestHint: `username "${DEMO_USER}"`, + link: statsCardLink, + }, + [CardType.PIN]: { + guestHint: `repo "${DEMO_REPO}"`, + link: `https://github.com/${pinRepo}`, + }, + [CardType.GIST]: { + guestHint: `Gist ID "${DEMO_GIST}"`, + link: gistUrl, + }, + [CardType.WAKATIME]: { + guestHint: `WakaTime username "${DEMO_WAKATIME_USER}"`, + link: `https://wakatime.com/@${wakatimeUser}`, + }, + }; + + return descriptors[selectedCard]; + }, [selectedCard, themeBuilder, repo, userId, gistUrl, wakatimeUser]); +} From 5da671b171f90a9a4d9a476bd8ca9704344e8569 Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Sun, 5 Jul 2026 09:53:08 +0200 Subject: [PATCH 04/26] ci: install only `chromium` for Playwright e2e (#329) The frontend Playwright config only enables the chromium project, so CI was needlessly downloading Firefox and WebKit. Scope `playwright install` to `chromium` to speed up the e2e job. --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b502bc9a043e2..8b2c8aae5eb43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,8 +67,10 @@ jobs: - name: Build packages run: pnpm run build:packages + # Only install chromium since it is the only browser enabled in + # apps/frontend/playwright.config.ts. Update this if more projects are added. - name: Install Playwright Browsers - run: pnpm exec playwright install --with-deps + run: pnpm exec playwright install --with-deps chromium - name: Run Playwright tests run: pnpm --filter ./apps/frontend/ run test:e2e From a2bb443789e35e3bd0c06073cd33a9eb01e348c7 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:24:06 +0200 Subject: [PATCH 05/26] several dependency upgrades (#334) --- apps/backend/package.json | 4 +- apps/frontend/package.json | 12 +- package.json | 2 +- pnpm-lock.yaml | 1054 +++++++++++++++++++----------------- pnpm-workspace.yaml | 2 +- 5 files changed, 570 insertions(+), 504 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 299115e49ff57..a1530b4be811a 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -22,8 +22,8 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "catalog:default", "@stats-organization/github-readme-stats-core": "workspace:^", - "pg": "^8.21.0" + "axios": "catalog:default", + "pg": "^8.22.0" } } diff --git a/apps/frontend/package.json b/apps/frontend/package.json index ba6d49fa159a2..7251554df3eaf 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -14,22 +14,22 @@ }, "dependencies": { "@reduxjs/toolkit": "^2.12.0", - "@tailwindcss/vite": "^4.3.0", - "axios": "catalog:default", - "axios-cache-interceptor": "^1", - "daisyui": "^5.5.23", "@stats-organization/github-readme-stats-backend": "workspace:^", "@stats-organization/github-readme-stats-core": "workspace:^", + "@tailwindcss/vite": "^4.3.1", + "axios": "catalog:default", + "axios-cache-interceptor": "^1.12.0", + "daisyui": "^5.6.3", "react": "^19.2.7", "react-dom": "^19.2.7", "react-icons": "^5.6.0", - "react-loading-skeleton": "^3.3.1", + "react-loading-skeleton": "^3.5.0", "react-redux": "^9.3.0", "react-spinners": "^0.17.0", "react-toastify": "^11.1.0", "redux": "^5.0.1", "save-svg-as-png": "^1.4.17", - "uuid": "^14.0.0" + "uuid": "^14.0.1" }, "devDependencies": { "@types/react": "19.2.17", diff --git a/package.json b/package.json index d0e4ba19b5fea..08a09cd7258af 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@stats-organization/root", "private": true, "type": "module", - "packageManager": "pnpm@10.33.2+sha512.a90faf6feeab71ad6c6e57f94e0fe1a12f5dcc22cd754db40ae9593eb6a3e0b6b12e3540218bb37ae083404b1f2ce6db2a4121e979829b4aff94b99f49da1cf8", + "packageManager": "pnpm@10.34.1+sha512.b58fbde6dca66a929538021581f648b4570b6ca19b18e7cbd7f2c07a7b24454155388dacdf08f2af3678e88a6d1fe04f9d609df24bf51735a060ea041b374ab7", "devDependencies": { "@eslint-react/eslint-plugin": "5.9.2", "@eslint/compat": "2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f00f5876fa2f1..3f63b9f02075f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: 4.1.8 version: 4.1.8 axios: - specifier: ^1.17.0 - version: 1.17.0 + specifier: ^1.18.1 + version: 1.18.1 jsdom: specifier: 29.1.1 version: 29.1.1 @@ -91,14 +91,14 @@ importers: version: link:../../packages/core axios: specifier: catalog:default - version: 1.17.0 + version: 1.18.1 pg: - specifier: ^8.21.0 - version: 8.21.0 + specifier: ^8.22.0 + version: 8.22.0 devDependencies: axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.17.0) + version: 2.1.0(axios@1.18.1) express: specifier: 5.2.1 version: 5.2.1 @@ -121,17 +121,17 @@ importers: specifier: workspace:^ version: link:../../packages/core '@tailwindcss/vite': - specifier: ^4.3.0 - version: 4.3.0(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + specifier: ^4.3.1 + version: 4.3.1(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) axios: specifier: catalog:default - version: 1.17.0 + version: 1.18.1 axios-cache-interceptor: - specifier: ^1 - version: 1.12.0(axios@1.17.0) + specifier: ^1.12.0 + version: 1.12.0(axios@1.18.1) daisyui: - specifier: ^5.5.23 - version: 5.5.23 + specifier: ^5.6.3 + version: 5.6.3 react: specifier: ^19.2.7 version: 19.2.7 @@ -142,7 +142,7 @@ importers: specifier: ^5.6.0 version: 5.6.0(react@19.2.7) react-loading-skeleton: - specifier: ^3.3.1 + specifier: ^3.5.0 version: 3.5.0(react@19.2.7) react-redux: specifier: ^9.3.0 @@ -160,8 +160,8 @@ importers: specifier: ^1.4.17 version: 1.4.17 uuid: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.0.1 + version: 14.0.1 devDependencies: '@types/react': specifier: 19.2.17 @@ -189,7 +189,7 @@ importers: dependencies: axios: specifier: catalog:default - version: 1.17.0 + version: 1.18.1 emoji-name-map: specifier: ^2.0.3 version: 2.0.3 @@ -208,7 +208,7 @@ importers: version: 1.1.1 axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.17.0) + version: 2.1.0(axios@1.18.1) js-yaml: specifier: 4.2.0 version: 4.2.0 @@ -221,8 +221,8 @@ importers: packages: - '@adobe/css-tools@4.4.4': - resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} @@ -239,29 +239,29 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} 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.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -272,19 +272,19 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -296,8 +296,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -311,12 +311,21 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.0': + resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@es-joy/jsdoccomment@0.87.0': resolution: {integrity: sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -422,8 +431,8 @@ packages: resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -467,11 +476,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -606,106 +612,106 @@ packages: '@oxc-project/types@0.133.0': resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} - '@oxc-resolver/binding-android-arm-eabi@11.20.0': - resolution: {integrity: sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==} + '@oxc-resolver/binding-android-arm-eabi@11.21.3': + resolution: {integrity: sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.20.0': - resolution: {integrity: sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==} + '@oxc-resolver/binding-android-arm64@11.21.3': + resolution: {integrity: sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.20.0': - resolution: {integrity: sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==} + '@oxc-resolver/binding-darwin-arm64@11.21.3': + resolution: {integrity: sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.20.0': - resolution: {integrity: sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==} + '@oxc-resolver/binding-darwin-x64@11.21.3': + resolution: {integrity: sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.20.0': - resolution: {integrity: sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==} + '@oxc-resolver/binding-freebsd-x64@11.21.3': + resolution: {integrity: sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': - resolution: {integrity: sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': + resolution: {integrity: sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': - resolution: {integrity: sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': + resolution: {integrity: sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': - resolution: {integrity: sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==} + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': + resolution: {integrity: sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-arm64-musl@11.20.0': - resolution: {integrity: sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==} + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': + resolution: {integrity: sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': - resolution: {integrity: sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': + resolution: {integrity: sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': - resolution: {integrity: sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': + resolution: {integrity: sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': - resolution: {integrity: sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==} + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': + resolution: {integrity: sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': - resolution: {integrity: sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==} + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': + resolution: {integrity: sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.20.0': - resolution: {integrity: sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==} + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': + resolution: {integrity: sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-musl@11.20.0': - resolution: {integrity: sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==} + '@oxc-resolver/binding-linux-x64-musl@11.21.3': + resolution: {integrity: sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==} cpu: [x64] os: [linux] libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.20.0': - resolution: {integrity: sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==} + '@oxc-resolver/binding-openharmony-arm64@11.21.3': + resolution: {integrity: sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.20.0': - resolution: {integrity: sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==} + '@oxc-resolver/binding-wasm32-wasi@11.21.3': + resolution: {integrity: sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': - resolution: {integrity: sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==} + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': + resolution: {integrity: sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.20.0': - resolution: {integrity: sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==} + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': + resolution: {integrity: sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==} cpu: [x64] os: [win32] @@ -836,69 +842,69 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@tailwindcss/node@4.3.0': - resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + '@tailwindcss/node@4.3.1': + resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==} - '@tailwindcss/oxide-android-arm64@4.3.0': - resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + '@tailwindcss/oxide-android-arm64@4.3.1': + resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.0': - resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + '@tailwindcss/oxide-darwin-arm64@4.3.1': + resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.0': - resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + '@tailwindcss/oxide-darwin-x64@4.3.1': + resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.0': - resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + '@tailwindcss/oxide-freebsd-x64@4.3.1': + resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': - resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': + resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': - resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': + resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': - resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.1': + resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': - resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.1': + resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.3.0': - resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + '@tailwindcss/oxide-linux-x64-musl@4.3.1': + resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.3.0': - resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.1': + resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -909,24 +915,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': - resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': + resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': - resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.1': + resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.0': - resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + '@tailwindcss/oxide@4.3.1': + resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.3.0': - resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + '@tailwindcss/vite@4.3.1': + resolution: {integrity: sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -968,8 +974,8 @@ packages: cpu: [arm64] os: [win32] - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1106,106 +1112,123 @@ packages: resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} 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==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] libc: [musl] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} cpu: [x64] os: [win32] @@ -1272,8 +1295,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1281,8 +1304,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} @@ -1322,8 +1345,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@1.0.0: - resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + ast-v8-to-istanbul@1.0.4: + resolution: {integrity: sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1339,8 +1362,8 @@ packages: peerDependencies: axios: '>= 0.17.0' - axios@1.17.0: - resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} @@ -1352,12 +1375,12 @@ packages: birecord@0.1.1: resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} bytes@3.1.2: @@ -1410,6 +1433,10 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1435,8 +1462,8 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - daisyui@5.5.23: - resolution: {integrity: sha512-xuheNUSL4T6ZVtWXoioqcNkjoyGX85QTDz4HTw2aBPfqk4fuMjax5HDo8qCmpV6M1YN8bGvfx5BpYCoDeRlt+A==} + daisyui@5.6.3: + resolution: {integrity: sha512-QvdtXnQ/tD5a18Y/+NJkJ1+ggwRtMF84GHTHCCAto5SNqYwZj8SUQQviKMpe1cKR7vMo/evTBDExkYd19KloBQ==} data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} @@ -1496,8 +1523,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.22.1: - resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==} + enhanced-resolve@5.21.6: + resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} engines: {node: '>=10.13.0'} entities@8.0.0: @@ -1516,11 +1543,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.2.0: + resolution: {integrity: sha512-3lGxdTXCLfe1MYfTz1y2ksAAUM4NAOP6rPEjxGJVKO7TZ5+tvHCaQWGpC4Y3IXvW3ece0Cz1cIP4FWBxOnGCTQ==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -1669,8 +1696,8 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} express@5.2.1: @@ -1729,8 +1756,8 @@ packages: debug: optional: true - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} formatly@0.3.0: @@ -1759,8 +1786,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -1804,8 +1831,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} html-encoding-sniffer@6.0.0: @@ -1846,8 +1873,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immer@11.1.4: - resolution: {integrity: sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==} + immer@11.1.8: + resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -2031,8 +2058,8 @@ packages: engines: {node: '>=22.22.1'} hasBin: true - listr2@10.2.1: - resolution: {integrity: sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==} + listr2@10.2.2: + resolution: {integrity: sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==} engines: {node: '>=22.13.0'} locate-path@6.0.0: @@ -2043,8 +2070,8 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} lz-string@1.5.0: @@ -2054,8 +2081,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -2107,8 +2134,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2134,8 +2161,9 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -2156,8 +2184,8 @@ packages: resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-resolver@11.20.0: - resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} + oxc-resolver@11.21.3: + resolution: {integrity: sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -2197,8 +2225,8 @@ packages: pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} - pg-connection-string@2.13.0: - resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==} + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -2209,15 +2237,15 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.14.0: - resolution: {integrity: sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==} + pg-protocol@1.15.0: + resolution: {integrity: sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.21.0: - resolution: {integrity: sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==} + pg@8.22.0: + resolution: {integrity: sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -2245,8 +2273,8 @@ packages: engines: {node: '>=18'} hasBin: true - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -2290,12 +2318,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} raw-body@3.0.2: @@ -2364,8 +2392,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} reserved-identifiers@1.2.0: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} @@ -2403,8 +2431,8 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@7.8.4: - resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -2439,8 +2467,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -2458,8 +2486,8 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} - smol-toml@1.6.1: - resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + smol-toml@1.7.0: + resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -2504,8 +2532,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} strip-ansi@7.2.0: @@ -2530,6 +2558,9 @@ packages: tailwindcss@4.3.0: resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + tailwindcss@4.3.1: + resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -2549,11 +2580,11 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tldts-core@7.0.28: - resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} + tldts-core@7.4.5: + resolution: {integrity: sha512-pGrwzZDvPwKe+7NNUqAunb6rqTfynr0VOUhCMdqbu5xlvNiszsAJygRzwvpVycdzejlbpY+SWJOn+s75Og7FEA==} - tldts@7.0.28: - resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} + tldts@7.4.5: + resolution: {integrity: sha512-RfEzKWcq5fHUOFq7J3rl3Oz6ylKGtcHqUznzj4EcXsxLSIjJcvpbXAQtWGeJQ0xKnimR5e0Cn+cn9TssfMzm+g==} hasBin: true to-valid-identifier@1.0.0: @@ -2595,9 +2626,9 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} typescript-eslint@8.61.0: resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} @@ -2618,16 +2649,16 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.25.0: - resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2637,8 +2668,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} hasBin: true vary@1.1.2: @@ -2794,18 +2825,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: - '@adobe/css-tools@4.4.4': {} + '@adobe/css-tools@4.5.0': {} '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -2821,26 +2852,26 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 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.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.2': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} @@ -2848,17 +2879,17 @@ snapshots: dependencies: css-tree: 3.2.1 - '@csstools/color-helpers@6.0.2': {} + '@csstools/color-helpers@6.1.0': {} - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -2866,7 +2897,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -2878,16 +2909,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.0': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@es-joy/jsdoccomment@0.87.0': dependencies: '@types/estree': 1.0.9 @@ -2975,7 +3022,7 @@ snapshots: eslint: 10.4.1(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - supports-color @@ -3025,7 +3072,7 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.0': {} + '@exodus/bytes@1.15.1': {} '@humanfs/core@0.19.2': dependencies: @@ -3062,18 +3109,18 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@0.2.12': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.3 optional: true '@oxc-parser/binding-android-arm-eabi@0.133.0': @@ -3128,7 +3175,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@oxc-parser/binding-win32-arm64-msvc@0.133.0': @@ -3142,65 +3189,65 @@ snapshots: '@oxc-project/types@0.133.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.20.0': + '@oxc-resolver/binding-android-arm-eabi@11.21.3': optional: true - '@oxc-resolver/binding-android-arm64@11.20.0': + '@oxc-resolver/binding-android-arm64@11.21.3': optional: true - '@oxc-resolver/binding-darwin-arm64@11.20.0': + '@oxc-resolver/binding-darwin-arm64@11.21.3': optional: true - '@oxc-resolver/binding-darwin-x64@11.20.0': + '@oxc-resolver/binding-darwin-x64@11.21.3': optional: true - '@oxc-resolver/binding-freebsd-x64@11.20.0': + '@oxc-resolver/binding-freebsd-x64@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.20.0': + '@oxc-resolver/binding-linux-x64-musl@11.21.3': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.20.0': + '@oxc-resolver/binding-openharmony-arm64@11.21.3': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.20.0': + '@oxc-resolver/binding-wasm32-wasi@11.21.3': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': optional: true '@package-json/types@0.0.12': {} @@ -3213,10 +3260,10 @@ snapshots: dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 - immer: 11.1.4 + immer: 11.1.8 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.1 + reselect: 5.2.0 optionalDependencies: react: 19.2.7 react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) @@ -3261,7 +3308,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.3': @@ -3278,78 +3325,78 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@tailwindcss/node@4.3.0': + '@tailwindcss/node@4.3.1': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.22.1 + enhanced-resolve: 5.21.6 jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.3.0 + tailwindcss: 4.3.1 - '@tailwindcss/oxide-android-arm64@4.3.0': + '@tailwindcss/oxide-android-arm64@4.3.1': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.0': + '@tailwindcss/oxide-darwin-arm64@4.3.1': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.0': + '@tailwindcss/oxide-darwin-x64@4.3.1': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.0': + '@tailwindcss/oxide-freebsd-x64@4.3.1': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + '@tailwindcss/oxide-linux-arm64-musl@4.3.1': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + '@tailwindcss/oxide-linux-x64-gnu@4.3.1': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.0': + '@tailwindcss/oxide-linux-x64-musl@4.3.1': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.0': + '@tailwindcss/oxide-wasm32-wasi@4.3.1': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + '@tailwindcss/oxide-win32-x64-msvc@4.3.1': optional: true - '@tailwindcss/oxide@4.3.0': + '@tailwindcss/oxide@4.3.1': optionalDependencies: - '@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/vite@4.3.0(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': - dependencies: - '@tailwindcss/node': 4.3.0 - '@tailwindcss/oxide': 4.3.0 - tailwindcss: 4.3.0 + '@tailwindcss/oxide-android-arm64': 4.3.1 + '@tailwindcss/oxide-darwin-arm64': 4.3.1 + '@tailwindcss/oxide-darwin-x64': 4.3.1 + '@tailwindcss/oxide-freebsd-x64': 4.3.1 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.1 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.1 + '@tailwindcss/oxide-linux-x64-musl': 4.3.1 + '@tailwindcss/oxide-wasm32-wasi': 4.3.1 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.1 + + '@tailwindcss/vite@4.3.1(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.1 + '@tailwindcss/oxide': 4.3.1 + tailwindcss: 4.3.1 vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -3359,7 +3406,7 @@ snapshots: '@testing-library/jest-dom@6.9.1': dependencies: - '@adobe/css-tools': 4.4.4 + '@adobe/css-tools': 4.5.0 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 @@ -3384,7 +3431,7 @@ snapshots: '@turbo/windows-arm64@2.9.18': optional: true - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true @@ -3448,8 +3495,8 @@ snapshots: '@typescript-eslint/project-service@8.61.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) - '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) + '@typescript-eslint/types': 8.61.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: @@ -3518,7 +3565,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.61.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.8.4 + semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -3533,7 +3580,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.62.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.8.4 + semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -3572,63 +3619,74 @@ snapshots: '@typescript-eslint/types': 8.62.0 eslint-visitor-keys: 5.0.1 - '@unrs/resolver-binding-android-arm-eabi@1.11.1': + '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true - '@unrs/resolver-binding-android-arm64@1.11.1': + '@unrs/resolver-binding-android-arm64@1.12.2': optional: true - '@unrs/resolver-binding-darwin-arm64@1.11.1': + '@unrs/resolver-binding-darwin-arm64@1.12.2': optional: true - '@unrs/resolver-binding-darwin-x64@1.11.1': + '@unrs/resolver-binding-darwin-x64@1.12.2': optional: true - '@unrs/resolver-binding-freebsd-x64@1.11.1': + '@unrs/resolver-binding-freebsd-x64@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.11.1': + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true '@uppercod/css-to-object@1.1.1': {} @@ -3642,12 +3700,12 @@ snapshots: dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.8 - ast-v8-to-istanbul: 1.0.0 + ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 - magicast: 0.5.2 - obug: 2.1.1 + magicast: 0.5.3 + obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 vitest: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -3698,11 +3756,11 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} agent-base@6.0.2: dependencies: @@ -3710,7 +3768,7 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3741,7 +3799,7 @@ snapshots: assertion-error@2.0.1: {} - ast-v8-to-istanbul@1.0.0: + ast-v8-to-istanbul@1.0.4: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -3749,25 +3807,25 @@ snapshots: asynckit@0.4.0: {} - axios-cache-interceptor@1.12.0(axios@1.17.0): + axios-cache-interceptor@1.12.0(axios@1.18.1): dependencies: - axios: 1.17.0 + axios: 1.18.1 cache-parser: 1.2.6 fast-defer: 1.1.9 http-vary: 1.0.3 object-code: 2.0.0 try: 1.0.3 - axios-mock-adapter@2.1.0(axios@1.17.0): + axios-mock-adapter@2.1.0(axios@1.18.1): dependencies: - axios: 1.17.0 + axios: 1.18.1 fast-deep-equal: 3.1.3 is-buffer: 2.0.5 - axios@1.17.0: + axios@1.18.1: dependencies: follow-redirects: 1.16.0 - form-data: 4.0.5 + form-data: 4.0.6 https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -3782,21 +3840,21 @@ snapshots: birecord@0.1.1: {} - body-parser@2.2.2: + body-parser@2.3.0: dependencies: bytes: 3.1.2 - content-type: 1.0.5 + content-type: 2.0.0 debug: 4.4.3 http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.1 + qs: 6.15.3 raw-body: 3.0.2 - type-is: 2.0.1 + type-is: 2.1.0 transitivePeerDependencies: - supports-color - brace-expansion@5.0.5: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -3823,7 +3881,7 @@ snapshots: cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 - string-width: 8.2.0 + string-width: 8.2.1 clsx@2.1.1: {} @@ -3839,6 +3897,8 @@ snapshots: content-type@1.0.5: {} + content-type@2.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -3860,7 +3920,7 @@ snapshots: csstype@3.2.3: {} - daisyui@5.5.23: {} + daisyui@5.6.3: {} data-urls@7.0.0: dependencies: @@ -3903,7 +3963,7 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.22.1: + enhanced-resolve@5.21.6: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -3916,9 +3976,9 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.0.0: {} + es-module-lexer@2.2.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -3927,29 +3987,29 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - eslint-import-context@0.1.9(unrs-resolver@1.11.1): + eslint-import-context@0.1.9(unrs-resolver@1.12.2): dependencies: get-tsconfig: 4.14.0 stable-hash-x: 0.2.0 optionalDependencies: - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.2 eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)): dependencies: debug: 4.4.3 eslint: 10.4.1(jiti@2.7.0) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) get-tsconfig: 4.14.0 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.17 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.2 optionalDependencies: eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) transitivePeerDependencies: @@ -3962,12 +4022,12 @@ snapshots: comment-parser: 1.4.7 debug: 4.4.3 eslint: 10.4.1(jiti@2.7.0) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 minimatch: 10.2.5 - semver: 7.8.4 + semver: 7.8.5 stable-hash-x: 0.2.0 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.2 optionalDependencies: '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: @@ -3987,7 +4047,7 @@ snapshots: html-entities: 2.6.0 object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 - semver: 7.8.4 + semver: 7.8.5 spdx-expression-parse: 4.0.0 to-valid-identifier: 1.0.0 transitivePeerDependencies: @@ -4110,7 +4170,7 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.9 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -4137,8 +4197,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -4161,12 +4221,12 @@ snapshots: eventemitter3@5.0.4: {} - expect-type@1.3.0: {} + expect-type@1.4.0: {} express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.2 + body-parser: 2.3.0 content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 @@ -4185,13 +4245,13 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.1 - range-parser: 1.2.1 + qs: 6.15.3 + range-parser: 1.3.0 router: 2.2.0 send: 1.2.1 serve-static: 2.2.1 statuses: 2.0.2 - type-is: 2.0.1 + type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -4241,12 +4301,12 @@ snapshots: follow-redirects@1.16.0: {} - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.3 + hasown: 2.0.4 mime-types: 2.1.35 formatly@0.3.0: @@ -4265,25 +4325,25 @@ snapshots: function-bind@1.1.2: {} - get-east-asian-width@1.5.0: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-tsconfig@4.14.0: dependencies: @@ -4309,13 +4369,13 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.3: + hasown@2.0.4: dependencies: function-bind: 1.1.2 html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - '@noble/hashes' @@ -4350,7 +4410,7 @@ snapshots: ignore@7.0.5: {} - immer@11.1.4: {} + immer@11.1.8: {} imurmurhash@0.1.4: {} @@ -4364,13 +4424,13 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.8.4 + semver: 7.8.5 is-extglob@2.1.1: {} is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 is-glob@4.0.3: dependencies: @@ -4412,19 +4472,19 @@ snapshots: '@asamuzakjp/css-color': 5.1.11 '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - '@exodus/bytes': 1.15.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 + lru-cache: 11.5.1 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.25.0 + undici: 7.28.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -4450,14 +4510,14 @@ snapshots: get-tsconfig: 4.14.0 jiti: 2.7.0 oxc-parser: 0.133.0 - oxc-resolver: 11.20.0 + oxc-resolver: 11.21.3 picomatch: 4.0.4 - smol-toml: 1.6.1 + smol-toml: 1.7.0 strip-json-comments: 5.0.3 tinyglobby: 0.2.17 unbash: 3.0.0 yaml: 2.9.0 - zod: 4.3.6 + zod: 4.4.3 levn@0.4.1: dependencies: @@ -4515,14 +4575,14 @@ snapshots: lint-staged@17.0.7: dependencies: - listr2: 10.2.1 + listr2: 10.2.2 picomatch: 4.0.4 string-argv: 0.3.2 tinyexec: 1.2.4 optionalDependencies: yaml: 2.9.0 - listr2@10.2.1: + listr2@10.2.2: dependencies: cli-truncate: 5.2.0 eventemitter3: 5.0.4 @@ -4542,7 +4602,7 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 - lru-cache@11.3.5: {} + lru-cache@11.5.1: {} lz-string@1.5.0: {} @@ -4550,15 +4610,15 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.2: + magicast@0.5.3: dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.8.4 + semver: 7.8.5 math-intrinsics@1.1.0: {} @@ -4586,11 +4646,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.7 ms@2.1.3: {} - nanoid@3.3.12: {} + nanoid@3.3.15: {} napi-postinstall@0.3.4: {} @@ -4604,7 +4664,7 @@ snapshots: object-inspect@1.13.4: {} - obug@2.1.1: {} + obug@2.1.3: {} on-finished@2.4.1: dependencies: @@ -4652,27 +4712,27 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.133.0 '@oxc-parser/binding-win32-x64-msvc': 0.133.0 - oxc-resolver@11.20.0: + oxc-resolver@11.21.3: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.20.0 - '@oxc-resolver/binding-android-arm64': 11.20.0 - '@oxc-resolver/binding-darwin-arm64': 11.20.0 - '@oxc-resolver/binding-darwin-x64': 11.20.0 - '@oxc-resolver/binding-freebsd-x64': 11.20.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.20.0 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.20.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.20.0 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-riscv64-musl': 11.20.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.20.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-x64-musl': 11.20.0 - '@oxc-resolver/binding-openharmony-arm64': 11.20.0 - '@oxc-resolver/binding-wasm32-wasi': 11.20.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 + '@oxc-resolver/binding-android-arm-eabi': 11.21.3 + '@oxc-resolver/binding-android-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-x64': 11.21.3 + '@oxc-resolver/binding-freebsd-x64': 11.21.3 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-arm64-musl': 11.21.3 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-musl': 11.21.3 + '@oxc-resolver/binding-linux-s390x-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-musl': 11.21.3 + '@oxc-resolver/binding-openharmony-arm64': 11.21.3 + '@oxc-resolver/binding-wasm32-wasi': 11.21.3 + '@oxc-resolver/binding-win32-arm64-msvc': 11.21.3 + '@oxc-resolver/binding-win32-x64-msvc': 11.21.3 p-limit@3.1.0: dependencies: @@ -4705,15 +4765,15 @@ snapshots: pg-cloudflare@1.4.0: optional: true - pg-connection-string@2.13.0: {} + pg-connection-string@2.14.0: {} pg-int8@1.0.1: {} - pg-pool@3.14.0(pg@8.21.0): + pg-pool@3.14.0(pg@8.22.0): dependencies: - pg: 8.21.0 + pg: 8.22.0 - pg-protocol@1.14.0: {} + pg-protocol@1.15.0: {} pg-types@2.2.0: dependencies: @@ -4723,11 +4783,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.21.0: + pg@8.22.0: dependencies: - pg-connection-string: 2.13.0 - pg-pool: 3.14.0(pg@8.21.0) - pg-protocol: 1.14.0 + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.22.0) + pg-protocol: 1.15.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -4749,9 +4809,9 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - postcss@8.5.15: + postcss@8.5.16: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.15 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4784,11 +4844,12 @@ snapshots: punycode@2.3.1: {} - qs@6.15.1: + qs@6.15.3: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 - range-parser@1.2.1: {} + range-parser@1.3.0: {} raw-body@3.0.2: dependencies: @@ -4847,7 +4908,7 @@ snapshots: require-from-string@2.0.2: {} - reselect@5.1.1: {} + reselect@5.2.0: {} reserved-identifiers@1.2.0: {} @@ -4901,7 +4962,7 @@ snapshots: scheduler@0.27.0: {} - semver@7.8.4: {} + semver@7.8.5: {} send@1.2.1: dependencies: @@ -4914,7 +4975,7 @@ snapshots: mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -4956,7 +5017,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -4978,7 +5039,7 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smol-toml@1.6.1: {} + smol-toml@1.7.0: {} source-map-js@1.2.1: {} @@ -5008,12 +5069,12 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 - string-width@8.2.0: + string-width@8.2.1: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 strip-ansi@7.2.0: @@ -5034,6 +5095,8 @@ snapshots: tailwindcss@4.3.0: {} + tailwindcss@4.3.1: {} + tapable@2.3.3: {} tinybench@2.9.0: {} @@ -5047,11 +5110,11 @@ snapshots: tinyrainbow@3.1.0: {} - tldts-core@7.0.28: {} + tldts-core@7.4.5: {} - tldts@7.0.28: + tldts@7.4.5: dependencies: - tldts-core: 7.0.28 + tldts-core: 7.4.5 to-valid-identifier@1.0.0: dependencies: @@ -5062,7 +5125,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.0.28 + tldts: 7.4.5 tr46@6.0.0: dependencies: @@ -5092,9 +5155,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-is@2.0.1: + type-is@2.1.0: dependencies: - content-type: 1.0.5 + content-type: 2.0.0 media-typer: 1.1.0 mime-types: 3.0.2 @@ -5115,33 +5178,36 @@ snapshots: undici-types@7.18.2: {} - undici@7.25.0: {} + undici@7.28.0: {} unpipe@1.0.0: {} - unrs-resolver@1.11.1: + unrs-resolver@1.12.2: dependencies: napi-postinstall: 0.3.4 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 + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 uri-js@4.4.1: dependencies: @@ -5151,7 +5217,7 @@ snapshots: dependencies: react: 19.2.7 - uuid@14.0.0: {} + uuid@14.0.1: {} vary@1.1.2: {} @@ -5159,7 +5225,7 @@ snapshots: dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.15 + postcss: 8.5.16 rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: @@ -5177,10 +5243,10 @@ snapshots: '@vitest/snapshot': 4.1.8 '@vitest/spy': 4.1.8 '@vitest/utils': 4.1.8 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 + es-module-lexer: 2.2.0 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.3 pathe: 2.0.3 picomatch: 4.0.4 std-env: 4.1.0 @@ -5209,7 +5275,7 @@ snapshots: whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -5229,7 +5295,7 @@ snapshots: wrap-ansi@10.0.0: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.0 + string-width: 8.2.1 strip-ansi: 7.2.0 wrap-ansi@9.0.2: @@ -5250,4 +5316,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.3.6: {} + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8b2d62ffc9217..4608065cef00d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,7 @@ packages: catalog: "@vitest/coverage-v8": 4.1.8 - axios: ^1.17.0 + axios: ^1.18.1 jsdom: 29.1.1 vite: 8.0.16 vitest: 4.1.8 From 536199bf4a9aeb8c876cf8bb91a3175be8811b86 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:25:04 +0200 Subject: [PATCH 06/26] several dependency upgrades again (#336) --- apps/frontend/package.json | 4 +- apps/frontend/src/models/CardUrl.ts | 6 +- package.json | 22 +- packages/core/package.json | 2 +- pnpm-lock.yaml | 1188 +++++++++++++-------------- pnpm-workspace.yaml | 6 +- 6 files changed, 597 insertions(+), 631 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 7251554df3eaf..16cb540055314 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -34,9 +34,9 @@ "devDependencies": { "@types/react": "19.2.17", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-react": "6.0.3", "clsx": "2.1.1", - "tailwindcss": "4.3.0", + "tailwindcss": "4.3.1", "vite": "catalog:default", "vitest": "catalog:default" }, diff --git a/apps/frontend/src/models/CardUrl.ts b/apps/frontend/src/models/CardUrl.ts index 3b5fc4073cedf..d779e8c464a74 100644 --- a/apps/frontend/src/models/CardUrl.ts +++ b/apps/frontend/src/models/CardUrl.ts @@ -240,11 +240,7 @@ class WakatimeCardUrl extends CardUrlBase { /** Any card-URL builder, regardless of card type (all share the universal API). */ export type CardUrlBuilder = - | StatsCardUrl - | TopLangsCardUrl - | PinCardUrl - | GistCardUrl - | WakatimeCardUrl; + StatsCardUrl | TopLangsCardUrl | PinCardUrl | GistCardUrl | WakatimeCardUrl; /** * Create a card-URL builder typed to the given card, so only the params that diff --git a/package.json b/package.json index 08a09cd7258af..91b0b454c5817 100644 --- a/package.json +++ b/package.json @@ -4,24 +4,24 @@ "type": "module", "packageManager": "pnpm@10.34.1+sha512.b58fbde6dca66a929538021581f648b4570b6ca19b18e7cbd7f2c07a7b24454155388dacdf08f2af3678e88a6d1fe04f9d609df24bf51735a060ea041b374ab7", "devDependencies": { - "@eslint-react/eslint-plugin": "5.9.2", + "@eslint-react/eslint-plugin": "5.10.0", "@eslint/compat": "2.1.0", "@eslint/js": "10.0.1", - "@playwright/test": "1.60.0", + "@playwright/test": "1.61.1", "@types/node": "24.13.2", "@vitest/coverage-v8": "catalog:default", - "eslint": "10.4.1", + "eslint": "10.6.0", "eslint-import-resolver-typescript": "4.4.5", - "eslint-plugin-import-x": "4.16.2", - "eslint-plugin-jsdoc": "63.0.2", - "globals": "17.6.0", + "eslint-plugin-import-x": "4.17.1", + "eslint-plugin-jsdoc": "63.0.10", + "globals": "17.7.0", "husky": "9.1.7", - "knip": "6.16.1", - "lint-staged": "17.0.7", - "prettier": "3.8.4", - "turbo": "2.9.18", + "knip": "6.23.0", + "lint-staged": "17.0.8", + "prettier": "3.9.1", + "turbo": "2.10.0", "typescript": "6.0.3", - "typescript-eslint": "8.61.0", + "typescript-eslint": "8.62.0", "vitest": "catalog:default" }, "scripts": { diff --git a/packages/core/package.json b/packages/core/package.json index ad9d5ff2c42c8..b9b8d56430f48 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -83,7 +83,7 @@ "@testing-library/jest-dom": "6.9.1", "@uppercod/css-to-object": "1.1.1", "axios-mock-adapter": "2.1.0", - "js-yaml": "4.2.0", + "js-yaml": "5.2.0", "jsdom": "catalog:default", "vitest": "catalog:default" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f63b9f02075f..5e0b678f26820 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@vitest/coverage-v8': - specifier: 4.1.8 - version: 4.1.8 + specifier: 4.1.9 + version: 4.1.9 axios: specifier: ^1.18.1 version: 1.18.1 @@ -16,73 +16,73 @@ catalogs: specifier: 29.1.1 version: 29.1.1 vite: - specifier: 8.0.16 - version: 8.0.16 + specifier: 8.1.0 + version: 8.1.0 vitest: - specifier: 4.1.8 - version: 4.1.8 + specifier: 4.1.9 + version: 4.1.9 importers: .: devDependencies: '@eslint-react/eslint-plugin': - specifier: 5.9.2 - version: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + specifier: 5.10.0 + version: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@eslint/compat': specifier: 2.1.0 - version: 2.1.0(eslint@10.4.1(jiti@2.7.0)) + version: 2.1.0(eslint@10.6.0(jiti@2.7.0)) '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) + version: 10.0.1(eslint@10.6.0(jiti@2.7.0)) '@playwright/test': - specifier: 1.60.0 - version: 1.60.0 + specifier: 1.61.1 + version: 1.61.1 '@types/node': specifier: 24.13.2 version: 24.13.2 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.8(vitest@4.1.8) + version: 4.1.9(vitest@4.1.9) eslint: - specifier: 10.4.1 - version: 10.4.1(jiti@2.7.0) + specifier: 10.6.0 + version: 10.6.0(jiti@2.7.0) eslint-import-resolver-typescript: specifier: 4.4.5 - version: 4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)) + version: 4.4.5(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)))(eslint@10.6.0(jiti@2.7.0)) eslint-plugin-import-x: - specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) + specifier: 4.17.1 + version: 4.17.1(@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) eslint-plugin-jsdoc: - specifier: 63.0.2 - version: 63.0.2(eslint@10.4.1(jiti@2.7.0)) + specifier: 63.0.10 + version: 63.0.10(eslint@10.6.0(jiti@2.7.0)) globals: - specifier: 17.6.0 - version: 17.6.0 + specifier: 17.7.0 + version: 17.7.0 husky: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 6.16.1 - version: 6.16.1 + specifier: 6.23.0 + version: 6.23.0 lint-staged: - specifier: 17.0.7 - version: 17.0.7 + specifier: 17.0.8 + version: 17.0.8 prettier: - specifier: 3.8.4 - version: 3.8.4 + specifier: 3.9.1 + version: 3.9.1 turbo: - specifier: 2.9.18 - version: 2.9.18 + specifier: 2.10.0 + version: 2.10.0 typescript: specifier: 6.0.3 version: 6.0.3 typescript-eslint: - specifier: 8.61.0 - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + specifier: 8.62.0 + version: 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) vitest: specifier: catalog:default - version: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.9(@types/node@24.13.2)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) apps/backend: dependencies: @@ -107,7 +107,7 @@ importers: version: 29.1.1 vitest: specifier: catalog:default - version: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) apps/frontend: dependencies: @@ -122,7 +122,7 @@ importers: version: link:../../packages/core '@tailwindcss/vite': specifier: ^4.3.1 - version: 4.3.1(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.3.1(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) axios: specifier: catalog:default version: 1.18.1 @@ -170,20 +170,20 @@ importers: specifier: 19.2.3 version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': - specifier: 6.0.2 - version: 6.0.2(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + specifier: 6.0.3 + version: 6.0.3(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) clsx: specifier: 2.1.1 version: 2.1.1 tailwindcss: - specifier: 4.3.0 - version: 4.3.0 + specifier: 4.3.1 + version: 4.3.1 vite: specifier: catalog:default - version: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) + version: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0) vitest: specifier: catalog:default - version: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) packages/core: dependencies: @@ -210,14 +210,14 @@ importers: specifier: 2.1.0 version: 2.1.0(axios@1.18.1) js-yaml: - specifier: 4.2.0 - version: 4.2.0 + specifier: 5.2.0 + version: 5.2.0 jsdom: specifier: catalog:default version: 29.1.1 vitest: specifier: catalog:default - version: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) packages: @@ -314,12 +314,18 @@ packages: '@emnapi/core@1.11.0': resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.11.0': resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -344,50 +350,50 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@5.9.2': - resolution: {integrity: sha512-206StJvea00Bs9etMOEG94muuBP/gQ6NPK2Tg/m/Dbx1o3hEOpoblxKqBF1jYx91C1DIrbuzqaqI1N/XTfGYxw==} + '@eslint-react/ast@5.10.0': + resolution: {integrity: sha512-8AZj8ZkRIwLnsy9dA7A9aJJp0rjURKa18/rZU7I37akXVpRBpQAui3+Z7IfbSH5t5B3y3vIM96kpYfc5RiYXYw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/core@5.9.2': - resolution: {integrity: sha512-GcXEaMAyjFgbIP7g1TQ+p7VohhnM4g1wtEccj4MNXb1jzTKioPcWxRWN95lrBnrCYskvZXsPCWM4ERQjMQGU2g==} + '@eslint-react/core@5.10.0': + resolution: {integrity: sha512-brqXjHlQV9WD337ksz8u9g4z70czWTeLBA74cdPvZ32IlYuIYTIPu/R5j8MXLQhaTAJmC6+H3RN+EjgrTfFvRw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/eslint-plugin@5.9.2': - resolution: {integrity: sha512-o1rSyib/uWlWU8qPg6E1U0ME/mrS/YZYSr4ruSw7dGoQTNZBOFVs0T0KivioK5YfLksHH2ynPOCn6w4EUnH47w==} + '@eslint-react/eslint-plugin@5.10.0': + resolution: {integrity: sha512-wIlaphThT/ld61VYc1Sss8U7KmOsv2pgwV9ucSWRJSzqQ+DkXsoeMbv/TvsnVV39Lq6wfWnBt8r7F9EnmtNpqA==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/eslint@5.9.2': - resolution: {integrity: sha512-8Fr+dqE8NoB7XRlp8AQp/IE5koQYxprXYAzktCmySVtwH6/I2HDQsVy/wcNMuIcCM7EPkiAbtl9MOiFvcbTAkw==} + '@eslint-react/eslint@5.10.0': + resolution: {integrity: sha512-iHoMYyLdrzQJcZESTJ9xa56CzrKR0gmJyQB6KAz95b0zjKY9VCpKufnZ6ZlPQ33p2IGQq8A30uk3KLULYCgGNw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/jsx@5.9.2': - resolution: {integrity: sha512-rag1x+7lZHDOTT8WfWeS22fymh5JVr11O8m2SptTyI68ao0TWjTc5+BBHtv/lvQlea+VZpRH1n4pZV3e4Hkspw==} + '@eslint-react/jsx@5.10.0': + resolution: {integrity: sha512-jrZNSItx/OFVFNyax2sU2QXjxAfDazKGOLt3bWdjpU7Vz46LkdPwW1MfgK9qB74KiGq7uZRtpjqzaTF4atzsvg==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/shared@5.9.2': - resolution: {integrity: sha512-NU3pHMA3iADBH7HEPql/KSZTgooGp1HShT6TyeG46TApA42Z+X+gBk5MFmwazF/HPd/q3T2N6KU5gLWRNqXgng==} + '@eslint-react/shared@5.10.0': + resolution: {integrity: sha512-FNaKRqoNANfVlrXi/uuFPIs9S9yO4WLgKTAFOc3V1xNa9hRtRkKkii+cQqwlYDBuHlMIw9UMQoImnyO4AWiDDg==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - '@eslint-react/var@5.9.2': - resolution: {integrity: sha512-9+J8GmsKi3diHF2Ij++vb5HVs6IO9rbLUs2i4pzCeqrGZstyrTVp3BMSSzn2GamRODCU9Zz/Shl8vhwrSkqYsQ==} + '@eslint-react/var@5.10.0': + resolution: {integrity: sha512-hApDw4o1xzc+4sDXJ/IWuUpG46FjgdX4bH15/VIT+qM4oxIta9aWuxn4WrcXDhEzkL4y75WRAVD0CugZg6Ww2g==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' @@ -482,135 +488,135 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-parser/binding-android-arm-eabi@0.133.0': - resolution: {integrity: sha512-l/44caGse+VpnY9gx0yvvc5QnnG3yG1FO3KZgYvNL1GZrfK86zIwAOgGEVlxDyRymzrU/KHiblPFpevKOmJmUA==} + '@oxc-parser/binding-android-arm-eabi@0.137.0': + resolution: {integrity: sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.133.0': - resolution: {integrity: sha512-KUHmPMziLBp4u+zbrLdB7iWS7KshuZe+RAp7ELnY9SI9nNXBZ+dp8fiBqWOxhXqn+FQg3a4UcQhwmsJOKV8Jjg==} + '@oxc-parser/binding-android-arm64@0.137.0': + resolution: {integrity: sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.133.0': - resolution: {integrity: sha512-q8dWmnU/8ea2tga9w2f1PinQ5rcMPDUGkF64T189b65YMjUomET4oy5oRldOr4AwOQkneOG/Zttnz1Dvrc62wg==} + '@oxc-parser/binding-darwin-arm64@0.137.0': + resolution: {integrity: sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.133.0': - resolution: {integrity: sha512-cOKeIELIB2bJnCKwqx4Rdj+1Lss/U6uCbLxRySZrhyOOQa1flKhwZFjEHRHxk8fU1NKmhK5OnTdPQ4CpjuFuVw==} + '@oxc-parser/binding-darwin-x64@0.137.0': + resolution: {integrity: sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.133.0': - resolution: {integrity: sha512-OpaSv4pW3KgFrMYQxTaS0aOE4T1DQF3qZE/4B6uqqv1KgPWWd4UQhJALi8PJPX1RRV5K7ThKXRfF7qGg2+3l1A==} + '@oxc-parser/binding-freebsd-x64@0.137.0': + resolution: {integrity: sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': - resolution: {integrity: sha512-JGK1wlGrGwxBIlVSF7KWTX1/ru6BEtf28fRROztDRkLfiW+Kxa4onnriezMIiogfn9hVw2KzYcKiLjkLR2ns8A==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': + resolution: {integrity: sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': - resolution: {integrity: sha512-yuZO533Ftonxn/iyoqQzURzLQHMspvsIyfiCSNi1t/ER4eIQaR0SsmUOUm5b/lmSig7IWIUa5/BrbEkAPwcilQ==} + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': + resolution: {integrity: sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.133.0': - resolution: {integrity: sha512-hvpbqT5pN2rR+3+xtWeizwfR/aZ0vGceg6TqYMl+ToxMpk9/tmnX7kSvQnfEUkoua8mhogzvIKsAkn0wxgblBA==} + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': + resolution: {integrity: sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.133.0': - resolution: {integrity: sha512-wJQGamIosQBoJHW9+S5XxrtKRo3eyJxsnS1XCPrqN0LHi8uw1pTqqTfn3t/NVuvbBg7Pumn4ez9Eidgcn0xbEg==} + '@oxc-parser/binding-linux-arm64-musl@0.137.0': + resolution: {integrity: sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': - resolution: {integrity: sha512-Koaz32/O5+abIfrNGdyndgRvdOZ9jEf5/z3Ep9h3h2QWpdDiUQpVwgH0OcMXCs+l9aXxPLtkupqyVig9W6FDKw==} + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': + resolution: {integrity: sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': - resolution: {integrity: sha512-R4vOjWzxhnNWHnVLeiB6jNuIifdy9vcMXZGPc7StXcxBovI+U2zg1QhZ9o8OjV80oGivs1lX5NfPLzk4IPqlRA==} + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': + resolution: {integrity: sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.133.0': - resolution: {integrity: sha512-iwgBNUTHiMdxARLYuM0SBlnYeb19iw1Ea5M+4ERZupCsBMLArti6FyZ6UfFjJxIiTDr2oW2DGQFxlQVQ/dW9rA==} + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': + resolution: {integrity: sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.133.0': - resolution: {integrity: sha512-ZwZNo8FZmB/gVfboQl+wXilBigGl+6nQQs+nITOeAP/HcAOjiHl6XZJL9F/KXNEspODQcbjAiyjUbeCJd9a0fA==} + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': + resolution: {integrity: sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.133.0': - resolution: {integrity: sha512-govCvWx1dBlED3uu4qXctxpRcouu9I8Kn+DBktGCl760JtlGJzc9l/OmPJKlYWSbrRqKkMZehNeZ/4Wfma7uSA==} + '@oxc-parser/binding-linux-x64-gnu@0.137.0': + resolution: {integrity: sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.133.0': - resolution: {integrity: sha512-ssTlpXD5Mq9uCssDJPzlRWqBt4Y7Zzd9i+XZhWmK/9Y6KUIuAxVYTYiI8lxcGWi0+3/Cz4A8q9UrD4NK9Y2j7g==} + '@oxc-parser/binding-linux-x64-musl@0.137.0': + resolution: {integrity: sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.133.0': - resolution: {integrity: sha512-51aByfXhPtLEdWG4a2Ihdw6cPWV1ei1AarALpFdDP8MLWDLE2NuUMgbo3DERR2Kt8fT/ok1GUvBiLxVGke9uUQ==} + '@oxc-parser/binding-openharmony-arm64@0.137.0': + resolution: {integrity: sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.133.0': - resolution: {integrity: sha512-2e16tkKp+wDO2GTAmXfxbBcCmGEaFPIJEIRBBmVKNVXSc8/fJsSIaBGyFTPHM9ST5GNWgJcYIt94rDTks+PLwA==} + '@oxc-parser/binding-wasm32-wasi@0.137.0': + resolution: {integrity: sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.133.0': - resolution: {integrity: sha512-KPTNDKbxH1cglrqTyVeXHb4Pk4oksz8EcE1/v8zqU7N4UXbiHfA/IwtXZ2U77fnRAWBbgVkl/lZbL7o3hRdejg==} + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': + resolution: {integrity: sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.133.0': - resolution: {integrity: sha512-Una1bNYv9zCavQrfnDR9wuZVB3itLjCEH4Oz7i6CwAJN/Xq9b+zbbcxmvdkKvvJt4Ngc/MBmIYlbLo3zS4TQ0A==} + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': + resolution: {integrity: sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.133.0': - resolution: {integrity: sha512-kjBhCiOGSYTwDJQuuZa7a94JbP8htWu7J0X1KwH74kV2K5eYf6eyJRYmkpCDvr0XEL8tMxYI4WU1VekblFCLgg==} + '@oxc-parser/binding-win32-x64-msvc@0.137.0': + resolution: {integrity: sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} '@oxc-resolver/binding-android-arm-eabi@11.21.3': resolution: {integrity: sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==} @@ -715,11 +721,8 @@ packages: cpu: [x64] os: [win32] - '@package-json/types@0.0.12': - resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} - - '@playwright/test@1.60.0': - resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} + '@playwright/test@1.61.1': + resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} engines: {node: '>=18'} hasBin: true @@ -734,97 +737,97 @@ packages: react-redux: optional: true - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.1.3': + resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.1.3': + resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.1.3': + resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.1.3': + resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.1.3': + resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.1.3': + resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.1.3': + resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.1.3': + resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.1.3': + resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.1.3': + resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.1.3': + resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + '@rolldown/binding-wasm32-wasi@1.1.3': + resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.1.3': + resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.1.3': + resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -944,33 +947,33 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@turbo/darwin-64@2.9.18': - resolution: {integrity: sha512-9f27peFu16ur8c0v9nUFUEyBnbKuuFsUTjHFWfmwGfzySBXbHwzU44QhZon6Mznz0cHsIr3984NQj/bVrnGSRw==} + '@turbo/darwin-64@2.10.0': + resolution: {integrity: sha512-EwvHThXzpY0KGd1/NAmuewI5D+aVa3Rl/OlxE36yfjUKb/+ySrfJrSlEFt8aD1OXwnnaHnQnPKHFndor0Zxlsg==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.9.18': - resolution: {integrity: sha512-9A6TMRq/Ib+QnbhLlgkhOm+624wO4pzSQ/yQviQfWHOlFvaYxdnIAYmu2H6TS6y7kSVL0DvzNe04NbESTOzFVQ==} + '@turbo/darwin-arm64@2.10.0': + resolution: {integrity: sha512-9d2fTyyG0lf5Wq1bwJA9qUaeecViMkLcdctWaMMmCkxZ/JqypmqOwK3W6vmejeKVgkr06gSoiX8bD+xN5Jpxcg==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.9.18': - resolution: {integrity: sha512-zCdIDtz69AnbYh913elJRRoF3QY5aa2HNnf+4rAkc7bQ+tWujiDkCNV7stazOUPggaDvhKIf2Z87qHftTeXSkw==} + '@turbo/linux-64@2.10.0': + resolution: {integrity: sha512-sZBtjMuufitanjzi6UssoUpJMnnPlLMcdcJj3m3ptNsSq31Xh7MnjhwA5nWvLDTfEFg8GPcbYFXMo8vSdKRfqQ==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.9.18': - resolution: {integrity: sha512-Va1kXI04naMgYwqv/5Dfa36dTDx8015U7oaQAjrXa45ua9OoFjSV4OmvkML4EmXvUclQHCiBRbY8bvd0jV7eAg==} + '@turbo/linux-arm64@2.10.0': + resolution: {integrity: sha512-vkq/Z8R+1DQ+kifWFa810IjRy2NNBVvha3cg9sWA3nFh6nnGrHSMnnJKrzH7c/No9kq4Jb55Ru44YKsCSBgrKg==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.9.18': - resolution: {integrity: sha512-m0kDhZANxSNz9ck1ybogFscHabriAsp4eDFNrN/1H5WrgTF7b3VlcPZnhuO3v2+E2KnCbeAc+UUT10BZZHdDKw==} + '@turbo/windows-64@2.10.0': + resolution: {integrity: sha512-CRUEguLWxFQHptYZS7HjPhNhAFawfea07iR+xAQ5e4klgLrPCMdexBkXwSCwOxqTFknJ7RZFN3gOaADsw+Gttg==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.9.18': - resolution: {integrity: sha512-nUdR8WqoomUys9iIQmG45TMiizJ+5BV8egSeLLZba/AWblyp3fVBcIH1kSE58OtK4g2YzbMJEth6Ttv9w5rqMA==} + '@turbo/windows-arm64@2.10.0': + resolution: {integrity: sha512-dVHGaf9F8twzgibcBqKoADT/LLqf9++jDb+hq/LPWWaOmRpp4M+/pVOm7vy4z9D++xg8eaxWLT0+wQxFwhYu9A==} cpu: [arm64] os: [win32] @@ -998,6 +1001,9 @@ packages: '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} + '@types/node@26.0.1': + resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -1009,60 +1015,37 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@typescript-eslint/eslint-plugin@8.61.0': - resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} + '@typescript-eslint/eslint-plugin@8.62.0': + resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.61.0 + '@typescript-eslint/parser': ^8.62.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.61.0': - resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} + '@typescript-eslint/parser@8.62.0': + resolution: {integrity: sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.61.0': - resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.62.0': resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.61.0': - resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.62.0': resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.61.0': - resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.62.0': resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.61.0': - resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.62.0': resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1070,33 +1053,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.61.0': - resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.62.0': resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.61.0': - resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.62.0': resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.61.0': - resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.62.0': resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1104,10 +1070,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.61.0': - resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.62.0': resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1235,8 +1197,8 @@ packages: '@uppercod/css-to-object@1.1.1': resolution: {integrity: sha512-dCTxxolI6fu28lzNRVwd7CzJV8EbARITFyCbP/JqLHYLfWHY7GJqXHDdk0GbtfXvsZosPCvjOE4dOIMT4XDFZQ==} - '@vitejs/plugin-react@6.0.2': - resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + '@vitejs/plugin-react@6.0.3': + resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 @@ -1248,20 +1210,20 @@ packages: babel-plugin-react-compiler: optional: true - '@vitest/coverage-v8@4.1.8': - resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} + '@vitest/coverage-v8@4.1.9': + resolution: {integrity: sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==} peerDependencies: - '@vitest/browser': 4.1.8 - vitest: 4.1.8 + '@vitest/browser': 4.1.9 + vitest: 4.1.9 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.8': - resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.8': - resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1271,20 +1233,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.8': - resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@4.1.8': - resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.8': - resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.8': - resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@4.1.8': - resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -1583,8 +1545,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-plugin-import-x@4.16.2: - resolution: {integrity: sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==} + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/utils': ^8.56.0 @@ -1596,49 +1558,49 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-jsdoc@63.0.2: - resolution: {integrity: sha512-0TchoK1uS4VxHSo3P4CyWQ31Lm+6zsT+xkHMC5KbFKwgOf8YrXPf1Bl8EP7kpgw1wfe/Ui5jz5mSX7ou8WAVuw==} + eslint-plugin-jsdoc@63.0.10: + resolution: {integrity: sha512-A9UIWsCquaKnit7rasXxYf12hhGIdDRjv65/RUE3AxbT6rdKBvr3MjH37g3gP+g4ipQMXuMn9slFKjO+vqNfkg==} engines: {node: ^22.13.0 || >=24} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-react-dom@5.9.2: - resolution: {integrity: sha512-9pOLfUWBSR49OLZxCIDLngyfqOozsoilPl1Tv3pxoW389AVB/Gg3So4Rf+UPpQtEjJP6840hnTZkmY+A44umng==} + eslint-plugin-react-dom@5.10.0: + resolution: {integrity: sha512-GE47tO78o0I+XqT0Et07BnTRI9x5bCRA1tRDraTc7CEjUTCu0FHyTjAYr0ZMwdrLSJib0OXjirD7GDp2MM7lYA==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - eslint-plugin-react-jsx@5.9.2: - resolution: {integrity: sha512-LPogjhB5FevfPp7dUdh2qrku+DbWvVuqWYwO4Kb9ty1RYKQN9DsZx1Db1WVmd8x/W2NBDLgzkupH76SJ+ukR1w==} + eslint-plugin-react-jsx@5.10.0: + resolution: {integrity: sha512-L0jKCE9zBzFqUt0zAJGga4VyUM8wEgBMenApllXCHCTxCUW7w9dqgl3p73qgYT5xa4oHJDXTDGyAzKO7p/kgeQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - eslint-plugin-react-naming-convention@5.9.2: - resolution: {integrity: sha512-ODgENIpcxYoE4SjvlyA7loPVTjcphpU2Y2jehdRI6LZluxmtkUgKTJc8MAk/vSCJoKfWK6+kVu7oMqGAyW/wuQ==} + eslint-plugin-react-naming-convention@5.10.0: + resolution: {integrity: sha512-RsXF/F/3nUtYylmpIRTggPEmw7qRPZItqNLt04AV84rqNY0/S5fVm0dqn39VoBbW+B8v23O1Ve8pvk0aib1N2g==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - eslint-plugin-react-rsc@5.9.2: - resolution: {integrity: sha512-jb5nqTKn7ODscQWffvdUIy4qE+QJIL2tHY+7NlPFjfduPhnw2Daphx7qW0qfX5qSe1rcxQCBMDiEkS2/H6lgIA==} + eslint-plugin-react-rsc@5.10.0: + resolution: {integrity: sha512-7dXZFg9p8u+J27cu8oKwrpw+KVEZSPASMluGsd05GfKPRE9HlN7zTA0fVb15lfeIGQ/JPp5DfZp3Nd4LlDdcJw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - eslint-plugin-react-web-api@5.9.2: - resolution: {integrity: sha512-uw/yBHdciPPsYEiuBABLfKYOtPaCBJmcKwxybEdKqIZFTCAweVlRqqucNulKEsWE1CnA5p6e25AyzUMB8xBgMw==} + eslint-plugin-react-web-api@5.10.0: + resolution: {integrity: sha512-VCX8fS6kFTTpC+XWD6NqdMK2PKDV1YgpDcMA/jTaWn3Goypui0kZUBUDF7kApq7zsHp3zAWmt5UexvuSsOqyRQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' - eslint-plugin-react-x@5.9.2: - resolution: {integrity: sha512-aex/DzgcGdYF46LKShrTYVmZFWEd7lrX9PD85pADbTUmFpQoovGFQOK3nO6uqPUCrMuG97g/v66RyfzPBx0g5A==} + eslint-plugin-react-x@5.10.0: + resolution: {integrity: sha512-ekvV8vYLp62dO3558ArIp+7oQLvd0jOJPvoxomzNBOJmiekFaVJifxaCxkcRB1l6yI4Rs2b9lnm5M+/YDTzoSQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' @@ -1656,8 +1618,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.4.1: - resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1808,8 +1770,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.6.0: - resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} gopd@1.2.0: @@ -1941,8 +1903,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + js-yaml@5.2.0: + resolution: {integrity: sha512-YeLUMlvR4Ou1B119LIaM0r65JvbOBooJDc9yEu0dClb/uSC5P4FrLU8OCCz/HXWvtPoIrR0dRzABTjo1sTN9Bw==} hasBin: true jsdoc-type-pratt-parser@7.2.0: @@ -1970,8 +1932,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.16.1: - resolution: {integrity: sha512-TKMn1rxgH6h9vXR9Y0B+Cq7AdPTr9EI02IwoT65NzqYUkvoDQAaJ/aPybiFpAhZ1px6cNYYwXf86iHkBgzCo9w==} + knip@6.23.0: + resolution: {integrity: sha512-2DvAOX2pZWiG4SLvRRxOAU0aWGEn1ZoVblI541xIoXFdHqq2THMZXy66/qcY5WGuW3TXhb9T1x1zd/Hd1u+yqg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2053,8 +2015,8 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lint-staged@17.0.7: - resolution: {integrity: sha512-JrSobt+tW3rH8IOMi8tDZd3foorM5yPEkLD/V2NxobgHrFfHWGee4MOLVuZeScgxftEwbHrPHIFA/ZL+nUJeuA==} + lint-staged@17.0.8: + resolution: {integrity: sha512-B2P/d+jVW0UXOQ0MVMLrB/9ydA1P+zz6jYfdrbbEd9ur3S2rcbduFWKiUCC02Sm5hbC8nrm7y24WuYMG54HfxA==} engines: {node: '>=22.22.1'} hasBin: true @@ -2180,8 +2142,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-parser@0.133.0: - resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} + oxc-parser@0.137.0: + resolution: {integrity: sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==} engines: {node: ^20.19.0 || >=22.12.0} oxc-resolver@11.21.3: @@ -2263,13 +2225,13 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - playwright-core@1.60.0: - resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} engines: {node: '>=18'} hasBin: true - playwright@1.60.0: - resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} engines: {node: '>=18'} hasBin: true @@ -2297,8 +2259,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.4: - resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} + prettier@3.9.1: + resolution: {integrity: sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==} engines: {node: '>=14'} hasBin: true @@ -2409,8 +2371,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.1.3: + resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2555,9 +2517,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tailwindcss@4.3.0: - resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tailwindcss@4.3.1: resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==} @@ -2618,8 +2577,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo@2.9.18: - resolution: {integrity: sha512-bwabv6PupzeavybzEoArBAkwq5fnzwf8OFnRtpHwnviFWuwJPFxtyH+aVp36TmIqK3aYYgtTJ3J0m2ysxxSzQg==} + turbo@2.10.0: + resolution: {integrity: sha512-o016H9PPtuH2deb3mh3Vci3Avfi9UYgM/RONQisY7HnloupP0IFSbFS3gFYJgFJP8nwBrByHWFQIDa8T2zIXPw==} hasBin: true type-check@0.4.0: @@ -2630,8 +2589,8 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - typescript-eslint@8.61.0: - resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} + typescript-eslint@8.62.0: + resolution: {integrity: sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2642,13 +2601,16 @@ packages: engines: {node: '>=14.17'} hasBin: true - unbash@3.0.0: - resolution: {integrity: sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA==} + unbash@4.0.2: + resolution: {integrity: sha512-8gwNZ29+0/3zmXw7ToIHZtg6wK37xnniRUdBt7B27xZxaxfgR5tGMaGHT0t0dLtBV9fXE7zurh0s6Z1DHVjfWg==} engines: {node: '>=14'} undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici@7.28.0: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} @@ -2676,13 +2638,13 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.1.0: + resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2719,20 +2681,20 @@ packages: yaml: optional: true - vitest@4.1.8: - resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@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 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2915,6 +2877,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -2925,6 +2893,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -2945,105 +2918,105 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': dependencies: - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/ast@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) string-ts: 2.3.1 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint-react/core@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/core@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint-react/eslint-plugin@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint-plugin@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) - eslint-plugin-react-dom: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-jsx: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-naming-convention: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-rsc: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-web-api: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-x: 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) + eslint-plugin-react-dom: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-jsx: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-naming-convention: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-rsc: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-web-api: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-x: 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint-react/eslint@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/jsx@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/shared@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 zod: 4.4.3 transitivePeerDependencies: - supports-color - '@eslint-react/var@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/var@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@eslint/compat@2.1.0(eslint@10.4.1(jiti@2.7.0))': + '@eslint/compat@2.1.0(eslint@10.6.0(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) '@eslint/config-array@0.23.5': dependencies: @@ -3061,9 +3034,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.4.1(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.6.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -3123,71 +3096,78 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@oxc-parser/binding-android-arm-eabi@0.133.0': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.137.0': optional: true - '@oxc-parser/binding-android-arm64@0.133.0': + '@oxc-parser/binding-android-arm64@0.137.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.133.0': + '@oxc-parser/binding-darwin-arm64@0.137.0': optional: true - '@oxc-parser/binding-darwin-x64@0.133.0': + '@oxc-parser/binding-darwin-x64@0.137.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.133.0': + '@oxc-parser/binding-freebsd-x64@0.137.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.133.0': + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.133.0': + '@oxc-parser/binding-linux-arm64-musl@0.137.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.133.0': + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.133.0': + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.133.0': + '@oxc-parser/binding-linux-x64-gnu@0.137.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.133.0': + '@oxc-parser/binding-linux-x64-musl@0.137.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.133.0': + '@oxc-parser/binding-openharmony-arm64@0.137.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.133.0': + '@oxc-parser/binding-wasm32-wasi@0.137.0': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.133.0': + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.133.0': + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.133.0': + '@oxc-parser/binding-win32-x64-msvc@0.137.0': optional: true - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.137.0': {} '@oxc-resolver/binding-android-arm-eabi@11.21.3': optional: true @@ -3250,11 +3230,9 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.21.3': optional: true - '@package-json/types@0.0.12': {} - - '@playwright/test@1.60.0': + '@playwright/test@1.61.1': dependencies: - playwright: 1.60.0 + playwright: 1.61.1 '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': dependencies: @@ -3268,53 +3246,53 @@ snapshots: react: 19.2.7 react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.1.3': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-darwin-arm64@1.1.3': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.1.3': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-freebsd-x64@1.1.3': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.1.3': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.1.3': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.3': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.1.3': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.1.3': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-musl@1.1.3': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-openharmony-arm64@1.1.3': optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': + '@rolldown/binding-wasm32-wasi@1.1.3': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.1.3': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.1.3': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3386,12 +3364,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1 '@tailwindcss/oxide-win32-x64-msvc': 4.3.1 - '@tailwindcss/vite@4.3.1(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.1(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.1 '@tailwindcss/oxide': 4.3.1 tailwindcss: 4.3.1 - vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0) '@testing-library/dom@10.4.1': dependencies: @@ -3413,22 +3391,22 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@turbo/darwin-64@2.9.18': + '@turbo/darwin-64@2.10.0': optional: true - '@turbo/darwin-arm64@2.9.18': + '@turbo/darwin-arm64@2.10.0': optional: true - '@turbo/linux-64@2.9.18': + '@turbo/linux-64@2.10.0': optional: true - '@turbo/linux-arm64@2.9.18': + '@turbo/linux-arm64@2.10.0': optional: true - '@turbo/windows-64@2.9.18': + '@turbo/windows-64@2.10.0': optional: true - '@turbo/windows-arm64@2.9.18': + '@turbo/windows-arm64@2.10.0': optional: true '@tybys/wasm-util@0.10.3': @@ -3455,6 +3433,11 @@ snapshots: dependencies: undici-types: 7.18.2 + '@types/node@26.0.1': + dependencies: + undici-types: 8.3.0 + optional: true + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -3465,15 +3448,15 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/parser': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/type-utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.62.0 + eslint: 10.6.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3481,23 +3464,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - debug: 4.4.3 - eslint: 10.4.1(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.61.0(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/scope-manager': 8.62.0 + '@typescript-eslint/types': 8.62.0 + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.62.0 debug: 4.4.3 + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -3511,67 +3485,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.61.0': - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - '@typescript-eslint/scope-manager@8.62.0': dependencies: '@typescript-eslint/types': 8.62.0 '@typescript-eslint/visitor-keys': 8.62.0 - '@typescript-eslint/tsconfig-utils@8.61.0(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - '@typescript-eslint/tsconfig-utils@8.62.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.4.1(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.61.0': {} - '@typescript-eslint/types@8.62.0': {} - '@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.61.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.62.0(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.62.0(typescript@6.0.3) @@ -3587,33 +3523,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.61.0': - dependencies: - '@typescript-eslint/types': 8.61.0 - eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.62.0': dependencies: '@typescript-eslint/types': 8.62.0 @@ -3691,15 +3611,15 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': + '@vitest/coverage-v8@4.1.9(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.8 + '@vitest/utils': 4.1.9 ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -3708,46 +3628,54 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + vitest: 4.1.9(@types/node@24.13.2)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/expect@4.1.8': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.8 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.8': + '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0) + + '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.8': + '@vitest/runner@4.1.9': dependencies: - '@vitest/utils': 4.1.8 + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.8': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.8': {} + '@vitest/spy@4.1.9': {} - '@vitest/utils@4.1.8': + '@vitest/utils@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 + '@vitest/pretty-format': 4.1.9 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -4000,10 +3928,10 @@ snapshots: optionalDependencies: unrs-resolver: 1.12.2 - eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0)): + eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)))(eslint@10.6.0(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) get-tsconfig: 4.14.0 is-bun-module: 2.0.0 @@ -4011,17 +3939,16 @@ snapshots: tinyglobby: 0.2.17 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)): dependencies: - '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.62.0 comment-parser: 1.4.7 debug: 4.4.3 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 minimatch: 10.2.5 @@ -4029,11 +3956,11 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@63.0.2(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-jsdoc@63.0.10(eslint@10.6.0(jiti@2.7.0)): dependencies: '@es-joy/jsdoccomment': 0.87.0 '@es-joy/resolve.exports': 1.2.0 @@ -4041,7 +3968,7 @@ snapshots: comment-parser: 1.4.7 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -4053,93 +3980,93 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-dom@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-jsx@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-jsx@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-naming-convention@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-rsc@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-rsc@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-web-api@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) birecord: 0.1.1 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) ts-pattern: 5.9.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-x@5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.9.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.10.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/type-utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 - eslint: 10.4.1(jiti@2.7.0) + eslint: 10.6.0(jiti@2.7.0) string-ts: 2.3.1 ts-api-utils: 2.5.0(typescript@6.0.3) ts-pattern: 5.9.0 @@ -4158,9 +4085,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.4.1(jiti@2.7.0): + eslint@10.6.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.6.0 @@ -4355,7 +4282,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.6.0: {} + globals@17.7.0: {} gopd@1.2.0: {} @@ -4461,7 +4388,7 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.2.0: + js-yaml@5.2.0: dependencies: argparse: 2.0.1 @@ -4503,19 +4430,19 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.16.1: + knip@6.23.0: dependencies: fdir: 6.5.0(picomatch@4.0.4) formatly: 0.3.0 get-tsconfig: 4.14.0 jiti: 2.7.0 - oxc-parser: 0.133.0 + oxc-parser: 0.137.0 oxc-resolver: 11.21.3 picomatch: 4.0.4 smol-toml: 1.7.0 strip-json-comments: 5.0.3 tinyglobby: 0.2.17 - unbash: 3.0.0 + unbash: 4.0.2 yaml: 2.9.0 zod: 4.4.3 @@ -4573,7 +4500,7 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lint-staged@17.0.7: + lint-staged@17.0.8: dependencies: listr2: 10.2.2 picomatch: 4.0.4 @@ -4687,30 +4614,30 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-parser@0.133.0: + oxc-parser@0.137.0: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.137.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.133.0 - '@oxc-parser/binding-android-arm64': 0.133.0 - '@oxc-parser/binding-darwin-arm64': 0.133.0 - '@oxc-parser/binding-darwin-x64': 0.133.0 - '@oxc-parser/binding-freebsd-x64': 0.133.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.133.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.133.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.133.0 - '@oxc-parser/binding-linux-arm64-musl': 0.133.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.133.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.133.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.133.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.133.0 - '@oxc-parser/binding-linux-x64-gnu': 0.133.0 - '@oxc-parser/binding-linux-x64-musl': 0.133.0 - '@oxc-parser/binding-openharmony-arm64': 0.133.0 - '@oxc-parser/binding-wasm32-wasi': 0.133.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.133.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.133.0 - '@oxc-parser/binding-win32-x64-msvc': 0.133.0 + '@oxc-parser/binding-android-arm-eabi': 0.137.0 + '@oxc-parser/binding-android-arm64': 0.137.0 + '@oxc-parser/binding-darwin-arm64': 0.137.0 + '@oxc-parser/binding-darwin-x64': 0.137.0 + '@oxc-parser/binding-freebsd-x64': 0.137.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.137.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.137.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.137.0 + '@oxc-parser/binding-linux-arm64-musl': 0.137.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.137.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-musl': 0.137.0 + '@oxc-parser/binding-openharmony-arm64': 0.137.0 + '@oxc-parser/binding-wasm32-wasi': 0.137.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.137.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.137.0 + '@oxc-parser/binding-win32-x64-msvc': 0.137.0 oxc-resolver@11.21.3: optionalDependencies: @@ -4801,11 +4728,11 @@ snapshots: picomatch@4.0.4: {} - playwright-core@1.60.0: {} + playwright-core@1.61.1: {} - playwright@1.60.0: + playwright@1.61.1: dependencies: - playwright-core: 1.60.0 + playwright-core: 1.61.1 optionalDependencies: fsevents: 2.3.2 @@ -4827,7 +4754,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.4: {} + prettier@3.9.1: {} pretty-format@27.5.1: dependencies: @@ -4921,26 +4848,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.0.3: + rolldown@1.1.3: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.137.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm64': 1.1.3 + '@rolldown/binding-darwin-arm64': 1.1.3 + '@rolldown/binding-darwin-x64': 1.1.3 + '@rolldown/binding-freebsd-x64': 1.1.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 + '@rolldown/binding-linux-arm64-gnu': 1.1.3 + '@rolldown/binding-linux-arm64-musl': 1.1.3 + '@rolldown/binding-linux-ppc64-gnu': 1.1.3 + '@rolldown/binding-linux-s390x-gnu': 1.1.3 + '@rolldown/binding-linux-x64-gnu': 1.1.3 + '@rolldown/binding-linux-x64-musl': 1.1.3 + '@rolldown/binding-openharmony-arm64': 1.1.3 + '@rolldown/binding-wasm32-wasi': 1.1.3 + '@rolldown/binding-win32-arm64-msvc': 1.1.3 + '@rolldown/binding-win32-x64-msvc': 1.1.3 router@2.2.0: dependencies: @@ -5093,8 +5020,6 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@4.3.0: {} - tailwindcss@4.3.1: {} tapable@2.3.3: {} @@ -5142,14 +5067,14 @@ snapshots: tslib@2.8.1: optional: true - turbo@2.9.18: + turbo@2.10.0: optionalDependencies: - '@turbo/darwin-64': 2.9.18 - '@turbo/darwin-arm64': 2.9.18 - '@turbo/linux-64': 2.9.18 - '@turbo/linux-arm64': 2.9.18 - '@turbo/windows-64': 2.9.18 - '@turbo/windows-arm64': 2.9.18 + '@turbo/darwin-64': 2.10.0 + '@turbo/darwin-arm64': 2.10.0 + '@turbo/linux-64': 2.10.0 + '@turbo/linux-arm64': 2.10.0 + '@turbo/windows-64': 2.10.0 + '@turbo/windows-arm64': 2.10.0 type-check@0.4.0: dependencies: @@ -5161,23 +5086,26 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - typescript-eslint@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color typescript@6.0.3: {} - unbash@3.0.0: {} + unbash@4.0.2: {} undici-types@7.18.2: {} + undici-types@8.3.0: + optional: true + undici@7.28.0: {} unpipe@1.0.0: {} @@ -5221,12 +5149,12 @@ snapshots: vary@1.1.2: {} - vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0): + vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.16 - rolldown: 1.0.3 + rolldown: 1.1.3 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.2 @@ -5234,15 +5162,28 @@ snapshots: jiti: 2.7.0 yaml: 2.9.0 - vitest@4.1.8(@types/node@24.13.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)): + vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0): dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.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 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.16 + rolldown: 1.1.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.0.1 + fsevents: 2.3.3 + jiti: 2.7.0 + yaml: 2.9.0 + + vitest@4.1.9(@types/node@24.13.2)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 es-module-lexer: 2.2.0 expect-type: 1.4.0 magic-string: 0.30.21 @@ -5254,11 +5195,40 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.13.2)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.2 - '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@vitest/coverage-v8': 4.1.9(vitest@4.1.9) + jsdom: 29.1.1 + transitivePeerDependencies: + - msw + + vitest@4.1.9(@types/node@26.0.1)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.2.0 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 26.0.1 + '@vitest/coverage-v8': 4.1.9(vitest@4.1.9) jsdom: 29.1.1 transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4608065cef00d..6ce663d737461 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,11 +3,11 @@ packages: - packages/* catalog: - "@vitest/coverage-v8": 4.1.8 + "@vitest/coverage-v8": 4.1.9 axios: ^1.18.1 jsdom: 29.1.1 - vite: 8.0.16 - vitest: 4.1.8 + vite: 8.1.0 + vitest: 4.1.9 minimumReleaseAge: 10080 From 6f1ad4b7328d1628ee1c54ae975123f2fa145ae9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:33:34 +0200 Subject: [PATCH 07/26] Update languages JSON (#321) The [update-langs](https://github.com/stats-organization/github-stats-extended/actions/workflows/update-langs.yml) action found new/updated languages in the [upstream languages JSON file](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml). Co-authored-by: martin-mfg <2026226+martin-mfg@users.noreply.github.com> --- packages/core/src/common/languageColors.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/core/src/common/languageColors.json b/packages/core/src/common/languageColors.json index 8d2dbe3cf1173..5c12f4393d350 100644 --- a/packages/core/src/common/languageColors.json +++ b/packages/core/src/common/languageColors.json @@ -44,6 +44,7 @@ "Awk": "#c30e9b", "B (Formal Method)": "#8aa8c5", "B4X": "#00e4ff", + "BAML": "#a855f7", "BASIC": "#ff0000", "BQN": "#2b7067", "Ballerina": "#FF5000", @@ -58,6 +59,7 @@ "Blade": "#f7523f", "BlitzBasic": "#00FFAE", "BlitzMax": "#cd6400", + "Blueprint": "#3584E4", "Bluespec": "#12223c", "Bluespec BH": "#12223c", "Boo": "#d4bec1", @@ -69,7 +71,7 @@ "Bru": "#F4AA41", "BuildStream": "#006bff", "C": "#555555", - "C#": "#178600", + "C#": "#7355dd", "C++": "#f34b7d", "C3": "#2563eb", "CAP CDS": "#0092d1", @@ -227,6 +229,7 @@ "Graphviz (DOT)": "#2596be", "Groovy": "#4298b8", "Groovy Server Pages": "#4298b8", + "GtkRC": "#7fe719", "HAProxy": "#106da9", "HCL": "#844FBA", "HIP": "#4F3A4F", @@ -416,6 +419,7 @@ "OpenSCAD": "#e5cd45", "Option List": "#476732", "Org": "#77aa99", + "OverPy": "#78b355", "OverpassQL": "#cce2aa", "Oxygene": "#cdd0e3", "Oz": "#fab738", @@ -445,10 +449,12 @@ "Portugol": "#f8bd00", "PostCSS": "#dc3a0c", "PostScript": "#da291c", + "Power Query": "#d38e0d", "PowerBuilder": "#8f0f8d", "PowerShell": "#012456", "Praat": "#c8506d", "Prisma": "#0c344b", + "Pro*C": "#bb8368", "Processing": "#0096D8", "Procfile": "#3B2F63", "Prolog": "#74283c", @@ -490,6 +496,7 @@ "Rebol": "#358a5b", "Record Jar": "#0673ba", "Red": "#f50000", + "Redscript": "#f44336", "Regular Expression": "#009a00", "Ren'Py": "#ff7f7f", "Rez": "#FFDAB3", @@ -659,6 +666,7 @@ "nanorc": "#2d004d", "nesC": "#94B0C7", "ooc": "#b0b77e", + "pkg-config": "#2b5e82", "q": "#0040cd", "reStructuredText": "#141414", "sed": "#64b970", From 807aa453d89d364604269b58f9035bfc680a02d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:34:52 +0200 Subject: [PATCH 08/26] ci(deps): Bump actions/checkout from 6.0.3 to 7.0.0 (#299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.
Release notes

Sourced from actions/checkout's releases.

v7.0.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v6.0.3...v7.0.0

Changelog

Sourced from actions/checkout's changelog.

Changelog

v7.0.0

v6.0.3

v6.0.2

v6.0.1

v6.0.0

v5.0.1

v5.0.0

v4.3.1

v4.3.0

v4.2.2

v4.2.1

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=6.0.3&new-version=7.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/generate-theme-doc.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-langs.yml | 2 +- .github/workflows/update-tags.yml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b2c8aae5eb43..db9a95007c650 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies @@ -59,7 +59,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies @@ -87,7 +87,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies @@ -108,7 +108,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies diff --git a/.github/workflows/generate-theme-doc.yml b/.github/workflows/generate-theme-doc.yml index 93789b8ba7893..9bd0334d531bd 100644 --- a/.github/workflows/generate-theme-doc.yml +++ b/.github/workflows/generate-theme-doc.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8618ad7bf9000..cf3b00fb5294c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: id-token: write steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies diff --git a/.github/workflows/update-langs.yml b/.github/workflows/update-langs.yml index 0feeed86e8448..a161b20560492 100644 --- a/.github/workflows/update-langs.yml +++ b/.github/workflows/update-langs.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Dependencies uses: ./.github/actions/install-dependencies diff --git a/.github/workflows/update-tags.yml b/.github/workflows/update-tags.yml index ea81a2e180919..36b8c2404cd4e 100644 --- a/.github/workflows/update-tags.yml +++ b/.github/workflows/update-tags.yml @@ -14,5 +14,5 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: haya14busa/action-update-semver@7d2c558640ea49e798d46539536190aff8c18715 # v1.5.1 From 4043488ee0b7b51d53bb809a048a0207679114e4 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:21:48 +0200 Subject: [PATCH 09/26] adjust repeat-recent (#341) * GitHub actually triggers the cron workflow every few hours. Because they are overloaded I suppose. This PR is an attempt to give the workflow more chances to be triggered. * Sometimes we run into secondary rate limiting of the GitHub API when repeating recent requests. Having less workers should fix this. --- .github/workflows/repeat-recent-requests.yml | 2 +- apps/backend/src/repeatRequests.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/repeat-recent-requests.yml b/.github/workflows/repeat-recent-requests.yml index 40987e5b2e66d..39220a8c91bcd 100644 --- a/.github/workflows/repeat-recent-requests.yml +++ b/.github/workflows/repeat-recent-requests.yml @@ -10,7 +10,7 @@ on: # │ │ │ │ │ # │ │ │ │ │ # * * * * * - - cron: "45 * * * *" + - cron: "15,45 * * * *" workflow_dispatch: jobs: diff --git a/apps/backend/src/repeatRequests.js b/apps/backend/src/repeatRequests.js index 29cddf318775e..582a135809136 100644 --- a/apps/backend/src/repeatRequests.js +++ b/apps/backend/src/repeatRequests.js @@ -66,6 +66,6 @@ export async function repeatRecentRequests() { if (urls.length === 0) { console.log("No recent requests found."); } else { - await makeRequests(urls, 5); + await makeRequests(urls, 3); } } From 1d9db07ed4ad419e7479fdf8afa8699878f013ac Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:49:41 +0200 Subject: [PATCH 10/26] fix color of theme switcher (#343) The latest daisyui upgrade changed the theme switcher's color in light mode. This PR reverts that change. --- apps/frontend/src/components/Generic/ThemePicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/components/Generic/ThemePicker.tsx b/apps/frontend/src/components/Generic/ThemePicker.tsx index 4fa7fe9f0bf39..a4397497f62d0 100644 --- a/apps/frontend/src/components/Generic/ThemePicker.tsx +++ b/apps/frontend/src/components/Generic/ThemePicker.tsx @@ -84,7 +84,7 @@ export function ThemePicker(): JSX.Element {
) : ( - [ - "", - "You will be able to customize your card in future steps.", - "", - "", - "Display the finished card on GitHub, Twitter/X, LinkedIn, or anywhere else!", - ][stage] + STAGE_LABELS[stage].description )} @@ -309,42 +242,8 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { {stage === 2 && ( diff --git a/apps/frontend/src/pages/Home/buildCardUrl.test.ts b/apps/frontend/src/pages/Home/buildCardUrl.test.ts index 2f36b4ad0c979..350eecd12c848 100644 --- a/apps/frontend/src/pages/Home/buildCardUrl.test.ts +++ b/apps/frontend/src/pages/Home/buildCardUrl.test.ts @@ -6,11 +6,14 @@ import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home import { CardType } from "../../models/CardType"; import { buildCardUrl } from "./buildCardUrl"; +import type { CardOptions } from "./cardOptions"; -const baseOptions = { - selectedCard: CardType.STATS, +const USER_ID = "john-github"; + +// Built inline instead of via `getDefaultCardOptions`, which imports +// `constants.ts` and needs a `window` global these node-based tests lack. +const baseOptions: CardOptions = { selectedUserId: "john", - userId: "john-github", repo: "repo1", gist: "gist1", wakatimeUser: "wakaUser", @@ -32,13 +35,13 @@ const baseOptions = { describe("buildCardUrl", () => { it("builds stats suffix with defaults", () => { - const result = buildCardUrl(baseOptions); + const result = buildCardUrl(USER_ID, CardType.STATS, baseOptions); expect(result.toString()).toBe("?username=john"); }); it("adds stats options", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.STATS, { ...baseOptions, showIcons: true, includeAllCommits: true, @@ -57,9 +60,8 @@ describe("buildCardUrl", () => { }); it("builds top-langs suffix", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.TOP_LANGS, { ...baseOptions, - selectedCard: CardType.TOP_LANGS, langsCount: 5, showTitle: false, }); @@ -70,9 +72,8 @@ describe("buildCardUrl", () => { }); it("builds pin suffix using userId not selectedUserId", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.PIN, { ...baseOptions, - selectedCard: CardType.PIN, showOwner: true, descriptionLines: 3, }); @@ -83,9 +84,8 @@ describe("buildCardUrl", () => { }); it("builds gist suffix", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.GIST, { ...baseOptions, - selectedCard: CardType.GIST, showOwner: true, }); @@ -93,9 +93,8 @@ describe("buildCardUrl", () => { }); it("builds wakatime suffix with percent and custom title", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.WAKATIME, { ...baseOptions, - selectedCard: CardType.WAKATIME, wakatimeUser: "waka", usePercent: true, customTitle: "My Stats", @@ -108,9 +107,8 @@ describe("buildCardUrl", () => { }); it("adds non-default layouts", () => { - const result = buildCardUrl({ + const result = buildCardUrl(USER_ID, CardType.TOP_LANGS, { ...baseOptions, - selectedCard: CardType.TOP_LANGS, selectedLanguagesLayout: { id: 2, value: "compact", label: "Compact" }, }); diff --git a/apps/frontend/src/pages/Home/buildCardUrl.ts b/apps/frontend/src/pages/Home/buildCardUrl.ts index b129930c71547..abab84e067010 100644 --- a/apps/frontend/src/pages/Home/buildCardUrl.ts +++ b/apps/frontend/src/pages/Home/buildCardUrl.ts @@ -1,4 +1,3 @@ -import type { SelectOption } from "../../components/Generic/Select"; import { DEFAULT_OPTION as LANGUAGES_DEFAULT_LAYOUT } from "../../components/Home/LanguagesLayoutSection"; import { DEFAULT_OPTION as STATS_DEFAULT_RANK } from "../../components/Home/StatsRankSection"; import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home/WakatimeLayoutSection"; @@ -6,51 +5,34 @@ import { CardType } from "../../models/CardType"; import { cardUrl } from "../../models/CardUrl"; import type { CardUrlBuilder } from "../../models/CardUrl"; -interface Options { - userId: string; - selectedUserId: string; - selectedCard: CardType; - repo: string; - gist: string; - wakatimeUser: string; - selectedStatsRank: SelectOption; - selectedLanguagesLayout: SelectOption; - selectedWakatimeLayout: SelectOption; - showTitle: boolean; - showOwner: boolean; - descriptionLines: number | undefined; - customTitle: string; - langsCount: number | undefined; - hideValues: boolean; - showAllStats: boolean; - showIcons: boolean; - includeAllCommits: boolean; - enableAnimations: boolean; - usePercent: boolean; -} +import type { CardOptions } from "./cardOptions"; + +export function buildCardUrl( + userId: string, + selectedCard: CardType, + options: CardOptions, +): CardUrlBuilder { + const { + selectedUserId, + repo, + gist, + wakatimeUser, + selectedStatsRank, + selectedLanguagesLayout, + selectedWakatimeLayout, + showTitle, + showOwner, + descriptionLines, + customTitle, + langsCount, + hideValues, + showAllStats, + showIcons, + includeAllCommits, + enableAnimations, + usePercent, + } = options; -export function buildCardUrl({ - userId, - selectedCard, - selectedUserId, - repo, - gist, - wakatimeUser, - selectedStatsRank, - selectedLanguagesLayout, - selectedWakatimeLayout, - showTitle, - showOwner, - descriptionLines, - customTitle, - langsCount, - hideValues, - showAllStats, - showIcons, - includeAllCommits, - enableAnimations, - usePercent, -}: Options): CardUrlBuilder { switch (selectedCard) { case CardType.STATS: { let url = cardUrl(CardType.STATS); diff --git a/apps/frontend/src/pages/Home/cardOptions.ts b/apps/frontend/src/pages/Home/cardOptions.ts new file mode 100644 index 0000000000000..7e9a3650a60e1 --- /dev/null +++ b/apps/frontend/src/pages/Home/cardOptions.ts @@ -0,0 +1,53 @@ +import type { SelectOption } from "../../components/Generic/Select"; +import { DEFAULT_OPTION as LANGUAGES_DEFAULT_LAYOUT } from "../../components/Home/LanguagesLayoutSection"; +import { DEFAULT_OPTION as STATS_DEFAULT_RANK } from "../../components/Home/StatsRankSection"; +import { DEFAULT_OPTION as WAKATIME_DEFAULT_LAYOUT } from "../../components/Home/WakatimeLayoutSection"; +import { DEMO_GIST, DEMO_REPO, DEMO_WAKATIME_USER } from "../../constants"; + +/** + * All user-tunable card parameters collected during the customize stage. + * Held as a single state object in `HomeScreen` and updated one key at a time. + */ +export interface CardOptions { + selectedUserId: string; + repo: string; + gist: string; + wakatimeUser: string; + selectedStatsRank: SelectOption; + selectedLanguagesLayout: SelectOption; + selectedWakatimeLayout: SelectOption; + showTitle: boolean; + showOwner: boolean; + descriptionLines: number | undefined; + customTitle: string; + langsCount: number | undefined; + hideValues: boolean; + showAllStats: boolean; + showIcons: boolean; + includeAllCommits: boolean; + enableAnimations: boolean; + usePercent: boolean; +} + +export function getDefaultCardOptions(userId: string): CardOptions { + return { + selectedUserId: userId, + repo: DEMO_REPO, + gist: DEMO_GIST, + wakatimeUser: DEMO_WAKATIME_USER, + selectedStatsRank: STATS_DEFAULT_RANK, + selectedLanguagesLayout: LANGUAGES_DEFAULT_LAYOUT, + selectedWakatimeLayout: WAKATIME_DEFAULT_LAYOUT, + showTitle: true, + showOwner: false, + descriptionLines: undefined, + customTitle: "", + langsCount: undefined, + hideValues: false, + showAllStats: false, + showIcons: false, + includeAllCommits: true, + enableAnimations: true, + usePercent: false, + }; +} diff --git a/apps/frontend/src/pages/Home/stages/Customize.tsx b/apps/frontend/src/pages/Home/stages/Customize.tsx index 414231c0dae2d..50c828ec55d04 100644 --- a/apps/frontend/src/pages/Home/stages/Customize.tsx +++ b/apps/frontend/src/pages/Home/stages/Customize.tsx @@ -1,7 +1,6 @@ -import type { JSX, default as React } from "react"; +import type { JSX } from "react"; import { CardImage } from "../../../components/Card/CardImage"; -import type { SelectOption } from "../../../components/Generic/Select"; import { CheckboxSection } from "../../../components/Home/CheckboxSection"; import { LanguagesLayoutSection } from "../../../components/Home/LanguagesLayoutSection"; import { NumericSection } from "../../../components/Home/NumericSection"; @@ -18,96 +17,66 @@ import { CardType } from "../../../models/CardType"; import type { CardUrlBuilder } from "../../../models/CardUrl"; import type { StageIndex } from "../../../models/Stage"; import { useIsAuthenticated } from "../../../redux/selectors/userSelectors"; +import type { CardOptions } from "../cardOptions"; -type Updater = React.Dispatch>; +/** + * Extract the trailing path segments from pasted text, so pasting a full + * GitHub URL yields just the username (1 segment), owner/repo (2), or Gist id (1). + */ +function pastedPathTail(text: string, segments: number): string { + let value = text; + if (value.endsWith("/")) { + value = value.slice(0, -1); + } + const parts = value.split("/"); + if (parts.length > segments) { + value = parts.slice(-segments).join("/"); + } + return value; +} -/** @todo todo consider using React context API to avoid prop drilling */ interface CustomizeStageProps { selectedCard: CardType; - selectedStatsRank: SelectOption; - setSelectedStatsRank: Updater; - selectedLanguagesLayout: SelectOption; - setSelectedLanguagesLayout: Updater; - selectedWakatimeLayout: SelectOption; - setSelectedWakatimeLayout: Updater; - selectedUserId: string; - setSelectedUserId: Updater; - repo: string; - setRepo: Updater; - gist: string; - setGist: Updater; - wakatimeUser: string; - setWakatimeUser: Updater; - showTitle: boolean; - setShowTitle: Updater; - descriptionLines: number | undefined; - setDescriptionLines: Updater; - showOwner: boolean; - setShowOwner: Updater; - customTitle: string; - setCustomTitle: Updater; - langsCount: number | undefined; - setLangsCount: Updater; - hideValues: boolean; - setHideValues: Updater; - showIcons: boolean; - setShowIcons: Updater; - showAllStats: boolean; - setShowAllStats: Updater; - includeAllCommits: boolean; - setIncludeAllCommits: Updater; - enableAnimations: boolean; - setEnableAnimations: Updater; - usePercent: boolean; - setUsePercent: Updater; + options: CardOptions; + onOptionChange: ( + key: K, + value: CardOptions[K], + ) => void; card: CardUrlBuilder; setStage: (stageIndex: StageIndex) => void; } export function CustomizeStage({ selectedCard, - selectedStatsRank, - setSelectedStatsRank, - selectedLanguagesLayout, - setSelectedLanguagesLayout, - selectedWakatimeLayout, - setSelectedWakatimeLayout, - selectedUserId, - setSelectedUserId, - repo, - setRepo, - gist, - setGist, - wakatimeUser, - setWakatimeUser, - showTitle, - setShowTitle, - showOwner, - setShowOwner, - descriptionLines, - setDescriptionLines, - customTitle, - setCustomTitle, - langsCount, - setLangsCount, - hideValues, - setHideValues, - showIcons, - setShowIcons, - showAllStats, - setShowAllStats, - includeAllCommits, - setIncludeAllCommits, - enableAnimations, - setEnableAnimations, - usePercent, - setUsePercent, + options, + onOptionChange, card, setStage, }: CustomizeStageProps): JSX.Element { const cardType = selectedCard; const isAuthenticated = useIsAuthenticated(); + const { + selectedUserId, + repo, + gist, + wakatimeUser, + selectedStatsRank, + selectedLanguagesLayout, + selectedWakatimeLayout, + showTitle, + showOwner, + descriptionLines, + customTitle, + langsCount, + hideValues, + showAllStats, + showIcons, + includeAllCommits, + enableAnimations, + usePercent, + } = options; + return (
@@ -138,19 +107,16 @@ export function CustomizeStage({ } placeholder={`e.g. "${DEMO_USER}"`} value={selectedUserId} - onValueChange={setSelectedUserId} + onValueChange={(value) => { + onOptionChange("selectedUserId", value); + }} onPaste={(e) => { e.preventDefault(); - let newValue = e.clipboardData.getData("text"); // if the user pasted a full GitHub URL, extract username - if (newValue.endsWith("/")) { - newValue = newValue.slice(0, -1); - } - const parts = newValue.split("/"); - if (parts.length > 1) { - newValue = parts.slice(-1).join("/"); - } - setSelectedUserId(newValue); + onOptionChange( + "selectedUserId", + pastedPathTail(e.clipboardData.getData("text"), 1), + ); }} disabled={!isAuthenticated} /> @@ -182,19 +148,16 @@ export function CustomizeStage({ } placeholder={`e.g. "${DEMO_REPO}"`} value={repo} - onValueChange={setRepo} + onValueChange={(value) => { + onOptionChange("repo", value); + }} onPaste={(e) => { e.preventDefault(); - let newValue = e.clipboardData.getData("text"); // if the user pasted a full GitHub URL, extract owner/repo - if (newValue.endsWith("/")) { - newValue = newValue.slice(0, -1); - } - const parts = newValue.split("/"); - if (parts.length > 2) { - newValue = parts.slice(-2).join("/"); - } - setRepo(newValue); + onOptionChange( + "repo", + pastedPathTail(e.clipboardData.getData("text"), 2), + ); }} disabled={!isAuthenticated} /> @@ -226,19 +189,16 @@ export function CustomizeStage({ } placeholder={`e.g. "${DEMO_GIST}"`} value={gist} - onValueChange={setGist} + onValueChange={(value) => { + onOptionChange("gist", value); + }} onPaste={(e) => { e.preventDefault(); - let newValue = e.clipboardData.getData("text"); // if the user pasted a full GitHub URL, extract Gist ID - if (newValue.endsWith("/")) { - newValue = newValue.slice(0, -1); - } - const parts = newValue.split("/"); - if (parts.length > 1) { - newValue = parts.slice(-1).join("/"); - } - setGist(newValue); + onOptionChange( + "gist", + pastedPathTail(e.clipboardData.getData("text"), 1), + ); }} disabled={!isAuthenticated} /> @@ -261,7 +221,9 @@ export function CustomizeStage({ } placeholder={`e.g. "${DEMO_WAKATIME_USER}"`} value={wakatimeUser} - onValueChange={setWakatimeUser} + onValueChange={(value) => { + onOptionChange("wakatimeUser", value); + }} /> )} {cardType === CardType.STATS && ( @@ -270,13 +232,17 @@ export function CustomizeStage({ text="Show all available statistics." question="Show all stats?" checked={showAllStats} - onCheckedChange={setShowAllStats} + onCheckedChange={(checked) => { + onOptionChange("showAllStats", checked); + }} /> )} {cardType === CardType.STATS && ( { + onOptionChange("selectedStatsRank", option); + }} /> )} {cardType === CardType.STATS && ( @@ -285,7 +251,9 @@ export function CustomizeStage({ text="Show icons next to all stats." question="Show icons?" checked={showIcons} - onCheckedChange={setShowIcons} + onCheckedChange={(checked) => { + onOptionChange("showIcons", checked); + }} /> )} {cardType === CardType.STATS && ( @@ -294,19 +262,25 @@ export function CustomizeStage({ text="Count total commits or just commits of the last 365 days." question="Include all commits?" checked={includeAllCommits} - onCheckedChange={setIncludeAllCommits} + onCheckedChange={(checked) => { + onOptionChange("includeAllCommits", checked); + }} /> )} {cardType === CardType.TOP_LANGS && ( { + onOptionChange("selectedLanguagesLayout", option); + }} /> )} {cardType === CardType.WAKATIME && ( { + onOptionChange("selectedWakatimeLayout", option); + }} /> )} {(cardType === CardType.TOP_LANGS || @@ -321,7 +295,9 @@ export function CustomizeStage({ } value={langsCount} - onValueChange={setLangsCount} + onValueChange={(value) => { + onOptionChange("langsCount", value); + }} min={1} max={20} /> @@ -332,7 +308,9 @@ export function CustomizeStage({ text="Hide language percentages or bytes while keeping the selected layout visible." question="Hide values?" checked={hideValues} - onCheckedChange={setHideValues} + onCheckedChange={(checked) => { + onOptionChange("hideValues", checked); + }} /> )} {cardType === CardType.WAKATIME && ( @@ -341,7 +319,9 @@ export function CustomizeStage({ text="Show time spent in hours or percentages." question="Show percentages?" checked={usePercent} - onCheckedChange={setUsePercent} + onCheckedChange={(checked) => { + onOptionChange("usePercent", checked); + }} /> )} {(cardType === CardType.STATS || @@ -352,7 +332,9 @@ export function CustomizeStage({ text="Shows a title at the top of the card." question="Show title?" checked={showTitle} - onCheckedChange={setShowTitle} + onCheckedChange={(checked) => { + onOptionChange("showTitle", checked); + }} /> )} {(cardType === CardType.STATS || cardType === CardType.WAKATIME) && ( @@ -367,7 +349,9 @@ export function CustomizeStage({ } placeholder='e.g. "My GitHub Stats"' value={customTitle} - onValueChange={setCustomTitle} + onValueChange={(value) => { + onOptionChange("customTitle", value); + }} /> )} {(cardType === CardType.STATS || @@ -378,7 +362,9 @@ export function CustomizeStage({ // text="Enable Animations." question="enable animations?" checked={enableAnimations} - onCheckedChange={setEnableAnimations} + onCheckedChange={(checked) => { + onOptionChange("enableAnimations", checked); + }} /> )} {(cardType === CardType.PIN || cardType === CardType.GIST) && ( @@ -387,7 +373,9 @@ export function CustomizeStage({ text="Shows the repo owner's name next to the repo name." question="Show owner?" checked={showOwner} - onCheckedChange={setShowOwner} + onCheckedChange={(checked) => { + onOptionChange("showOwner", checked); + }} /> )} {cardType === CardType.PIN && ( @@ -402,7 +390,9 @@ export function CustomizeStage({ } value={descriptionLines} - onValueChange={setDescriptionLines} + onValueChange={(value) => { + onOptionChange("descriptionLines", value); + }} min={1} max={3} /> From 4ccec4604b7a0f067e7f2ab03cd77ba86105f269 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 12 Jul 2026 19:51:53 +0200 Subject: [PATCH 14/26] fix warnings (#342) Co-authored-by: Marco Pasqualetti --- .github/workflows/repeat-recent-requests.yml | 2 + packages/core/src/api/gist.js | 18 + packages/core/src/api/index.js | 19 + packages/core/src/api/pin.js | 18 + packages/core/src/api/top-langs.js | 18 + packages/core/src/api/wakatime.js | 18 + packages/core/src/cards/repo.js | 50 ++- packages/core/src/cards/stats.js | 30 +- packages/core/src/cards/top-languages.js | 60 ++- packages/core/src/cards/wakatime.js | 37 +- packages/core/src/common/Card.ts | 67 ++- packages/core/src/common/color.ts | 93 +++- packages/core/src/common/html.ts | 2 +- packages/core/src/common/render.ts | 104 ++++- packages/core/src/fetchers/repo.js | 2 +- packages/core/tests/color.test.ts | 122 +++++- packages/core/tests/html.test.ts | 10 +- packages/core/tests/render.test.ts | 27 ++ packages/core/tests/renderGistCard.test.js | 23 +- packages/core/tests/renderRepoCard.test.js | 18 +- packages/core/tests/renderStatsCard.test.js | 17 +- .../core/tests/renderTopLanguagesCard.test.js | 39 +- .../core/tests/renderWakatimeCard.test.js | 17 +- packages/core/tests/xss.test.js | 403 ++++++++++++++++++ 24 files changed, 1094 insertions(+), 120 deletions(-) create mode 100644 packages/core/tests/xss.test.js diff --git a/.github/workflows/repeat-recent-requests.yml b/.github/workflows/repeat-recent-requests.yml index 39220a8c91bcd..536199b728b70 100644 --- a/.github/workflows/repeat-recent-requests.yml +++ b/.github/workflows/repeat-recent-requests.yml @@ -13,6 +13,8 @@ on: - cron: "15,45 * * * *" workflow_dispatch: +permissions: {} + jobs: triggerRepeatRecent: if: | diff --git a/packages/core/src/api/gist.js b/packages/core/src/api/gist.js index ab35c654bfaeb..67505392b76f7 100644 --- a/packages/core/src/api/gist.js +++ b/packages/core/src/api/gist.js @@ -1,4 +1,5 @@ import { renderGistCard } from "../cards/gist.js"; +import { findInvalidColor } from "../common/color.js"; import { MissingParamError, retrieveSecondaryMessage, @@ -26,6 +27,23 @@ export default async ( }, pat = null, ) => { + const invalidColorInput = findInvalidColor({ + title_color, + icon_color, + text_color, + bg_color, + border_color, + }); + if (invalidColorInput) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`, + }), + }; + } + if (locale && !isLocaleAvailable(locale)) { return { status: "error - permanent", diff --git a/packages/core/src/api/index.js b/packages/core/src/api/index.js index 4751560082eab..87f6bfd9056cf 100644 --- a/packages/core/src/api/index.js +++ b/packages/core/src/api/index.js @@ -1,4 +1,5 @@ import { renderStatsCard } from "../cards/stats.js"; +import { findInvalidColor } from "../common/color.js"; import { MissingParamError, retrieveSecondaryMessage, @@ -44,6 +45,24 @@ export default async ( }, pat = null, ) => { + const invalidColorInput = findInvalidColor({ + title_color, + ring_color, + icon_color, + text_color, + bg_color, + border_color, + }); + if (invalidColorInput) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`, + }), + }; + } + if (locale && !isLocaleAvailable(locale)) { return { status: "error - permanent", diff --git a/packages/core/src/api/pin.js b/packages/core/src/api/pin.js index 118aa70cc2204..fe59500dfe228 100644 --- a/packages/core/src/api/pin.js +++ b/packages/core/src/api/pin.js @@ -1,4 +1,5 @@ import { renderRepoCard } from "../cards/repo.js"; +import { findInvalidColor } from "../common/color.js"; import { MissingParamError, retrieveSecondaryMessage, @@ -34,6 +35,23 @@ export default async ( }, pat = null, ) => { + const invalidColorInput = findInvalidColor({ + title_color, + icon_color, + text_color, + bg_color, + border_color, + }); + if (invalidColorInput) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`, + }), + }; + } + if (locale && !isLocaleAvailable(locale)) { return { status: "error - permanent", diff --git a/packages/core/src/api/top-langs.js b/packages/core/src/api/top-langs.js index 2ebc6218718df..46e106eeb6cac 100644 --- a/packages/core/src/api/top-langs.js +++ b/packages/core/src/api/top-langs.js @@ -1,4 +1,5 @@ import { renderTopLanguages } from "../cards/top-languages.js"; +import { findInvalidColor } from "../common/color.js"; import { MissingParamError, retrieveSecondaryMessage, @@ -38,6 +39,23 @@ export default async ( }, pat = null, ) => { + const invalidColorInput = findInvalidColor({ + title_color, + text_color, + bg_color, + prog_bar_bg_color, + border_color, + }); + if (invalidColorInput) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`, + }), + }; + } + if (locale && !isLocaleAvailable(locale)) { return { status: "error - permanent", diff --git a/packages/core/src/api/wakatime.js b/packages/core/src/api/wakatime.js index d9333f49a926c..7d03c58e49813 100644 --- a/packages/core/src/api/wakatime.js +++ b/packages/core/src/api/wakatime.js @@ -1,4 +1,5 @@ import { renderWakatimeCard } from "../cards/wakatime.js"; +import { findInvalidColor } from "../common/color.js"; import { MissingParamError, retrieveSecondaryMessage, @@ -32,6 +33,23 @@ export default async ({ display_format, disable_animations, }) => { + const invalidColorInput = findInvalidColor({ + title_color, + icon_color, + text_color, + bg_color, + border_color, + }); + if (invalidColorInput) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`, + }), + }; + } + if (locale && !isLocaleAvailable(locale)) { return { status: "error - permanent", diff --git a/packages/core/src/cards/repo.js b/packages/core/src/cards/repo.js index a352f357c1ea5..4150967d0284a 100644 --- a/packages/core/src/cards/repo.js +++ b/packages/core/src/cards/repo.js @@ -1,6 +1,6 @@ import { Card } from "../common/Card.js"; import { I18n } from "../common/I18n.js"; -import { getCardColors } from "../common/color.js"; +import { getCardColors, isPrefixedHexColor } from "../common/color.js"; import { kFormatter, wrapTextMultiline } from "../common/fmt.js"; import { encodeHTML } from "../common/html.js"; import { icons } from "../common/icons.js"; @@ -32,20 +32,29 @@ const DESCRIPTION_MAX_LINES = 3; * @param {string} textColor The color of the text. * @returns {string} Wrapped repo description SVG object. */ -const getBadgeSVG = (label, textColor, xOffset = 0) => ` - - - - ${label} - - -`; +const getBadgeSVG = (label, textColor, xOffset = 0) => { + if (!isPrefixedHexColor(textColor)) { + throw new Error(`Invalid text color: "${textColor}"`); + } + if (!Number.isFinite(xOffset)) { + throw new Error(`Invalid xOffset: "${xOffset}"`); + } + + return ` + + + + ${encodeHTML(label)} + + + `; +}; /** * @typedef {import("../fetchers/types").RepositoryData} RepositoryData Repository data. @@ -110,6 +119,7 @@ const renderRepoCard = (repo, options = {}) => { }); let repoFilter = encodeURIComponent(buildSearchFilter([nameWithOwner], [])); + const encodedUsername = encodeURIComponent(username); const STATS = {}; if (show.includes("prs_authored")) { STATS.prs_authored = { @@ -117,7 +127,7 @@ const renderRepoCard = (repo, options = {}) => { label: i18n.t("repocard.prs-authored"), value: totalPRsAuthored, id: "prs_authored", - link: `https://github.com/search?q=${repoFilter}author%3A${username}&type=pullrequests`, + link: `https://github.com/search?q=${repoFilter}author%3A${encodedUsername}&type=pullrequests`, }; } if (show.includes("prs_commented")) { @@ -126,7 +136,7 @@ const renderRepoCard = (repo, options = {}) => { label: i18n.t("repocard.prs-commented"), value: totalPRsCommented, id: "prs_commented", - link: `https://github.com/search?q=${repoFilter}commenter%3A${username}+-author%3A${username}&type=pullrequests`, + link: `https://github.com/search?q=${repoFilter}commenter%3A${encodedUsername}+-author%3A${encodedUsername}&type=pullrequests`, }; } if (show.includes("prs_reviewed")) { @@ -135,7 +145,7 @@ const renderRepoCard = (repo, options = {}) => { label: i18n.t("repocard.prs-reviewed"), value: totalPRsReviewed, id: "prs_reviewed", - link: `https://github.com/search?q=${repoFilter}reviewed-by%3A${username}+-author%3A${username}&type=pullrequests`, + link: `https://github.com/search?q=${repoFilter}reviewed-by%3A${encodedUsername}+-author%3A${encodedUsername}&type=pullrequests`, }; } if (show.includes("issues_authored")) { @@ -144,7 +154,7 @@ const renderRepoCard = (repo, options = {}) => { label: i18n.t("repocard.issues-authored"), value: totalIssuesAuthored, id: "issues_authored", - link: `https://github.com/search?q=${repoFilter}author%3A${username}&type=issues`, + link: `https://github.com/search?q=${repoFilter}author%3A${encodedUsername}&type=issues`, }; } if (show.includes("issues_commented")) { @@ -153,7 +163,7 @@ const renderRepoCard = (repo, options = {}) => { label: i18n.t("repocard.issues-commented"), value: totalIssuesCommented, id: "issues_commented", - link: `https://github.com/search?q=${repoFilter}commenter%3A${username}+-author%3A${username}&type=issues`, + link: `https://github.com/search?q=${repoFilter}commenter%3A${encodedUsername}+-author%3A${encodedUsername}&type=issues`, }; } diff --git a/packages/core/src/cards/stats.js b/packages/core/src/cards/stats.js index cbaf2b61f3e43..cd65180eed967 100644 --- a/packages/core/src/cards/stats.js +++ b/packages/core/src/cards/stats.js @@ -3,6 +3,7 @@ import { I18n } from "../common/I18n.js"; import { getCardColors } from "../common/color.js"; import { CustomError } from "../common/error.js"; import { kFormatter } from "../common/fmt.js"; +import { encodeHTML } from "../common/html.js"; import { icons, rankIcon } from "../common/icons.js"; import { buildSearchFilter, clampValue } from "../common/ops.js"; import { flexLayout, measureText } from "../common/render.js"; @@ -52,8 +53,10 @@ const LONG_LOCALES = [ /** * Create a stats card text item. * + * The caller must ensure that the passed `icon` and `link` are properly sanitized! + * * @param {object} params Object that contains the createTextNode parameters. - * @param {string} params.icon The icon to display. + * @param {string} params.icon The sanitized icon to display. * @param {string} params.label The label to display. * @param {number} params.value The value to display. * @param {string} params.id The id of the stat. @@ -64,7 +67,7 @@ const LONG_LOCALES = [ * @param {boolean} params.bold Whether to bold the label. * @param {string} params.numberFormat The format of numbers on card. * @param {number=} params.numberPrecision The precision of numbers on card. - * @param {string} params.link Url to link to. + * @param {string} params.link Sanitized url to link to. * @param {number} params.labelXOffset horizontal offset for label. * @returns {string} The stats card text item SVG object. */ @@ -83,6 +86,16 @@ const createTextNode = ({ link, labelXOffset = 25, }) => { + if (!Number.isFinite(labelXOffset)) { + throw new Error(`Invalid labelXOffset: "${labelXOffset}"`); + } + if (!Number.isFinite(shiftValuePos)) { + throw new Error(`Invalid shiftValuePos: "${shiftValuePos}"`); + } + if (!Number.isFinite(index)) { + throw new Error(`Invalid index: "${index}"`); + } + const precision = typeof numberPrecision === "number" && !isNaN(numberPrecision) ? clampValue(numberPrecision, 0, 2) @@ -109,7 +122,7 @@ const createTextNode = ({ ${iconSvg} ${label}: + }" ${labelOffset} y="12.5">${encodeHTML(label)}: - ${name} - ${hideValues ? "" : `${displayValue}`} + ${encodeHTML(name)} + ${hideValues ? "" : `${encodeHTML(displayValue)}`} ${createProgressNode({ x: 0, y: 25, @@ -285,11 +290,15 @@ const createCompactLangNode = ({ const staggerDelay = (index + 3) * 150; const color = lang.color || "#858585"; + if (!isPrefixedHexColor(color)) { + throw new Error(`Invalid language color: "${color}"`); + } + return ` - ${lang.name} ${hideProgress || hideValues ? "" : displayValue} + ${encodeHTML(lang.name)} ${hideProgress || hideValues ? "" : encodeHTML(displayValue)} `; @@ -439,6 +448,11 @@ const renderCompactLayout = ( let progressOffset = 0; const compactProgressBar = langs .map((lang) => { + const langColor = lang.color || DEFAULT_LANG_COLOR; + if (!isPrefixedHexColor(langColor)) { + throw new Error(`Invalid language color: "${langColor}"`); + } + const percentage = parseFloat( ((lang.size / totalLanguageSize) * offsetWidth).toFixed(2), ); @@ -453,7 +467,7 @@ const renderCompactLayout = ( y="0" width="${progress}" height="8" - fill="${lang.color || "#858585"}" + fill="${langColor}" /> `; progressOffset += percentage; @@ -514,18 +528,23 @@ const renderDonutVerticalLayout = ( // Generate each donut vertical chart part for (const lang of langs) { + const langColor = lang.color || DEFAULT_LANG_COLOR; + if (!isPrefixedHexColor(langColor)) { + throw new Error(`Invalid language color: "${langColor}"`); + } + const percentage = (lang.size / totalLanguageSize) * 100; const circleLength = totalCircleLength * (percentage / 100); const delay = startDelayCoefficient * 100; circles.push(` - { // Generate each pie chart part for (const lang of langs) { + const langColor = lang.color || DEFAULT_LANG_COLOR; + if (!isPrefixedHexColor(langColor)) { + throw new Error(`Invalid language color: "${langColor}"`); + } + if (langs.length === 1) { paths.push(` { cy="${centerY}" r="${radius}" stroke="none" - fill="${lang.color}" + fill="${langColor}" data-testid="lang-pie" size="100" /> @@ -629,7 +653,7 @@ const renderPieLayout = (langs, totalLanguageSize, statsFormat, hideValues) => { data-testid="lang-pie" size="${percentage}" d="M ${centerX} ${centerY} L ${startPoint.x} ${startPoint.y} A ${radius} ${radius} 0 ${largeArcFlag} 1 ${endPoint.x} ${endPoint.y} Z" - fill="${lang.color}" + fill="${langColor}" /> `); @@ -716,12 +740,22 @@ const renderDonutLayout = ( statsFormat, hideValues, ) => { + if (!Number.isFinite(width)) { + throw new Error(`Invalid width: "${width}"`); + } + const centerX = width / 3; const centerY = width / 3; const radius = centerX - 60; const strokeWidth = 12; - const colors = langs.map((lang) => lang.color); + const colors = langs.map((lang) => { + const langColor = lang.color || DEFAULT_LANG_COLOR; + if (!isPrefixedHexColor(langColor)) { + throw new Error(`Invalid language color: "${langColor}"`); + } + return langColor; + }); const langsPercents = langs.map((lang) => parseFloat(((lang.size / totalLanguageSize) * 100).toFixed(2)), ); @@ -783,10 +817,14 @@ const renderDonutLayout = ( * @returns {string} No languages data SVG node string. */ const noLanguagesDataNode = ({ color, text, layout }) => { + if (!isPrefixedHexColor(color)) { + throw new Error(`Invalid text color: "${color}"`); + } + return ` ${text} + }" y="11" class="stat bold" fill="${color}">${encodeHTML(text)} `; }; diff --git a/packages/core/src/cards/wakatime.js b/packages/core/src/cards/wakatime.js index a717e753587fc..6e4e8a4ed37ce 100644 --- a/packages/core/src/cards/wakatime.js +++ b/packages/core/src/cards/wakatime.js @@ -1,6 +1,7 @@ import { Card } from "../common/Card.js"; import { I18n } from "../common/I18n.js"; -import { getCardColors } from "../common/color.js"; +import { getCardColors, isPrefixedHexColor } from "../common/color.js"; +import { encodeHTML } from "../common/html.js"; import languageColors from "../common/languageColors.json" with { type: "json" }; import { clampValue, lowercaseTrim } from "../common/ops.js"; import { createProgressNode, flexLayout } from "../common/render.js"; @@ -24,8 +25,12 @@ const TOTAL_TEXT_WIDTH = 275; * @returns {string} No coding activity SVG node string. */ const noCodingActivityNode = ({ color, text }) => { + if (!isPrefixedHexColor(color)) { + throw new Error(`Invalid text color: "${color}"`); + } + return ` - ${text} + ${encodeHTML(text)} `; }; @@ -58,6 +63,13 @@ const formatLanguageValue = ({ display_format, lang }) => { * @returns {string} The compact layout language SVG node. */ const createCompactLangNode = ({ lang, x, y, display_format }) => { + if (!Number.isFinite(x)) { + throw new Error(`Invalid x: "${x}"`); + } + if (!Number.isFinite(y)) { + throw new Error(`Invalid y: "${y}"`); + } + // @ts-ignore const color = languageColors[lang.name] || "#858585"; const value = formatLanguageValue({ display_format, lang }); @@ -66,7 +78,7 @@ const createCompactLangNode = ({ lang, x, y, display_format }) => { - ${lang.name} - ${value} + ${encodeHTML(lang.name)} - ${encodeHTML(value)} `; @@ -125,6 +137,13 @@ const createTextNode = ({ progressBarBackgroundColor, progressBarWidth, }) => { + if (!Number.isFinite(index)) { + throw new Error(`Invalid index: "${index}"`); + } + if (!Number.isFinite(progressBarWidth)) { + throw new Error(`Invalid progressBarWidth: "${progressBarWidth}"`); + } + const staggerDelay = (index + 3) * 150; const cardProgress = hideProgress ? null @@ -142,12 +161,12 @@ const createTextNode = ({ return ` - ${label}: + ${encodeHTML(label)}: ${value} + >${encodeHTML(value)} ${cardProgress} `; @@ -179,11 +198,15 @@ const recalculatePercentages = (languages) => { * @param {string} colors.textColor The text color. * @returns {string} Card CSS styles. */ -const getStyles = ({ +const getStyles = function ({ // eslint-disable-next-line no-unused-vars titleColor, textColor, -}) => { +}) { + if (!isPrefixedHexColor(textColor)) { + throw new Error(`Invalid text color: "${textColor}"`); + } + return ` .stat { font: 600 14px 'Segoe UI', Ubuntu, "Helvetica Neue", Sans-Serif; fill: ${textColor}; diff --git a/packages/core/src/common/Card.ts b/packages/core/src/common/Card.ts index 7ae629f83c8cf..00aac90dfc8fa 100644 --- a/packages/core/src/common/Card.ts +++ b/packages/core/src/common/Card.ts @@ -1,3 +1,4 @@ +import { isPrefixedHexColor, isValidGradient } from "./color.js"; import { encodeHTML } from "./html.js"; import { flexLayout } from "./render.js"; @@ -33,6 +34,8 @@ class Card { /** * Creates a new card instance. * + * The caller must ensure that the passed `titlePrefixIcon` is properly sanitized! + * * @param props Card arguments. * @param props.width Card width. * @param props.height Card height. @@ -40,7 +43,7 @@ class Card { * @param props.colors Card colors arguments. * @param props.customTitle Card custom title. * @param props.defaultTitle Card default title. - * @param props.titlePrefixIcon Card title prefix icon. + * @param props.titlePrefixIcon Sanitized card title prefix icon. */ constructor({ width = 100, @@ -65,13 +68,11 @@ class Card { this.hideBorder = false; this.hideTitle = false; - this.border_radius = border_radius; + this.border_radius = parseFloat(String(border_radius)); // returns theme based colors with proper overrides and defaults this.colors = colors; - this.title = encodeHTML( - customTitle === undefined ? defaultTitle : customTitle, - ); + this.title = customTitle === undefined ? defaultTitle : customTitle; this.css = ""; @@ -104,7 +105,9 @@ class Card { } /** - * @param value The CSS to add to the card. + * The caller must ensure that the passed `css` string is properly sanitized! + * + * @param value The sanitized CSS to add to the card. */ setCSS(value: string): void { this.css = value; @@ -121,10 +124,13 @@ class Card { * @param value Whether to hide the title or not. */ setHideTitle(value: boolean): void { - this.hideTitle = value; - if (value) { + if (value && !this.hideTitle) { this.height -= 30; } + if (!value && this.hideTitle) { + this.height += 30; + } + this.hideTitle = value; } /** @@ -144,7 +150,7 @@ class Card { y="0" class="header" data-testid="header" - >${this.title} + >${encodeHTML(this.title)} `; const prefixIcon = ` @@ -180,10 +186,12 @@ class Card { if (typeof this.colors.bgColor !== "object") { return ""; } + if (!isValidGradient(this.colors.bgColor)) { + throw new Error(`Invalid gradient: ${this.colors.bgColor.join(",")}`); + } const gradients = this.colors.bgColor.slice(1); - return typeof this.colors.bgColor === "object" - ? ` + return ` - ` - : ""; + `; } /** @@ -230,10 +237,38 @@ class Card { }; /** - * @param body The inner body of the card. + * The caller must ensure that the passed `body` string is properly sanitized! + * + * @param body The sanitized inner body of the card. * @returns The rendered card. */ render(body: string): string { + if (!Number.isFinite(this.border_radius)) { + throw new Error(`Invalid border radius: "${this.border_radius}"`); + } + if ( + this.colors.titleColor !== undefined && + !isPrefixedHexColor(this.colors.titleColor) + ) { + throw new Error(`Invalid title color: "${this.colors.titleColor}"`); + } + if ( + this.colors.borderColor !== undefined && + !isPrefixedHexColor(this.colors.borderColor) + ) { + throw new Error(`Invalid border color: "${this.colors.borderColor}"`); + } + if ( + this.colors.bgColor !== undefined && + !(typeof this.colors.bgColor === "object" + ? isValidGradient(this.colors.bgColor) + : isPrefixedHexColor(this.colors.bgColor)) + ) { + throw new Error( + `Invalid background color: ${String(this.colors.bgColor)}`, + ); + } + return ` - ${this.a11yTitle} - ${this.a11yDesc} + ${encodeHTML(this.a11yTitle)} + ${encodeHTML(this.a11yDesc)}