diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f01d2e5..c6b1aa80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,3 +59,6 @@ jobs: - name: Format run: pnpm run format:check + + - name: Lint + run: pnpm run lint diff --git a/.husky/pre-commit b/.husky/pre-commit index 2aa3d3a1..0204386f 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,5 @@ pnpm run format:check +pnpm run lint # TODO enable # npm test -# npm run lint # npx lint-staged diff --git a/apps/backend/api-renamed/index.js b/apps/backend/api-renamed/index.js index 47857c20..3f68ef85 100644 --- a/apps/backend/api-renamed/index.js +++ b/apps/backend/api-renamed/index.js @@ -87,7 +87,7 @@ export default async (req, res) => { ); } - const safePattern = /^[-\w\/.,]+$/; + const safePattern = /^[-\w/.,]+$/; if ( (username && !safePattern.test(username)) || (repo && !safePattern.test(repo)) || diff --git a/apps/backend/api-renamed/pin.js b/apps/backend/api-renamed/pin.js index bed3dd10..e34a4b9a 100644 --- a/apps/backend/api-renamed/pin.js +++ b/apps/backend/api-renamed/pin.js @@ -78,7 +78,7 @@ export default async (req, res) => { ); } - const safePattern = /^[-\w\/.,]+$/; + const safePattern = /^[-\w/.,]+$/; if ( (username && !safePattern.test(username)) || (repo && !safePattern.test(repo)) diff --git a/apps/backend/package.json b/apps/backend/package.json index cd803209..e70aefa4 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -35,16 +35,11 @@ "devDependencies": { "@actions/core": "^2.0.1", "@actions/github": "^6.0.1", - "@eslint/eslintrc": "^3.3.3", - "@eslint/js": "^9.39.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@uppercod/css-to-object": "^1.1.1", "axios-mock-adapter": "^2.1.0", "color-contrast-checker": "^2.1.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsdoc": "^61.5.0", "express": "^5.2.1", "globals": "^16.5.0", "hjson": "^3.2.2", diff --git a/apps/backend/src/common/html.js b/apps/backend/src/common/html.js index 2b1db470..3c5d44af 100644 --- a/apps/backend/src/common/html.js +++ b/apps/backend/src/common/html.js @@ -9,11 +9,14 @@ * @returns {string} Encoded string. */ const encodeHTML = (str) => { - return str - .replace(/[\u00A0-\u9999<>&](?!#)/gim, (i) => { - return "&#" + i.charCodeAt(0) + ";"; - }) - .replace(/\u0008/gim, ""); + return ( + str + .replace(/[\u00A0-\u9999<>&](?!#)/gim, (i) => { + return "&#" + i.charCodeAt(0) + ";"; + }) + // eslint-disable-next-line no-control-regex + .replace(/\u0008/gim, "") + ); }; export { encodeHTML }; diff --git a/apps/backend/src/common/ops.js b/apps/backend/src/common/ops.js index 0c3e3900..e9c9ab40 100644 --- a/apps/backend/src/common/ops.js +++ b/apps/backend/src/common/ops.js @@ -1,6 +1,7 @@ // @ts-check import toEmoji from "emoji-name-map"; +import { CustomError } from "./error.js"; const OWNER_AFFILIATIONS = ["OWNER", "COLLABORATOR", "ORGANIZATION_MEMBER"]; diff --git a/apps/backend/src/common/retryer.js b/apps/backend/src/common/retryer.js index 87fb3019..b0a6f9e1 100644 --- a/apps/backend/src/common/retryer.js +++ b/apps/backend/src/common/retryer.js @@ -2,8 +2,18 @@ import { CustomError } from "./error.js"; import { logger } from "./log.js"; -import { getUserAccessByKey, getUserAccessByName } from "./database.js"; +import { getUserAccessByName } from "./database.js"; +/** + * Returns a random integer from 0 (inclusive) to `max` (exclusive). + * + * The value is generated using `Math.random()` and uniformly distributed + * across the range. + * + * @param {number} max The upper bound (exclusive). Must be a positive number. + * + * @returns {number} A random integer `n` such that `0 <= n < max`. + */ function getRandomInt(max) { return Math.floor(Math.random() * max); } @@ -17,7 +27,7 @@ function getRandomInt(max) { * Try to execute the fetcher function until it succeeds or the max number of retries is reached. * * @param {FetcherFunction} fetcher The fetcher function. - * @param username GitHub username of the user whose PAT to use, if available + * @param {string?} username GitHub username of the user whose PAT to use, if available * @param {any} variables Object with arguments to pass to the fetcher function. * @returns {Promise} The response from the fetcher function. */ diff --git a/apps/backend/tests/bench/utils.js b/apps/backend/tests/bench/utils.js index f3b1e03e..cb7327f8 100644 --- a/apps/backend/tests/bench/utils.js +++ b/apps/backend/tests/bench/utils.js @@ -42,11 +42,22 @@ const measurePerformance = async (fn) => { * Computes basic & extended statistics. * * @param {bigint[]} samples Array of samples in nanoseconds. - * @returns {object} Stats + * @returns {{ + * runs: number + * min: number + * max: number + * average: number + * median: number + * p75: number + * p95: number + * p99: number + * stdev: number + * totalTime: number + * }} Stats */ const computeStats = (samples) => { const sorted = [...samples].sort((a, b) => (a < b ? -1 : 1)); - const toNumber = (b) => Number(b); // safe for typical short benches + const toNumber = (/** @type {bigint} */ b) => Number(b); // safe for typical short benches const n = sorted.length; const sum = sorted.reduce((a, b) => a + b, 0n); const avg = Number(sum) / n; @@ -54,7 +65,7 @@ const computeStats = (samples) => { n % 2 ? toNumber(sorted[(n - 1) / 2]) : (toNumber(sorted[n / 2 - 1]) + toNumber(sorted[n / 2])) / 2; - const p = (q) => { + const p = (/** @type {number} */ q) => { const idx = Math.min(n - 1, Math.floor((q / 100) * n)); return toNumber(sorted[idx]); }; @@ -120,7 +131,7 @@ export const runAndLogStats = async ( const stats = computeStats(processed); - const fmt = (ns) => formatTime(BigInt(Math.round(ns))); + const fmt = (/** @type {number} */ ns) => formatTime(BigInt(Math.round(ns))); console.log( `${fnName} | runs=${stats.runs} avg=${fmt(stats.average)} median=${fmt( stats.median, @@ -132,11 +143,37 @@ export const runAndLogStats = async ( return stats; }; +/** + * Creates an asymmetric matcher for approximate numeric equality. + * + * This helper is intended for use in test frameworks (e.g., Jest) where + * values need to be compared within a configurable decimal precision + * instead of strict equality. + * + * The comparison succeeds when: + * + * |actual - expected| < 10^(-precision) + * + * For example, with `precision = 3`, values must be within `0.001`. + * + * @param {number} expected The expected numeric value to compare against. + * + * @param {number} [precision=10] + * The number of decimal places of tolerance. Higher values mean stricter + * comparison. Internally converted to epsilon = 10^-precision. + * + * @returns {{ + * asymmetricMatch(actual: unknown): boolean, + * toAsymmetricMatcher(): string + * }} An object implementing Jest-style asymmetric matcher methods. + * + */ export function approxNumber(expected, precision = 10) { return { asymmetricMatch(actual) { - if (typeof actual !== "number" || typeof expected !== "number") + if (typeof actual !== "number" || typeof expected !== "number") { return false; + } const epsilon = Math.pow(10, -precision); return Math.abs(actual - expected) < epsilon; }, diff --git a/apps/frontend/.eslintrc.js b/apps/frontend/.eslintrc.js deleted file mode 100644 index 2d7bb796..00000000 --- a/apps/frontend/.eslintrc.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - env: { - browser: true, - es6: true, - }, - extends: ["plugin:prettier/recommended"], - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - ecmaVersion: 2020, - sourceType: "module", - }, - plugins: ["prettier"], - rules: { - "react/jsx-filename-extension": "off", - "react/forbid-prop-types": "off", - "react/destructuring-assignment": "off", - "import/prefer-default-export": "off", - "react/function-component-definition": "off", - "react/no-unstable-nested-components": "off", - "no-console": "off", - radix: "off", - "prettier/prettier": [ - "error", - { - endOfLine: "auto", - }, - ], - }, - overrides: [ - { - files: ["./src/backend/**/*"], - rules: { - "prettier/prettier": "off", - }, - }, - ], -}; diff --git a/apps/frontend/craco.config.js b/apps/frontend/craco.config.js index 031b0cd6..f231909f 100644 --- a/apps/frontend/craco.config.js +++ b/apps/frontend/craco.config.js @@ -2,6 +2,9 @@ const path = require("path"); const webpack = require("webpack"); module.exports = { + eslint: { + enable: false, + }, webpack: { alias: { dotenv: path.resolve(__dirname, "src/dotenv-browser-stub.js"), diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 57667e3b..62cc1e02 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -40,13 +40,6 @@ "devDependencies": { "@craco/craco": "^7.1.0", "autoprefixer": "^10.4.16", - "eslint": "8.53.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-prettier": "^5.0.1", - "eslint-plugin-react": "7.33.2", - "eslint-plugin-react-hooks": "4.6.0", "postcss": "^8.4.31", "prettier": "^3.0.3", "tailwindcss": "^3.3.5" diff --git a/apps/frontend/src/components/Card/SVG.js b/apps/frontend/src/components/Card/SVG.js index c19bd85d..3ba06b6a 100644 --- a/apps/frontend/src/components/Card/SVG.js +++ b/apps/frontend/src/components/Card/SVG.js @@ -1,6 +1,3 @@ -/* eslint-disable react/jsx-props-no-spreading */ -/* eslint-disable react/no-danger */ - import React, { useEffect, useRef, useState } from "react"; import PropTypes from "prop-types"; diff --git a/apps/frontend/src/components/Generic/Button.js b/apps/frontend/src/components/Generic/Button.js index 1f8ee2e0..0610679c 100644 --- a/apps/frontend/src/components/Generic/Button.js +++ b/apps/frontend/src/components/Generic/Button.js @@ -1,4 +1,3 @@ -/* eslint-disable react/jsx-props-no-spreading */ import React from "react"; import PropTypes from "prop-types"; diff --git a/apps/frontend/src/components/Home/CheckboxSection.js b/apps/frontend/src/components/Home/CheckboxSection.js index 051a7e87..dc5e540e 100644 --- a/apps/frontend/src/components/Home/CheckboxSection.js +++ b/apps/frontend/src/components/Home/CheckboxSection.js @@ -1,5 +1,3 @@ -/* eslint-disable react/no-danger */ - import React from "react"; import PropTypes from "prop-types"; diff --git a/apps/frontend/src/components/Home/NumericSection.js b/apps/frontend/src/components/Home/NumericSection.js index f1f8ddf0..5aa763fd 100644 --- a/apps/frontend/src/components/Home/NumericSection.js +++ b/apps/frontend/src/components/Home/NumericSection.js @@ -1,5 +1,3 @@ -/* eslint-disable react/no-danger */ - import React, { useEffect, useRef, useState } from "react"; import PropTypes from "prop-types"; diff --git a/apps/frontend/src/components/Home/TextSection.js b/apps/frontend/src/components/Home/TextSection.js index 785c803e..434d3b7e 100644 --- a/apps/frontend/src/components/Home/TextSection.js +++ b/apps/frontend/src/components/Home/TextSection.js @@ -1,5 +1,3 @@ -/* eslint-disable react/no-danger */ - import React, { useEffect, useRef, useState } from "react"; import PropTypes from "prop-types"; diff --git a/apps/frontend/src/constants.js b/apps/frontend/src/constants.js index 7d32a5d1..7f0f3172 100644 --- a/apps/frontend/src/constants.js +++ b/apps/frontend/src/constants.js @@ -1,4 +1,3 @@ -/* eslint-disable no-nested-ternary */ export const PROD = false; export const USE_LOGGER = true; diff --git a/apps/frontend/src/pages/App/AppTrends.js b/apps/frontend/src/pages/App/AppTrends.js index 69e36877..e1de250d 100644 --- a/apps/frontend/src/pages/App/AppTrends.js +++ b/apps/frontend/src/pages/App/AppTrends.js @@ -21,9 +21,15 @@ import { clearAxiosCache } from "../../axios-override"; function App() { const toMessage = (input) => { - if (typeof input === "string") return input; - if (input.reason?.message) return input.reason.message; - if (input.message) return input.message; + if (typeof input === "string") { + return input; + } + if (input.reason?.message) { + return input.reason.message; + } + if (input.message) { + return input.message; + } try { return JSON.stringify(input); } catch { diff --git a/apps/frontend/src/pages/App/Header.js b/apps/frontend/src/pages/App/Header.js index 5aa4d59c..26e3d0ff 100644 --- a/apps/frontend/src/pages/App/Header.js +++ b/apps/frontend/src/pages/App/Header.js @@ -1,5 +1,4 @@ -import React, { useState } from "react"; -import { useDispatch } from "react-redux"; +import React from "react"; import PropTypes from "prop-types"; import { Link } from "react-router-dom"; @@ -56,8 +55,6 @@ MobileLink.propTypes = propTypes; MobileLink.defaultProps = defaultProps; const Header = ({ stage, setStage }) => { - const dispatch = useDispatch(); - return ( <>
diff --git a/apps/frontend/src/pages/Home/Home.js b/apps/frontend/src/pages/Home/Home.js index 0af0974c..921a8747 100644 --- a/apps/frontend/src/pages/Home/Home.js +++ b/apps/frontend/src/pages/Home/Home.js @@ -76,6 +76,8 @@ const HomeScreen = ({ stage, setStage }) => { const [enableAnimations, setEnableAnimations] = useState(true); const [usePercent, setUsePercent] = useState(false); + const [theme, setTheme] = useState("default"); + const resetCustomization = () => { if (selectedCard === CardTypes.TOP_LANGS) { setLangsCount(4); @@ -204,7 +206,6 @@ const HomeScreen = ({ stage, setStage }) => { } // for stage four - const [theme, setTheme] = useState("default"); let themeSuffix = fullSuffix; if ( @@ -419,6 +420,7 @@ const HomeScreen = ({ stage, setStage }) => { )} {stage === 4 && ( { switch (selectedCard) { case CardTypes.STATS: @@ -432,17 +434,20 @@ const HomeScreen = ({ stage, setStage }) => { return `${wakatimeUser}_card`; } })()} + // eslint-disable-next-line consistent-return link={(() => { switch (selectedCard) { case CardTypes.STATS: case CardTypes.TOP_LANGS: return `https://${HOST}/api${themeSuffix}`; - case CardTypes.PIN: + + case CardTypes.PIN: { let myRepo = repo; if (!myRepo.includes("/")) { myRepo = `${userId}/${myRepo}`; } return `https://github.com/${myRepo}`; + } case CardTypes.GIST: return gistUrl; case CardTypes.WAKATIME: diff --git a/apps/frontend/src/pages/Home/stages/Display.js b/apps/frontend/src/pages/Home/stages/Display.js index 98a92d39..680ebc9c 100644 --- a/apps/frontend/src/pages/Home/stages/Display.js +++ b/apps/frontend/src/pages/Home/stages/Display.js @@ -13,8 +13,6 @@ import { classnames } from "../../../utils"; import { HOST } from "../../../constants"; const DisplayStage = ({ filename, link, themeSuffix, guestHint }) => { - const card = themeSuffix.split("?")[0]; - const downloadPNG = () => { saveSvgAsPng( document.getElementById("svgWrapper").shadowRoot.firstElementChild diff --git a/apps/frontend/src/redux/reducers/user.js b/apps/frontend/src/redux/reducers/user.js index f7569675..68feb118 100644 --- a/apps/frontend/src/redux/reducers/user.js +++ b/apps/frontend/src/redux/reducers/user.js @@ -7,7 +7,6 @@ const initialState = { privateAccess: null, }; -// eslint-disable-next-line default-param-last export default (state = initialState, action) => { switch (action.type) { case types.LOGIN: diff --git a/apps/frontend/src/redux/store.js b/apps/frontend/src/redux/store.js index f348f478..83646193 100644 --- a/apps/frontend/src/redux/store.js +++ b/apps/frontend/src/redux/store.js @@ -4,7 +4,11 @@ import loggerMiddleware from "./logger"; import rootReducer from "./reducers"; import { USE_LOGGER } from "../constants"; -export default function configureStore(intialState) { +/** + * @param {unknown?} initialState store initial state + * @returns {import('redux').Store} store + */ +export default function configureStore(initialState) { let middlewares = []; if (USE_LOGGER) { middlewares = [loggerMiddleware]; @@ -14,7 +18,7 @@ export default function configureStore(intialState) { const enhancers = [middlewareEnhancer]; const composedEnhancers = compose(...enhancers); - const store = createStore(rootReducer, intialState, composedEnhancers); + const store = createStore(rootReducer, initialState, composedEnhancers); return store; } diff --git a/apps/frontend/src/utils.js b/apps/frontend/src/utils.js index acebfd1a..97729f95 100644 --- a/apps/frontend/src/utils.js +++ b/apps/frontend/src/utils.js @@ -1,3 +1,7 @@ +/** + * @param {Array} args list of class names + * @returns string classname attribute + */ export function classnames(...args) { return args.join(" "); } diff --git a/apps/frontend/src/wakatime-override.js b/apps/frontend/src/wakatime-override.js index 42d26cfa..cd6d54ca 100644 --- a/apps/frontend/src/wakatime-override.js +++ b/apps/frontend/src/wakatime-override.js @@ -1,6 +1,8 @@ import axios from "axios"; import { HOST } from "./constants"; +// See https://github.com/stats-organization/github-stats-extended/pull/27#discussion_r2712184285 +// eslint-disable-next-line no-unused-vars const fetchWakatimeStats = async ({ username, api_domain }) => { if (!username) { throw new Error("missing parameter: username"); diff --git a/apps/frontend/tailwind.config.js b/apps/frontend/tailwind.config.js index ddbf3bb4..2d3205d9 100644 --- a/apps/frontend/tailwind.config.js +++ b/apps/frontend/tailwind.config.js @@ -1,4 +1,3 @@ -/* eslint-disable global-require */ /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/**/*.{js,jsx,ts,tsx}"], diff --git a/apps/backend/eslint.config.mjs b/eslint.config.js similarity index 60% rename from apps/backend/eslint.config.mjs rename to eslint.config.js index d1436874..b46303aa 100644 --- a/apps/backend/eslint.config.mjs +++ b/eslint.config.js @@ -1,32 +1,32 @@ -import globals from "globals"; -import path from "node:path"; import { fileURLToPath } from "node:url"; + +import { defineConfig } from "eslint/config"; +import globals from "globals"; import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; import jsdoc from "eslint-plugin-jsdoc"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import { includeIgnoreFile } from "@eslint/compat"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all, -}); +const gitignorePath = fileURLToPath(new URL(".gitignore", import.meta.url)); -export default [ - ...compat.extends("prettier"), +export default defineConfig( + includeIgnoreFile(gitignorePath, "Imported .gitignore patterns"), + js.configs.recommended, { + linterOptions: { + reportUnusedDisableDirectives: "error", + }, languageOptions: { globals: { ...globals.node, ...globals.browser, }, - - ecmaVersion: 2022, - sourceType: "module", }, plugins: { jsdoc, + react, + "react-hooks": reactHooks, }, rules: { "no-unexpected-multiline": "error", @@ -80,4 +80,33 @@ export default [ "jsdoc/require-jsdoc": "warn", }, }, -]; + { + files: ["apps/backend/**/*.{js}"], + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, + { + files: ["apps/frontend/**/*.{js,jsx}"], + plugins: { + react, + "react-hooks": reactHooks, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "react/no-array-index-key": "warn", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + }, + }, +); diff --git a/package.json b/package.json index 23be2e45..22ffc78c 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,29 @@ { "name": "root", "private": true, - "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48", + "type": "module", + "packageManager": "pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316", "devDependencies": { + "@eslint/compat": "2.0.1", + "@eslint/js": "9.39.2", + "eslint": "9.39.2", + "eslint-plugin-jsdoc": "61.7.1", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "globals": "16.5.0", "husky": "9.1.7", "prettier": "3.7.4" }, "scripts": { "prepare": "husky", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "lint": "eslint", + "lint:fix": "eslint --fix" }, "resolutions": { + "eslint": "9.39.2", + "eslint-plugin-react-hooks": "7.0.1", "@svgr/webpack": "^6.0.0", "resolve-url-loader": "^5.0.0", "webpack-dev-server": "^5.2.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0231f315..56e49e7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,8 @@ settings: excludeLinksFromLockfile: false overrides: + eslint: 9.39.2 + eslint-plugin-react-hooks: 7.0.1 '@svgr/webpack': ^6.0.0 resolve-url-loader: ^5.0.0 webpack-dev-server: ^5.2.2 @@ -13,6 +15,27 @@ importers: .: devDependencies: + '@eslint/compat': + specifier: 2.0.1 + version: 2.0.1(eslint@9.39.2(jiti@1.21.7)) + '@eslint/js': + specifier: 9.39.2 + version: 9.39.2 + eslint: + specifier: 9.39.2 + version: 9.39.2(jiti@1.21.7) + eslint-plugin-jsdoc: + specifier: 61.7.1 + version: 61.7.1(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-react: + specifier: 7.37.5 + version: 7.37.5(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-react-hooks: + specifier: 7.0.1 + version: 7.0.1(eslint@9.39.2(jiti@1.21.7)) + globals: + specifier: 16.5.0 + version: 16.5.0 husky: specifier: 9.1.7 version: 9.1.7 @@ -47,12 +70,6 @@ importers: '@actions/github': specifier: ^6.0.1 version: 6.0.1 - '@eslint/eslintrc': - specifier: ^3.3.3 - version: 3.3.3 - '@eslint/js': - specifier: ^9.39.2 - version: 9.39.2 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -68,15 +85,6 @@ importers: color-contrast-checker: specifier: ^2.1.0 version: 2.1.0 - eslint: - specifier: ^9.39.2 - version: 9.39.2(jiti@1.21.7) - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-jsdoc: - specifier: ^61.5.0 - version: 61.7.1(eslint@9.39.2(jiti@1.21.7)) express: specifier: ^5.2.1 version: 5.2.1 @@ -169,7 +177,7 @@ importers: version: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@8.53.0)(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2) + version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.7))(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2) react-select: specifier: ^5.8.0 version: 5.10.2(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -212,31 +220,10 @@ importers: devDependencies: '@craco/craco': specifier: ^7.1.0 - version: 7.1.0(@types/node@25.0.3)(postcss@8.5.6)(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@8.53.0)(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2))(typescript@4.9.5) + version: 7.1.0(@types/node@25.0.3)(postcss@8.5.6)(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.7))(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2))(typescript@4.9.5) autoprefixer: specifier: ^10.4.16 version: 10.4.23(postcss@8.5.6) - eslint: - specifier: 8.53.0 - version: 8.53.0 - eslint-config-airbnb: - specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.53.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.53.0))(eslint-plugin-react@7.33.2(eslint@8.53.0))(eslint@8.53.0) - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.1.2(eslint@8.53.0) - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0) - eslint-plugin-prettier: - specifier: ^5.0.1 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@9.1.2(eslint@8.53.0))(eslint@8.53.0)(prettier@3.7.4) - eslint-plugin-react: - specifier: 7.33.2 - version: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: - specifier: 4.6.0 - version: 4.6.0(eslint@8.53.0) postcss: specifier: ^8.4.31 version: 8.5.6 @@ -300,7 +287,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + eslint: 9.39.2 '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} @@ -1187,12 +1174,21 @@ packages: resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + eslint: 9.39.2 '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@2.0.1': + resolution: {integrity: sha512-yl/JsgplclzuvGFNqwNYV4XNPhP3l62ZOP9w/47atNAdmDtIFCx6X7CSk/SlWUuBGkT4Et/5+UD+WyvX2iiIWA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: 9.39.2 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1205,18 +1201,14 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/core@1.0.1': + resolution: {integrity: sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.53.0': - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.39.2': resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1250,19 +1242,10 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -1941,7 +1924,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: 9.39.2 typescript: '*' peerDependenciesMeta: typescript: @@ -1951,13 +1934,13 @@ packages: resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: 9.39.2 '@typescript-eslint/parser@5.62.0': resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: 9.39.2 typescript: '*' peerDependenciesMeta: typescript: @@ -1971,7 +1954,7 @@ packages: resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: '*' + eslint: 9.39.2 typescript: '*' peerDependenciesMeta: typescript: @@ -1998,7 +1981,7 @@ packages: resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: 9.39.2 '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} @@ -2331,6 +2314,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.6: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} @@ -3112,10 +3099,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3301,40 +3284,11 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-airbnb-base@15.0.0: - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - - eslint-config-airbnb@19.0.4: - resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} - engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-config-react-app@7.0.1: resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: - eslint: ^8.0.0 + eslint: 9.39.2 typescript: '*' peerDependenciesMeta: typescript: @@ -3370,14 +3324,14 @@ packages: peerDependencies: '@babel/plugin-syntax-flow': ^7.14.5 '@babel/plugin-transform-react-jsx': ^7.14.9 - eslint: ^8.1.0 + eslint: 9.39.2 eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + eslint: 9.39.2 peerDependenciesMeta: '@typescript-eslint/parser': optional: true @@ -3387,7 +3341,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: 9.39.2 jest: '*' peerDependenciesMeta: '@typescript-eslint/eslint-plugin': @@ -3399,54 +3353,36 @@ packages: resolution: {integrity: sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==} engines: {node: '>=20.11.0'} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: 9.39.2 eslint-plugin-jsx-a11y@6.10.2: resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint: 9.39.2 - eslint-plugin-prettier@5.5.4: - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint: 9.39.2 - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.33.2: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: 9.39.2 eslint-plugin-testing-library@5.11.1: resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: - eslint: ^7.5.0 || ^8.0.0 + eslint: 9.39.2 eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3471,15 +3407,9 @@ packages: resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: 9.39.2 webpack: ^5.0.0 - eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3498,10 +3428,6 @@ packages: resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@1.2.2: resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} engines: {node: '>=0.4.0'} @@ -3583,9 +3509,6 @@ packages: fast-defer@1.1.9: resolution: {integrity: sha512-JP7Xm9HuePSeTT1DI78NeE9eAQvgNb9qNP2jlyQrcx4jiWM189omV6oyd0xaUPWHPlKmvDzz6H1FfPWIDU+xfg==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -3621,10 +3544,6 @@ packages: picomatch: optional: true - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -3673,10 +3592,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -3709,7 +3624,7 @@ packages: resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: - eslint: '>= 6' + eslint: 9.39.2 typescript: '>= 2.7' vue-template-compiler: '*' webpack: '>= 4' @@ -3846,10 +3761,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -3917,6 +3828,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hjson@3.2.2: resolution: {integrity: sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==} hasBin: true @@ -4224,10 +4141,6 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -5100,10 +5013,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -5779,10 +5688,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - prettier@3.7.4: resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} @@ -5956,7 +5861,7 @@ packages: engines: {node: '>=14.0.0'} hasBin: true peerDependencies: - eslint: '*' + eslint: 9.39.2 react: '>= 16' typescript: ^3.2.1 || ^4 peerDependenciesMeta: @@ -6483,6 +6388,9 @@ packages: 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'} @@ -6769,10 +6677,6 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -7252,6 +7156,15 @@ 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.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + snapshots: '@actions/core@2.0.2': @@ -7332,11 +7245,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.28.5(@babel/core@7.28.5)(eslint@8.53.0)': + '@babel/eslint-parser@7.28.5(@babel/core@7.28.5)(eslint@9.39.2(jiti@1.21.7))': dependencies: '@babel/core': 7.28.5 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -8200,14 +8113,14 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@craco/craco@7.1.0(@types/node@25.0.3)(postcss@8.5.6)(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@8.53.0)(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2))(typescript@4.9.5)': + '@craco/craco@7.1.0(@types/node@25.0.3)(postcss@8.5.6)(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.7))(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2))(typescript@4.9.5)': dependencies: autoprefixer: 10.4.23(postcss@8.5.6) cosmiconfig: 7.1.0 cosmiconfig-typescript-loader: 1.0.9(@types/node@25.0.3)(cosmiconfig@7.1.0)(typescript@4.9.5) cross-spawn: 7.0.6 lodash: 4.17.21 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@8.53.0)(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.7))(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2) semver: 7.7.3 webpack-merge: 5.10.0 transitivePeerDependencies: @@ -8411,11 +8324,6 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@eslint-community/eslint-utils@4.9.1(eslint@8.53.0)': - dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': dependencies: eslint: 9.39.2(jiti@1.21.7) @@ -8423,6 +8331,12 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint/compat@2.0.1(eslint@9.39.2(jiti@1.21.7))': + dependencies: + '@eslint/core': 1.0.1 + optionalDependencies: + eslint: 9.39.2(jiti@1.21.7) + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -8439,19 +8353,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': + '@eslint/core@1.0.1': dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.3': dependencies: @@ -8467,8 +8371,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.53.0': {} - '@eslint/js@9.39.2': {} '@eslint/object-schema@2.1.7': {} @@ -8498,18 +8400,8 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': @@ -9457,15 +9349,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) debug: 4.4.3 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 @@ -9476,21 +9368,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.53.0)(typescript@4.9.5)': + '@typescript-eslint/experimental-utils@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + eslint: 9.39.2(jiti@1.21.7) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5)': + '@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.4.3 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -9501,12 +9393,12 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.53.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) debug: 4.4.3 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 @@ -9531,15 +9423,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@4.9.5)': + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) eslint-scope: 5.1.1 semver: 7.7.3 transitivePeerDependencies: @@ -9840,6 +9732,15 @@ snapshots: array-union@2.1.0: {} + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 @@ -10700,10 +10601,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -10937,51 +10834,23 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0))(eslint@8.53.0): - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.53.0 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0) - object.assign: 4.1.7 - object.entries: 1.1.9 - semver: 6.3.1 - - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.53.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.53.0))(eslint-plugin-react@7.33.2(eslint@8.53.0))(eslint@8.53.0): - dependencies: - eslint: 8.53.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0))(eslint@8.53.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.53.0) - eslint-plugin-react: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.53.0) - object.assign: 4.1.7 - object.entries: 1.1.9 - - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)): - dependencies: - eslint: 9.39.2(jiti@1.21.7) - - eslint-config-prettier@9.1.2(eslint@8.53.0): - dependencies: - eslint: 8.53.0 - - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@8.53.0)(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@9.39.2(jiti@1.21.7))(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5): dependencies: '@babel/core': 7.28.5 - '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@8.53.0) + '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@9.39.2(jiti@1.21.7)) '@rushstack/eslint-patch': 1.15.0 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) babel-preset-react-app: 10.1.0 confusing-browser-globals: 1.0.11 - eslint: 8.53.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@8.53.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.53.0) - eslint-plugin-react: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.53.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.53.0)(typescript@4.9.5) + eslint: 9.39.2(jiti@1.21.7) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-testing-library: 5.11.1(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -11000,25 +10869,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.53.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + eslint: 9.39.2(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@8.53.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@9.39.2(jiti@1.21.7)): dependencies: '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11027,9 +10896,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.53.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11041,18 +10910,18 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + eslint: 9.39.2(jiti@1.21.7) optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@4.9.5))(eslint@8.53.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5))(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) jest: 27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)) transitivePeerDependencies: - supports-color @@ -11078,7 +10947,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.53.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -11088,7 +10957,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -11097,44 +10966,43 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@9.1.2(eslint@8.53.0))(eslint@8.53.0)(prettier@3.7.4): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.7)): dependencies: - eslint: 8.53.0 - prettier: 3.7.4 - prettier-linter-helpers: 1.0.1 - synckit: 0.11.11 - optionalDependencies: - '@types/eslint': 9.6.1 - eslint-config-prettier: 9.1.2(eslint@8.53.0) + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2(jiti@1.21.7) + hermes-parser: 0.25.1 + zod: 4.3.5 + zod-validation-error: 4.0.2(zod@4.3.5) + transitivePeerDependencies: + - supports-color - eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): - dependencies: - eslint: 8.53.0 - - eslint-plugin-react@7.33.2(eslint@8.53.0): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@1.21.7)): dependencies: array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) estraverse: 5.3.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.9 object.fromentries: 2.0.8 - object.hasown: 1.1.4 object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@5.11.1(eslint@8.53.0)(typescript@4.9.5): + eslint-plugin-testing-library@5.11.1(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) + eslint: 9.39.2(jiti@1.21.7) transitivePeerDependencies: - supports-color - typescript @@ -11144,11 +11012,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -11162,59 +11025,16 @@ snapshots: eslint-visitor-keys@5.0.0: {} - eslint-webpack-plugin@3.2.0(eslint@8.53.0)(webpack@5.104.1): + eslint-webpack-plugin@3.2.0(eslint@9.39.2(jiti@1.21.7))(webpack@5.104.1): dependencies: '@types/eslint': 8.56.12 - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) jest-worker: 28.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.3 webpack: 5.104.1 - eslint@8.53.0: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.53.0) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.53.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - eslint@9.39.2(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) @@ -11268,12 +11088,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 5.0.0 - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@1.2.2: {} esprima@4.0.1: {} @@ -11407,8 +11221,6 @@ snapshots: fast-defer@1.1.9: {} - fast-diff@1.3.0: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -11441,10 +11253,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -11510,12 +11318,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -11536,7 +11338,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.53.0)(typescript@4.9.5)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)(webpack@5.104.1): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -11554,7 +11356,7 @@ snapshots: typescript: 4.9.5 webpack: 5.104.1 optionalDependencies: - eslint: 8.53.0 + eslint: 9.39.2(jiti@1.21.7) form-data@3.0.4: dependencies: @@ -11695,10 +11497,6 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@16.5.0: {} @@ -11755,6 +11553,12 @@ snapshots: he@1.2.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hjson@3.2.2: {} hoist-non-react-statics@3.3.2: @@ -12056,8 +11860,6 @@ snapshots: is-obj@1.0.1: {} - is-path-inside@3.0.3: {} - is-plain-obj@3.0.0: {} is-plain-object@2.0.4: @@ -13378,12 +13180,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.1 - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - object.values@1.2.1: dependencies: call-bind: 1.0.8 @@ -14036,10 +13832,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - prettier@3.7.4: {} pretty-bytes@5.6.0: {} @@ -14145,7 +13937,7 @@ snapshots: regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.20 - react-dev-utils@12.0.1(eslint@8.53.0)(typescript@4.9.5)(webpack@5.104.1): + react-dev-utils@12.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)(webpack@5.104.1): dependencies: '@babel/code-frame': 7.27.1 address: 1.2.2 @@ -14156,7 +13948,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.53.0)(typescript@4.9.5)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)(webpack@5.104.1) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -14229,7 +14021,7 @@ snapshots: '@remix-run/router': 1.23.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@8.53.0)(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.7))(react@18.3.1)(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5))(type-fest@0.21.3)(typescript@4.9.5)(yaml@2.8.2): dependencies: '@babel/core': 7.28.5 '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(webpack@5.104.1))(webpack@5.104.1) @@ -14246,9 +14038,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(webpack@5.104.1) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.53.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@8.53.0)(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.53.0)(webpack@5.104.1) + eslint: 9.39.2(jiti@1.21.7) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5))(eslint@9.39.2(jiti@1.21.7))(jest@27.5.1(ts-node@10.9.2(@types/node@25.0.3)(typescript@4.9.5)))(typescript@4.9.5) + eslint-webpack-plugin: 3.2.0(eslint@9.39.2(jiti@1.21.7))(webpack@5.104.1) file-loader: 6.2.0(webpack@5.104.1) fs-extra: 10.1.0 html-webpack-plugin: 5.6.5(webpack@5.104.1) @@ -14265,7 +14057,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.53.0)(typescript@4.9.5)(webpack@5.104.1) + react-dev-utils: 12.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5)(webpack@5.104.1) react-refresh: 0.11.0 resolve: 1.22.11 resolve-url-loader: 5.0.0 @@ -14947,6 +14739,11 @@ snapshots: 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.1 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -15252,8 +15049,6 @@ snapshots: type-fest@0.16.0: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-is@1.6.18: @@ -15872,3 +15667,9 @@ snapshots: yn@3.1.1: {} yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.3.5): + dependencies: + zod: 4.3.5 + + zod@4.3.5: {}