From 6f815eb0f71ed3f77781359f71cd9fbe1e1d1870 Mon Sep 17 00:00:00 2001 From: richardscull <106016833+richardscull@users.noreply.github.com> Date: Tue, 23 Dec 2025 06:48:38 +0200 Subject: [PATCH 1/5] feat: Use @richardscull/eslint-config config --- eslint.config.ts | 3 + package-lock.json | 4062 +++++++++++++++++++++++++++++++++++++++------ package.json | 12 +- 3 files changed, 3558 insertions(+), 519 deletions(-) create mode 100644 eslint.config.ts diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 0000000..6e42418 --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from "@richardscull/eslint-config"; + +export default defineConfig(); diff --git a/package-lock.json b/package-lock.json index 6d05066..988a7e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,6 +58,7 @@ }, "devDependencies": { "@hey-api/openapi-ts": "^0.66.7", + "@richardscull/eslint-config": "^1.0.0", "@svgr/webpack": "^8.1.0", "@types/js-cookie": "^3.0.6", "@types/lodash": "^4.17.21", @@ -65,9 +66,12 @@ "@types/react": "19.1.1", "@types/react-dom": "19.1.2", "dotenv-cli": "^8.0.0", - "eslint": "^8", + "eslint": "^9.39.2", "eslint-config-next": "^15.5.9", + "jiti": "^2.6.1", + "lint-staged": "^16.2.7", "postcss": "^8", + "simple-git-hooks": "^2.13.1", "tailwindcss": "^3.4.1", "typescript": "^5" } @@ -83,6 +87,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@altano/repository-tools": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@altano/repository-tools/-/repository-tools-2.0.1.tgz", + "integrity": "sha512-YE/52CkFtb+YtHPgbWPai7oo5N9AKnMuP5LM+i2AG7G1H2jdYBCO1iDnkDE3dZ3C1MIgckaF+d5PNRulgt0bdw==", + "dev": true, + "license": "ISC" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -124,7 +135,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -452,9 +462,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1831,6 +1841,18 @@ "resolved": "https://registry.npmjs.org/@bbob/types/-/types-4.2.0.tgz", "integrity": "sha512-bSCZnNg0VrPosBBUVkjBDYVKNEqwT0jTNuzvAuNrZkuILgUKtLYI9GHuT8rY4lZecCb7UqGDsHsYt0YJO36eJg==" }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", @@ -1840,60 +1862,311 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.78.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz", + "integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.46.4", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~7.0.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint-react/ast": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-2.3.13.tgz", + "integrity": "sha512-OP2rOhHYLx2nfd9uA9uACKZJN9z9rX9uuAMx4PjT75JNOdYr1GgqWQZcYCepyJ+gmVNCyiXcLXuyhavqxCSM8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.3.13", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/typescript-estree": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "string-ts": "^2.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/core": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-2.3.13.tgz", + "integrity": "sha512-4bWBE+1kApuxJKIrLJH2FuFtCbM4fXfDs6Ou8MNamGoX6hdynlntssvaMZTd/lk/L8dt01H/3btr7xBX4+4BNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "birecord": "^0.1.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/eff": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/eff/-/eff-2.3.13.tgz", + "integrity": "sha512-byXsssozwh3VaiqcOonAKQgLXgpMVNSxBWFjdfbNhW7+NttorSt950qtiw+P7A9JoRab1OuGYk4MDY5UVBno8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@eslint-react/eslint-plugin": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-2.3.13.tgz", + "integrity": "sha512-gq0Z0wADAXvJS8Y/Wk3isK7WIEcfrQGGGdWvorAv0T7MxPd3d32TVwdc1Gx3hVLka3fYq1BBlQ5Fr8e1VgNuIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/type-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "eslint-plugin-react-dom": "2.3.13", + "eslint-plugin-react-hooks-extra": "2.3.13", + "eslint-plugin-react-naming-convention": "2.3.13", + "eslint-plugin-react-web-api": "2.3.13", + "eslint-plugin-react-x": "2.3.13", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/shared": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-2.3.13.tgz", + "integrity": "sha512-ESE7dVeOXtem3K6BD6k2wJaFt35kPtTT9SWCL99LFk7pym4OEGoMxPcyB2R7PMWiVudwl63BmiOgQOdaFYPONg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.3.13", + "@typescript-eslint/utils": "^8.49.0", + "ts-pattern": "^5.9.0", + "zod": "^4.1.13" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/shared/node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@eslint-react/var": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-2.3.13.tgz", + "integrity": "sha512-BozBfUZkzzobD6x/M8XERAnZQ3UvZPsD49zTGFKKU9M/bgsM78HwzxAPLkiu88W55v3sO/Kqf8fQTXT4VEeZ/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", + "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@floating-ui/core": { @@ -2022,7 +2295,6 @@ "version": "0.66.7", "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.66.7.tgz", "integrity": "sha512-BQMrbiNTWPHwZQ2wMnFdKXVMR47P77hc8fuUseQmmXsXG3Rvt2qstXtlQPmbEds/RO5iTL+JKqdcbhPSWuu/og==", - "peer": true, "dependencies": { "@hey-api/json-schema-ref-parser": "1.0.5", "c12": "2.0.1", @@ -2061,19 +2333,26 @@ "react-hook-form": "^7.55.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2089,12 +2368,18 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@img/colour": { "version": "1.0.0", @@ -2223,22 +2508,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@img/sharp-libvips-linux-riscv64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", @@ -2554,6 +2823,29 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2628,9 +2920,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2646,6 +2938,19 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@next/env": { "version": "15.5.9", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz", @@ -2858,6 +3163,49 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@quansync/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@quansync/fs/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -5075,16 +5423,119 @@ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "node_modules/@richardscull/eslint-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@richardscull/eslint-config/-/eslint-config-1.0.0.tgz", + "integrity": "sha512-zEiUggqjUbIFf+Woy5mH5etVxg4g4putqMvDAPqMjS5rIOCwlJiNfbneh+/xawyozphUSPfYs8l2VNDZz/r6yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eslint-plugin": "^2.3.13", + "@eslint/js": "^9.39.2", + "@stylistic/eslint-plugin": "^5.6.1", + "@typescript-eslint/types": "^8.50.0", + "@unocss/eslint-config": "^66.5.10", + "defu": "^6.1.4", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-plugin-antfu": "^3.1.1", + "eslint-plugin-command": "^3.4.0", + "eslint-plugin-hyoban": "^0.6.1", + "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-jsonc": "^2.21.0", + "eslint-plugin-package-json": "^0.85.0", + "eslint-plugin-react-google-translate": "^0.1.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.26", + "eslint-plugin-regexp": "^2.10.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-tailwindcss": "4.0.0-beta.0", + "eslint-plugin-unicorn": "^62.0.0", + "eslint-plugin-unused-imports": "^4.3.0", + "globals": "^16.5.0", + "jsonc-eslint-parser": "^2.4.2", + "local-pkg": "^1.1.2", + "read-package-up": "^12.0.0", + "typescript-eslint": "^8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "node_modules/@richardscull/eslint-config/node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/@richardscull/eslint-config/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@richardscull/eslint-config/node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@richardscull/eslint-config/node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", "dev": true }, "node_modules/@schummar/icu-type-parser": { @@ -5098,6 +5549,53 @@ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.6.1.tgz", + "integrity": "sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.0", + "@typescript-eslint/types": "^8.47.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", @@ -5257,7 +5755,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5404,6 +5901,17 @@ "node": ">=10.13.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", @@ -5458,6 +5966,12 @@ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, "node_modules/@types/js-cookie": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", @@ -5491,12 +6005,18 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.1.tgz", "integrity": "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==", "devOptional": true, - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -5506,26 +6026,24 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", "devOptional": true, - "peer": true, "peerDependencies": { "@types/react": "^19.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", - "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", + "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/type-utils": "8.29.1", - "@typescript-eslint/utils": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/type-utils": "8.50.1", + "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5535,22 +6053,30 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.50.1", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", - "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", + "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4" }, "engines": { @@ -5562,36 +6088,74 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", + "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.1", + "@typescript-eslint/types": "^8.50.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", - "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", + "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1" + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", + "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", + "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", - "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", + "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5602,13 +6166,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", - "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", + "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5619,19 +6183,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", - "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", + "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/project-service": "8.50.1", + "@typescript-eslint/tsconfig-utils": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5641,7 +6206,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -5649,7 +6214,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -5670,15 +6234,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", - "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", + "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5689,17 +6253,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", - "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", + "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.29.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.50.1", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5710,9 +6274,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5721,160 +6285,518 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@unocss/config": { + "version": "66.5.10", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.5.10.tgz", + "integrity": "sha512-udBhfMe+2MU70ZdjnRLnwLQ+0EHYJ4f5JjjvHsfmQ0If4KeYmSStWBuX+/LHNQidhl487JiwW1lBDQ8pKHmbiw==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "@unocss/core": "66.5.10", + "unconfig": "^7.4.1" }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "node_modules/@unocss/core": { + "version": "66.5.10", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.5.10.tgz", + "integrity": "sha512-SEmPE4pWNn9VcCvZqovPwFGuG/j69W3zh+x1Ky4z/I2pnyoB0Y0lBmq22KVu/dwExe+ZKKTQpxa0j5rbE27rDQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "node_modules/@unocss/eslint-config": { + "version": "66.5.10", + "resolved": "https://registry.npmjs.org/@unocss/eslint-config/-/eslint-config-66.5.10.tgz", + "integrity": "sha512-kDoXTBZcI7RCdWPekKrjgiuRcNYfdwjEkG6HtS1++jM0LhK6QgaMfu4p+4j0gfAz86ZNotghM3u8aWO6Fu0nRA==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.0.0" + "@unocss/eslint-plugin": "66.5.10" }, "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "node_modules/@unocss/eslint-plugin": { + "version": "66.5.10", + "resolved": "https://registry.npmjs.org/@unocss/eslint-plugin/-/eslint-plugin-66.5.10.tgz", + "integrity": "sha512-Fzvl5ISMoGnALo9tqI15nNNWZza2ICqmzyujQCyzsxDZEVZzajNvt8wACVHoEz+dUZykjMPJqqdmX5ZijcPZ1w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "@typescript-eslint/utils": "^8.46.4", + "@unocss/config": "66.5.10", + "@unocss/core": "66.5.10", + "@unocss/rule-utils": "66.5.10", + "magic-string": "^0.30.21", + "synckit": "^0.11.11" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "node_modules/@unocss/rule-utils": { + "version": "66.5.10", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.5.10.tgz", + "integrity": "sha512-497GPWZpArNG25cto0Yq3/Yw+i0x7/N/ySq1HHeE3lB43sdmCv6+m6QEv14I/9/e5WJhQOmrY5LmHZYXC7xxMw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "@unocss/core": "^66.5.10", + "magic-string": "^0.30.21" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", @@ -6083,6 +7005,15 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -6094,6 +7025,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birecord": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/birecord/-/birecord-0.1.1.tgz", + "integrity": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -6123,9 +7061,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -6141,12 +7079,12 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -6155,6 +7093,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/c12": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz", @@ -6196,14 +7147,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/c12/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, "node_modules/c12/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -6293,9 +7236,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", "funding": [ { "type": "opencollective", @@ -6327,6 +7270,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -6369,6 +7319,22 @@ "node": ">=10" } }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/citty": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", @@ -6388,11 +7354,208 @@ "url": "https://polar.sh/cva" } }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -6453,6 +7616,12 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -6461,6 +7630,23 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6487,12 +7673,12 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -6796,12 +7982,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6891,6 +8077,19 @@ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -6899,6 +8098,19 @@ "node": ">=8" } }, + "node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -6909,23 +8121,21 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -7056,16 +8266,15 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.41", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", - "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true }, "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "peer": true + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==" }, "node_modules/embla-carousel-react": { "version": "8.6.0", @@ -7093,9 +8302,9 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7117,6 +8326,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7317,59 +8538,94 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "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.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "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.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-flat-gitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.1.0.tgz", + "integrity": "sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/compat": "^1.2.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^9.5.0" } }, "node_modules/eslint-config-next": { @@ -7399,6 +8655,50 @@ } } }, + "node_modules/eslint-fix-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/eslint-fix-utils/-/eslint-fix-utils-0.4.0.tgz", + "integrity": "sha512-nCEciwqByGxsKiWqZjqK7xfL+7dUX9Pi0UL3J0tOwfxVN9e6Y59UxEt1ZYsc3XH0ce6T1WQM/QU2DbKK/6IG7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@types/estree": ">=1", + "eslint": ">=8" + }, + "peerDependenciesMeta": { + "@types/estree": { + "optional": true + } + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -7444,6 +8744,28 @@ "eslint-plugin-import": "*" } }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz", + "integrity": "sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", @@ -7470,12 +8792,50 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-antfu": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-3.1.1.tgz", + "integrity": "sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-command": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-3.4.0.tgz", + "integrity": "sha512-EW4eg/a7TKEhG0s5IEti72kh3YOTlnhfFNuctq5WnB1fst37/IHTd5OkD+vnlRf3opTvUcSRihAateP6bT5ZcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@es-joy/jsdoccomment": "^0.78.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-hyoban": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-hyoban/-/eslint-plugin-hyoban-0.6.1.tgz", + "integrity": "sha512-DJI5rCIATcK2e4f7TMt1+sdMSXEAytcn469dLV0hSn4lVvVXsT6uLH/Pogj/cm+m6I8AuUWoHGj/OId5M8tLCg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "*" + } + }, "node_modules/eslint-plugin-import": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -7504,6 +8864,59 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -7534,6 +8947,33 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.0.tgz", + "integrity": "sha512-HttlxdNG5ly3YjP1cFMP62R4qKLxJURfBZo2gnMY+yQojZxkLyOpY1H1KRTKBmvQeSG9pIpSGEhDjE17vvYosg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "diff-sequences": "^27.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -7557,54 +8997,243 @@ "string.prototype.includes": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-package-json": { + "version": "0.85.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-package-json/-/eslint-plugin-package-json-0.85.0.tgz", + "integrity": "sha512-MrOxFvhbqLuk4FIPG9v3u9Amn0n137J8LKILHvgfxK3rRyAHEVzuZM0CtpXFTx7cx4LzmAzONtlpjbM0UFNuTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@altano/repository-tools": "^2.0.1", + "change-case": "^5.4.4", + "detect-indent": "^7.0.2", + "detect-newline": "^4.0.1", + "eslint-fix-utils": "~0.4.0", + "package-json-validator": "~0.59.0", + "semver": "^7.7.3", + "sort-object-keys": "^2.0.0", + "sort-package-json": "^3.4.0", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "eslint": ">=8.0.0", + "jsonc-eslint-parser": "^2.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-dom": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-2.3.13.tgz", + "integrity": "sha512-O9jglTOnnuyfJcSxjeVc8lqIp5kuS9/0MLLCHlOTH8ZjIifHHxUr6GZ2fd4la9y0FsoEYXEO7DBIMjWx2vCwjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/core": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "compare-versions": "^6.1.1", + "string-ts": "^2.3.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-google-translate": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-google-translate/-/eslint-plugin-react-google-translate-0.1.1.tgz", + "integrity": "sha512-70w3YW211yFSexWLshO+rSVtr6NDuA0qaU/ARVQ9pG0WFia5CyGFhKCed6LKKngdgfQTzjrcWlg7IPJehJwTsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "requireindex": "^1.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-hooks-extra": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-2.3.13.tgz", + "integrity": "sha512-NSnY8yvtrvu2FAALLuvc2xesIAkMqGyJgilpy8wEi1w/Nw6v0IwBEffoNKLq9OHW4v3nikud3aBTqWfWKOx67Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/core": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/type-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "string-ts": "^2.3.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-naming-convention": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-2.3.13.tgz", + "integrity": "sha512-2iler1ldFpB/PaNpN8WAVk6dKYKwKcoGm1j0JAAjdCrsfOTJ007ol2xTAyoHKAbMOvkZSi7qq90q+Q//RuhWwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/core": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/type-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "string-ts": "^2.3.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react-web-api": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-2.3.13.tgz", + "integrity": "sha512-+UypRPHP9GFMulIENpsC/J+TygWywiyz2mb4qyUP6y/IwdcSilk1MyF9WquNYKB/4/FN4Rl1oRm6WMbfkbpMnQ==", + "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" + "@eslint-react/ast": "2.3.13", + "@eslint-react/core": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "string-ts": "^2.3.1", + "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=4" + "node": ">=20.19.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "node_modules/eslint-plugin-react-x": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-2.3.13.tgz", + "integrity": "sha512-+m+V/5VLMxgx0VsFUUyflMNLQG0WFYspsfv0XJFqx7me3A2b3P20QatNDHQCYswz0PRbRFqinTPukPRhZh68ag==", "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.3.13", + "@eslint-react/core": "2.3.13", + "@eslint-react/eff": "2.3.13", + "@eslint-react/shared": "2.3.13", + "@eslint-react/var": "2.3.13", + "@typescript-eslint/scope-manager": "^8.49.0", + "@typescript-eslint/type-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/utils": "^8.49.0", + "compare-versions": "^6.1.1", + "is-immutable-type": "^5.0.1", + "string-ts": "^2.3.1", + "ts-api-utils": "^2.1.0", + "ts-pattern": "^5.9.0" + }, "engines": { - "node": ">=10" + "node": ">=20.19.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" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -7645,17 +9274,169 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-regexp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.10.0.tgz", + "integrity": "sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "comment-parser": "^1.4.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "refa": "^0.12.1", + "regexp-ast-analysis": "^0.7.1", + "scslre": "^0.3.0" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "eslint": ">=8.44.0" + } + }, + "node_modules/eslint-plugin-regexp/node_modules/jsdoc-type-pratt-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", + "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-tailwindcss": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-4.0.0-beta.0.tgz", + "integrity": "sha512-WWCajZgQu38Sd67ZCl2W6i3MRzqB0d+H8s4qV9iB6lBJbsDOIpIlj6R1Fj2FXkoWErbo05pZnZYbCGIU9o/DsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.5", + "postcss": "^8.4.4", + "synckit": "^0.11.4", + "tailwind-api-utils": "^1.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "tailwindcss": "^3.4.0 || ^4.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "62.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz", + "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "@eslint/plugin-kit": "^0.4.0", + "change-case": "^5.4.4", + "ci-info": "^4.3.1", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.46.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz", + "integrity": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7673,18 +9454,42 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7737,6 +9542,13 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7798,15 +9610,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -7836,24 +9648,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, "node_modules/for-each": { @@ -7913,12 +9737,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -7978,6 +9796,28 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -8041,9 +9881,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -8074,6 +9914,16 @@ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" }, + "node_modules/git-hooks-list": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", + "integrity": "sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -8129,15 +9979,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8181,7 +10028,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", @@ -8289,6 +10137,46 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -8323,22 +10211,31 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/internal-slot": { "version": "1.1.0", @@ -8457,6 +10354,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -8577,6 +10490,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-immutable-type": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-5.0.1.tgz", + "integrity": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@typescript-eslint/type-utils": "^8.0.0", + "ts-api-utils": "^2.0.0", + "ts-declaration-location": "^1.0.4" + }, + "peerDependencies": { + "eslint": "*", + "typescript": ">=4.7.4" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8613,13 +10542,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-regex": { @@ -8802,11 +10735,11 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-cookie": { @@ -8834,6 +10767,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -8882,6 +10825,43 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -8961,6 +10941,185 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "dev": true, + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8994,6 +11153,104 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9027,6 +11284,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -9063,6 +11330,18 @@ "node": ">=8.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9147,9 +11426,9 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/mz": { @@ -9162,6 +11441,18 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -9174,10 +11465,26 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" } }, "node_modules/natural-compare": { @@ -9736,11 +12043,26 @@ "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, + "node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9912,13 +12234,19 @@ "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz", "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "wrappy": "1" + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { @@ -9991,6 +12319,25 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, + "node_modules/package-json-validator": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/package-json-validator/-/package-json-validator-0.59.0.tgz", + "integrity": "sha512-WBTDKtO9pBa9GmA1sPbQHqlWxRdnHNfLFIIA49PPgV7px/rG27gHX57DWy77qyu374fla4veaIHy+gA+qRRuug==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^7.0.0", + "yargs": "~18.0.0" + }, + "bin": { + "pjv": "lib/bin/pjv.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10030,15 +12377,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -10102,6 +12440,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -10133,6 +12483,16 @@ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -10160,7 +12520,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -10318,6 +12677,23 @@ "node": ">=6" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10350,7 +12726,6 @@ "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10359,7 +12734,6 @@ "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -10371,7 +12745,6 @@ "version": "7.55.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -10491,6 +12864,75 @@ "pify": "^2.3.0" } }, + "node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10532,6 +12974,19 @@ "decimal.js-light": "^2.4.1" } }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -10586,6 +13041,30 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -10641,6 +13120,16 @@ "regjsparser": "bin/parser" } }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -10675,52 +13164,37 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -10800,6 +13274,21 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -10997,6 +13486,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-git-hooks": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz", + "integrity": "sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "simple-git-hooks": "cli.js" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -11005,6 +13504,49 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -11015,6 +13557,35 @@ "tslib": "^2.0.3" } }, + "node_modules/sort-object-keys": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.0.1.tgz", + "integrity": "sha512-R89fO+z3x7hiKPXX5P0qim+ge6Y60AjtlW+QQpRozrrNcR1lw9Pkpm5MLB56HoNvdcLHL4wbpq16OcvGpEDJIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.6.0.tgz", + "integrity": "sha512-fyJsPLhWvY7u2KsKPZn1PixbXp+1m7V8NWqU8CvgFRbMEX41Ffw1kD8n0CfJiGoaSfoAvbrqRRl/DcHO8omQOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.2", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.1.1", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.3", + "sort-object-keys": "^2.0.1", + "tinyglobby": "^0.2.15" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11031,6 +13602,68 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-ts": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.3.1.tgz", + "integrity": "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -11233,7 +13866,20 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -11366,6 +14012,53 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tailwind-api-utils/-/tailwind-api-utils-1.0.3.tgz", + "integrity": "sha512-KpzUHkH1ug1sq4394SLJX38ZtpeTiqQ1RVyFTTSY2XuHsNSTWUkRo108KmyyrMWdDbQrLYkSHaNKj/a3bmA4sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "local-pkg": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/hyoban" + }, + "peerDependencies": { + "tailwindcss": "^3.3.0 || ^4.0.0 || ^4.0.0-beta" + } + }, "node_modules/tailwind-merge": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", @@ -11379,7 +14072,6 @@ "version": "3.4.9", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -11420,6 +14112,14 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11458,12 +14158,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -11493,6 +14187,51 @@ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -11525,11 +14264,54 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-declaration-location/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/ts-pattern": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "dev": true, + "license": "MIT" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -11560,12 +14342,16 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11649,7 +14435,6 @@ "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11658,6 +14443,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", + "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.50.1", + "@typescript-eslint/parser": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/ufo": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", @@ -11693,6 +14502,71 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unconfig": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.4.2.tgz", + "integrity": "sha512-nrMlWRQ1xdTjSnSUqvYqJzbTBFugoqHobQj58B2bc8qxHKBBHMNNsWQFP3Cd3/JZK907voM2geYPWqD4VK3MPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "defu": "^6.1.4", + "jiti": "^2.6.1", + "quansync": "^1.0.0", + "unconfig-core": "7.4.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.4.2.tgz", + "integrity": "sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/unconfig/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -11739,10 +14613,58 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "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" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -11760,7 +14682,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -11846,6 +14768,27 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.1.tgz", + "integrity": "sha512-BM0Upcemlce8/9+HE+/VpWqn3u3mYh6Om/FEC8yPMnEHwf710fW5Q6fhjT1SQyRlZD1G9CJbgfH+rWgAcIvjlQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/vaul": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", @@ -12086,11 +15029,15 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "3.1.1", @@ -12099,14 +15046,99 @@ "dev": true }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 0e8c25d..1c0e906 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,11 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbo", "build": "next build", - "start": "next start", + "dev": "next dev --turbo", + "generate:openapi": "dotenv -e .env.local -- openapi-ts", "lint": "next lint", - "generate:openapi": "dotenv -e .env.local -- openapi-ts" + "start": "next start" }, "dependencies": { "@bbob/html": "^4.2.0", @@ -60,6 +60,7 @@ }, "devDependencies": { "@hey-api/openapi-ts": "^0.66.7", + "@richardscull/eslint-config": "^1.0.0", "@svgr/webpack": "^8.1.0", "@types/js-cookie": "^3.0.6", "@types/lodash": "^4.17.21", @@ -67,9 +68,12 @@ "@types/react": "19.1.1", "@types/react-dom": "19.1.2", "dotenv-cli": "^8.0.0", - "eslint": "^8", + "eslint": "^9.39.2", "eslint-config-next": "^15.5.9", + "jiti": "^2.6.1", + "lint-staged": "^16.2.7", "postcss": "^8", + "simple-git-hooks": "^2.13.1", "tailwindcss": "^3.4.1", "typescript": "^5" }, From 13d539417bfcce7aeb3f6117f62824d7ed34cda6 Mon Sep 17 00:00:00 2001 From: richardscull <106016833+richardscull@users.noreply.github.com> Date: Thu, 25 Dec 2025 10:51:07 +0200 Subject: [PATCH 2/5] feat: Set up lint --- .github/workflows/build.yml | 4 ++++ eslint.config.ts | 17 ++++++++++++++++- next.config.mjs | 6 +++--- package-lock.json | 29 +++++++++++++++++++++++++---- package.json | 10 ++++++++-- 5 files changed, 56 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e79fbb2..29b7828 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,6 +22,10 @@ jobs: run: | npm install + - name: Run Linter + run: | + npm run lint + - name: Build project run: | npm run build \ No newline at end of file diff --git a/eslint.config.ts b/eslint.config.ts index 6e42418..5a8747e 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,3 +1,18 @@ import { defineConfig } from "@richardscull/eslint-config"; -export default defineConfig(); +export default defineConfig({ + ignores: ["**/components/ui/**.tsx"], // shadcn/ui components, managed externally + tailwindCSS: true, +}, { + rules: { + "@eslint-react/hooks-extra/no-direct-set-state-in-use-effect": "off", + "@eslint-react/no-use-context": "off", + "@eslint-react/no-forward-ref": "off", + "react-refresh/only-export-components": "off", + "@eslint-react/no-unstable-context-value": "off", // TODO: Unsure if we want to enable this + "react-google-translate/no-conditional-text-nodes-with-siblings": "off", // TODO: Will be fixed with migration to useT (i18n) + + "unicorn/prefer-bigint-literals": "off", + "tailwindcss/no-custom-classname": "off", + }, +}); diff --git a/next.config.mjs b/next.config.mjs index 2befc7b..e20c888 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,8 +1,8 @@ -import createNextIntlPlugin from "next-intl/plugin"; - import path from "node:path"; import { fileURLToPath } from "node:url"; +import createNextIntlPlugin from "next-intl/plugin"; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -19,7 +19,7 @@ const nextConfig = { config.resolve.alias["next/link"] = path.resolve( __dirname, - "lib/overrides/next/link" + "lib/overrides/next/link", ); return config; diff --git a/package-lock.json b/package-lock.json index 988a7e7..8f19579 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@hey-api/openapi-ts": "^0.66.7", - "@richardscull/eslint-config": "^1.0.0", + "@richardscull/eslint-config": "^1.0.6", "@svgr/webpack": "^8.1.0", "@types/js-cookie": "^3.0.6", "@types/lodash": "^4.17.21", @@ -1890,6 +1890,26 @@ "node": ">=20.11.0" } }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", + "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -5424,12 +5444,13 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" }, "node_modules/@richardscull/eslint-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@richardscull/eslint-config/-/eslint-config-1.0.0.tgz", - "integrity": "sha512-zEiUggqjUbIFf+Woy5mH5etVxg4g4putqMvDAPqMjS5rIOCwlJiNfbneh+/xawyozphUSPfYs8l2VNDZz/r6yA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@richardscull/eslint-config/-/eslint-config-1.0.6.tgz", + "integrity": "sha512-sOJaUbN6ii7ljgbxIJ9PsLhDmjzWQyYaWPssU7l2Vw5aF75uCjzqiyRWr0G8RBNTxFW5sYiEC5xkIIwZRdDWWA==", "dev": true, "license": "MIT", "dependencies": { + "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", "@eslint-react/eslint-plugin": "^2.3.13", "@eslint/js": "^9.39.2", "@stylistic/eslint-plugin": "^5.6.1", diff --git a/package.json b/package.json index 1c0e906..6951f8b 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "build": "next build", "dev": "next dev --turbo", "generate:openapi": "dotenv -e .env.local -- openapi-ts", - "lint": "next lint", + "lint": "eslint --fix", "start": "next start" }, "dependencies": { @@ -60,7 +60,7 @@ }, "devDependencies": { "@hey-api/openapi-ts": "^0.66.7", - "@richardscull/eslint-config": "^1.0.0", + "@richardscull/eslint-config": "^1.0.6", "@svgr/webpack": "^8.1.0", "@types/js-cookie": "^3.0.6", "@types/lodash": "^4.17.21", @@ -81,5 +81,11 @@ "@types/react": "19.1.1", "@types/react-dom": "19.1.2", "react-is": "^19.0.0-rc-69d4b800-20241021" + }, + "simple-git-hooks": { + "pre-commit": "npx lint-staged" + }, + "lint-staged": { + "*": "eslint --fix" } } From b33a49ed9bbc88a177f75c5d995995a0f4f14f84 Mon Sep 17 00:00:00 2001 From: richardscull <106016833+richardscull@users.noreply.github.com> Date: Thu, 25 Dec 2025 10:51:13 +0200 Subject: [PATCH 3/5] feat: lint --- app/(admin)/admin/beatmaps/[id]/page.tsx | 17 +- .../admin/beatmaps/requests/layout.tsx | 3 +- app/(admin)/admin/beatmaps/requests/page.tsx | 49 +- app/(admin)/admin/beatmaps/search/layout.tsx | 3 +- app/(admin)/admin/beatmaps/search/page.tsx | 5 +- app/(admin)/admin/beatmapsets/[id]/layout.tsx | 18 +- app/(admin)/admin/beatmapsets/[id]/page.tsx | 122 +- .../components/BeatmapPerformanceTooltip.tsx | 52 +- .../components/BeatmapSetEvent.tsx | 29 +- .../components/BeatmapSetEvents.tsx | 25 +- .../components/BeatmapSetsEvents.tsx | 21 +- .../components/BeatmapStatusSelect.tsx | 6 +- ...tmapSuggestedSubmissionStatusesTooltip.tsx | 65 +- .../components/BeatmapsStatusTable.tsx | 99 +- .../components/serverStatusCards.tsx | 23 +- app/(admin)/admin/dashboard/layout.tsx | 3 +- app/(admin)/admin/dashboard/page.tsx | 12 +- .../edit/components/AdminUserBasicInfo.tsx | 28 +- .../edit/components/AdminUserConnections.tsx | 123 +- .../edit/components/AdminUserEmailInput.tsx | 13 +- .../[id]/edit/components/AdminUserImages.tsx | 50 +- .../components/AdminUserPrivilegeInput.tsx | 42 +- .../[id]/edit/components/AdminUserProfile.tsx | 33 +- .../components/AdminUserResetPassword.tsx | 40 +- .../components/AdminUserRestrictButton.tsx | 85 +- .../components/AdminUserUsernameInput.tsx | 40 +- .../components/Tabs/AdminUserEditEvents.tsx | 113 +- .../components/Tabs/AdminUserEditGeneral.tsx | 44 +- app/(admin)/admin/users/[id]/edit/layout.tsx | 8 +- app/(admin)/admin/users/[id]/edit/page.tsx | 55 +- .../users/components/AdminUserColumns.tsx | 128 +- .../users/components/AdminUserDataTable.tsx | 73 +- .../components/AdminUserEventsColumns.tsx | 85 +- .../components/AdminUserEventsDataTable.tsx | 73 +- .../components/AdminUserEventsFilters.tsx | 17 +- .../admin/users/components/UsersSearch.tsx | 108 +- app/(admin)/admin/users/search/layout.tsx | 3 +- app/(admin)/admin/users/search/page.tsx | 5 +- app/(admin)/components/AppSidebar.tsx | 29 +- app/(admin)/components/SidebarUser.tsx | 19 +- app/(admin)/layout.tsx | 7 +- .../(site)/components/BackgroundVideo.tsx | 14 +- .../(site)/components/RecentUsersIcons.tsx | 11 +- .../(site)/components/ServerStatus.tsx | 31 +- app/(website)/(site)/layout.tsx | 6 +- app/(website)/(site)/page.tsx | 98 +- app/(website)/api/getVideo/route.ts | 15 +- app/(website)/beatmaps/[id]/layout.tsx | 7 +- app/(website)/beatmaps/[id]/page.tsx | 18 +- app/(website)/beatmaps/search/layout.tsx | 7 +- app/(website)/beatmaps/search/page.tsx | 3 +- app/(website)/beatmapsets/[...ids]/layout.tsx | 24 +- app/(website)/beatmapsets/[...ids]/page.tsx | 238 +- .../components/BeatmapDropdown.tsx | 20 +- .../components/BeatmapInfoAccordion.tsx | 127 +- .../components/BeatmapLeaderboard.tsx | 22 +- .../components/BeatmapNomination.tsx | 16 +- .../components/BeatmapNominatorUser.tsx | 11 +- .../components/DifficultyInformation.tsx | 52 +- .../components/DifficultySelector.tsx | 38 +- .../components/DownloadButtons.tsx | 9 +- .../components/FavouriteButton.tsx | 13 +- .../components/PPCalculatorDialog.tsx | 51 +- .../components/ScoreLeaderboardData.tsx | 49 +- .../components/leaderboard/ModsSelector.tsx | 29 +- .../components/leaderboard/ScoreColumns.tsx | 61 +- .../components/leaderboard/ScoreDataTable.tsx | 69 +- .../friends/components/UsersList.tsx | 22 +- .../components/UsersListSortingOptions.tsx | 7 +- .../components/UsersListViewModeOptions.tsx | 7 +- app/(website)/friends/layout.tsx | 6 +- app/(website)/friends/page.tsx | 67 +- app/(website)/layout.tsx | 4 +- .../leaderboard/components/UserColumns.tsx | 96 +- .../leaderboard/components/UserDataTable.tsx | 86 +- app/(website)/leaderboard/layout.tsx | 6 +- app/(website)/leaderboard/page.tsx | 61 +- app/(website)/register/layout.tsx | 6 +- app/(website)/register/page.tsx | 75 +- app/(website)/rules/layout.tsx | 6 +- app/(website)/rules/page.tsx | 55 +- app/(website)/score/[id]/layout.tsx | 12 +- app/(website)/score/[id]/page.tsx | 144 +- .../components/ChangeCountryInput.tsx | 43 +- .../components/ChangeDescriptionInput.tsx | 13 +- .../components/ChangePasswordInput.tsx | 26 +- .../components/ChangePlaystyleForm.tsx | 49 +- .../settings/components/ChangeSocialsForm.tsx | 29 +- .../components/ChangeUsernameInput.tsx | 18 +- .../settings/components/SiteLocalOptions.tsx | 15 +- .../settings/components/UploadImageForm.tsx | 29 +- app/(website)/settings/layout.tsx | 6 +- app/(website)/settings/page.tsx | 70 +- app/(website)/support/layout.tsx | 6 +- app/(website)/support/page.tsx | 22 +- .../topplays/components/UserScoreMinimal.tsx | 57 +- app/(website)/topplays/layout.tsx | 6 +- app/(website)/topplays/page.tsx | 46 +- .../user/[id]/components/AudioPreview.tsx | 15 +- .../[id]/components/BeatmapPlayedOverview.tsx | 38 +- .../[id]/components/BeatmapSetOverview.tsx | 59 +- .../components/SetDefaultGamemodeButton.tsx | 11 +- .../[id]/components/Tabs/UserTabBeatmaps.tsx | 75 +- .../[id]/components/Tabs/UserTabGeneral.tsx | 73 +- .../[id]/components/Tabs/UserTabMedals.tsx | 53 +- .../[id]/components/Tabs/UserTabScores.tsx | 41 +- .../components/UserGeneralInformation.tsx | 78 +- .../user/[id]/components/UserGrades.tsx | 12 +- .../[id]/components/UserLevelProgress.tsx | 15 +- .../UserPreviousUsernamesTooltip.tsx | 42 +- .../[id]/components/UserPrivilegeBadges.tsx | 41 +- .../user/[id]/components/UserRanks.tsx | 32 +- .../[id]/components/UserScoreOverview.tsx | 62 +- .../user/[id]/components/UserSocials.tsx | 56 +- .../user/[id]/components/UserStatsChart.tsx | 62 +- .../user/[id]/components/UserStatusText.tsx | 18 +- app/(website)/user/[id]/layout.tsx | 10 +- app/(website)/user/[id]/page.tsx | 147 +- app/(website)/wiki/layout.tsx | 6 +- app/(website)/wiki/page.tsx | 50 +- app/api/getBeatmapSuggestion/route.ts | 27 +- app/layout.tsx | 10 +- app/not-found.tsx | 8 +- components/BBCode/BBCodeInput.tsx | 51 +- components/BBCode/BBCodePreset.tsx | 50 +- components/BBCode/BBCodeReactParser.tsx | 107 +- components/BBCode/BBCodeTextField.tsx | 5 +- components/BeatmapDifficultyBadge.tsx | 19 +- components/BeatmapStatus.tsx | 7 +- components/BeatmapStatusBadge.tsx | 8 +- components/Beatmaps/BeatmapSetCard.tsx | 77 +- components/Beatmaps/Search/BeatmapsSearch.tsx | 90 +- .../Beatmaps/Search/BeatmapsSearchFilters.tsx | 23 +- components/BeatmapsetRowElement.tsx | 39 +- components/Brand.tsx | 4 +- components/CollapsibleBadgeList.tsx | 49 +- components/ComboBox.tsx | 24 +- components/ContentNotExist.tsx | 3 +- components/CopyElement.tsx | 6 +- components/DifficultyIcon.tsx | 33 +- components/Footer.tsx | 15 +- components/FriendshipButton.tsx | 30 +- components/GameModeSelector.tsx | 68 +- components/General/ImageSelect.tsx | 23 +- components/General/PrettyCounter.tsx | 12 +- components/General/PrettyDate.tsx | 23 +- components/General/PrettyHeader.tsx | 8 +- components/General/RoundedContent.tsx | 2 +- components/Header/Header.tsx | 32 +- components/Header/HeaderAvatar.tsx | 43 +- components/Header/HeaderLink.tsx | 16 +- components/Header/HeaderLoginDialog.tsx | 37 +- components/Header/HeaderLogoutAlert.tsx | 2 +- components/Header/HeaderMobileDrawer.tsx | 75 +- components/Header/HeaderSearchCommand.tsx | 55 +- components/Header/HeaderUserDropdown.tsx | 62 +- components/Header/LanguageSelector.tsx | 44 +- components/Header/ThemeModeToggle.tsx | 8 +- components/ImageWithFallback.tsx | 2 +- components/ModIcons.tsx | 123 +- components/ProgressBar.tsx | 4 +- components/Providers.tsx | 11 +- components/ScoreStats.tsx | 50 +- components/ScrollUp.tsx | 2 +- components/ScrollUpButton.tsx | 14 +- components/ServerMaintenanceDialog.tsx | 4 +- components/SmallBeatmapElement.tsx | 23 +- components/SmallUserElement.tsx | 4 +- components/Spinner.tsx | 2 +- components/ThemeProvider.tsx | 2 +- components/Tooltip.tsx | 8 +- components/UserElement.tsx | 46 +- components/UserHoverCard.tsx | 45 +- components/UserListElement.tsx | 41 +- components/UserRankNumber.tsx | 16 +- components/UserRowElement.tsx | 23 +- components/WorkInProgress.tsx | 3 +- components/ui/icons/bi-twitter-x.tsx | 4 +- components/ui/icons/circle-outline.tsx | 4 +- components/ui/icons/ic-baseline-discord.tsx | 4 +- components/ui/icons/mdi-telegram.tsx | 4 +- components/ui/icons/three-dots-loading.tsx | 8 +- eslint.config.ts | 2 +- hooks/use-mobile.tsx | 22 +- hooks/use-toast.ts | 156 +- lib/actions/getUserToken.ts | 12 +- lib/hooks/api/auth/useAuthorize.ts | 12 +- lib/hooks/api/auth/useRegister.ts | 12 +- lib/hooks/api/beatmap/useBeatmap.ts | 3 +- lib/hooks/api/beatmap/useBeatmapHype.ts | 19 +- .../api/beatmap/useBeatmapLeaderboard.ts | 10 +- lib/hooks/api/beatmap/useBeatmapPp.ts | 10 +- lib/hooks/api/beatmap/useBeatmapSet.ts | 5 +- lib/hooks/api/beatmap/useBeatmapSetEvents.ts | 16 +- .../beatmap/useBeatmapSetFavouriteStatus.ts | 19 +- .../api/beatmap/useBeatmapSetHypedSets.ts | 16 +- lib/hooks/api/beatmap/useBeatmapSetsEvents.ts | 16 +- lib/hooks/api/beatmap/useBeatmapsetSearch.ts | 23 +- .../beatmap/useUpdateBeatmapCustomStatus.ts | 24 +- lib/hooks/api/score/useDownloadReplay.ts | 14 +- lib/hooks/api/score/useScore.ts | 4 +- lib/hooks/api/score/useTopScores.ts | 11 +- lib/hooks/api/types.ts | 24 +- lib/hooks/api/useServerStatus.ts | 5 +- lib/hooks/api/user/useAdminUserEdit.ts | 73 +- lib/hooks/api/user/useCountryChange.ts | 12 +- lib/hooks/api/user/useEditDescription.ts | 12 +- lib/hooks/api/user/useFollowers.ts | 10 +- lib/hooks/api/user/useFriends.ts | 10 +- lib/hooks/api/user/usePasswordChange.ts | 12 +- lib/hooks/api/user/useUser.ts | 3 +- lib/hooks/api/user/useUserDefaultGamemode.ts | 24 +- lib/hooks/api/user/useUserFavourites.ts | 13 +- lib/hooks/api/user/useUserFriends.ts | 22 +- lib/hooks/api/user/useUserGrades.ts | 5 +- lib/hooks/api/user/useUserGraph.ts | 3 +- lib/hooks/api/user/useUserMedals.ts | 4 +- lib/hooks/api/user/useUserMetadata.ts | 18 +- lib/hooks/api/user/useUserMostPlayed.ts | 10 +- .../api/user/useUserPreviousUsernames.ts | 5 +- lib/hooks/api/user/useUserScores.ts | 13 +- lib/hooks/api/user/useUserSearch.ts | 10 +- lib/hooks/api/user/useUserSearchList.ts | 19 +- lib/hooks/api/user/useUserUpload.ts | 12 +- lib/hooks/api/user/useUsernameChange.ts | 12 +- lib/hooks/api/user/useUsersLeaderboard.ts | 9 +- lib/hooks/useAudioPlayer.ts | 1 + lib/hooks/useRestriction.ts | 3 +- lib/hooks/useSelf.ts | 3 +- lib/i18n/messages/index.ts | 14 +- lib/i18n/request.ts | 21 +- lib/i18n/utils.tsx | 17 +- lib/overrides/next/link.tsx | 8 +- lib/providers/AudioProvider.tsx | 28 +- lib/providers/RestrictionProvider.tsx | 32 +- lib/providers/SelfProvider.tsx | 12 +- lib/services/fetcher.ts | 41 +- lib/services/poster.ts | 27 +- lib/types/TailwindTypes.ts | 1 + lib/types/api/client.gen.ts | 8 +- lib/types/api/index.ts | 2 +- lib/types/api/types.gen.ts | 3060 ++++++++--------- lib/types/api/zod.gen.ts | 1890 +++++----- lib/utils.ts | 7 +- lib/utils/buildQuery.ts | 11 +- lib/utils/getBeatmapStarRating.ts | 5 +- lib/utils/getGradeColor.ts | 2 +- lib/utils/getStarRatingColor.ts | 19 +- lib/utils/numberWith.ts | 2 +- lib/utils/playtimeToString.ts | 4 +- lib/utils/secondsTo.ts | 3 +- lib/utils/timeSince.ts | 12 +- lib/utils/toPrettyDate.ts | 3 +- lib/utils/type.util.ts | 2 +- lib/utils/userLevel.ts | 58 +- lib/utils/userPrivileges.util.ts | 5 +- tailwind.config.ts | 88 +- 257 files changed, 6505 insertions(+), 6175 deletions(-) diff --git a/app/(admin)/admin/beatmaps/[id]/page.tsx b/app/(admin)/admin/beatmaps/[id]/page.tsx index 902a05f..e2f23ce 100644 --- a/app/(admin)/admin/beatmaps/[id]/page.tsx +++ b/app/(admin)/admin/beatmaps/[id]/page.tsx @@ -1,11 +1,12 @@ "use client"; +import { Music2 } from "lucide-react"; +import Image from "next/image"; import { use } from "react"; + +import PrettyHeader from "@/components/General/PrettyHeader"; +import RoundedContent from "@/components/General/RoundedContent"; import Spinner from "@/components/Spinner"; import { useBeatmap } from "@/lib/hooks/api/beatmap/useBeatmap"; -import RoundedContent from "@/components/General/RoundedContent"; -import Image from "next/image"; -import PrettyHeader from "@/components/General/PrettyHeader"; -import { Music2 } from "lucide-react"; import { tryParseNumber } from "@/lib/utils/type.util"; interface BeatmapsProps { @@ -25,9 +26,9 @@ export default function BeatmapsRedirect(props: BeatmapsProps) { const errorMessage = beatmapQuery.error?.message ?? "Beatmapset not found"; return ( -
+
} /> - +

{errorMessage}

@@ -48,9 +49,9 @@ export default function BeatmapsRedirect(props: BeatmapsProps) { } return ( -

+
} /> -
+
diff --git a/app/(admin)/admin/beatmaps/requests/layout.tsx b/app/(admin)/admin/beatmaps/requests/layout.tsx index 4595325..660353f 100644 --- a/app/(admin)/admin/beatmaps/requests/layout.tsx +++ b/app/(admin)/admin/beatmaps/requests/layout.tsx @@ -1,4 +1,5 @@ -import { Metadata } from "next"; +import type { Metadata } from "next"; + import Page from "./page"; export const metadata: Metadata = { diff --git a/app/(admin)/admin/beatmaps/requests/page.tsx b/app/(admin)/admin/beatmaps/requests/page.tsx index 7e96d8e..c5fa105 100644 --- a/app/(admin)/admin/beatmaps/requests/page.tsx +++ b/app/(admin)/admin/beatmaps/requests/page.tsx @@ -1,48 +1,43 @@ "use client"; -import type React from "react"; - +import { ChevronDown, ChevronsUp } from "lucide-react"; +import type * as React from "react"; import { useState } from "react"; -import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { Search, Filter, ChevronDown, Rocket, ChevronsUp } from "lucide-react"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { BeatmapsSearchFilters } from "@/components/Beatmaps/Search/BeatmapsSearchFilters"; -import { BeatmapSetCard } from "@/components/Beatmaps/BeatmapSetCard"; -import { twMerge } from "tailwind-merge"; import BeatmapSetOverview from "@/app/(website)/user/[id]/components/BeatmapSetOverview"; -import useDebounce from "@/lib/hooks/useDebounce"; +import { BeatmapSetCard } from "@/components/Beatmaps/BeatmapSetCard"; +import PrettyHeader from "@/components/General/PrettyHeader"; +import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useBeatmapSetGetHypedSets } from "@/lib/hooks/api/beatmap/useBeatmapSetHypedSets"; -import PrettyHeader from "@/components/General/PrettyHeader"; export default function Page() { const [viewMode, setViewMode] = useState("grid"); const { data, setSize, size, isLoading } = useBeatmapSetGetHypedSets(); - const beatmapsets = data?.flatMap((item) => item.sets); - const totalCount = - data?.find((item) => item.total_count !== undefined)?.total_count ?? 0; + const beatmapsets = data?.flatMap(item => item.sets); + const totalCount + = data?.find(item => item.total_count !== undefined)?.total_count ?? 0; - const isLoadingMore = - isLoading || (size > 0 && data && typeof data[size - 1] === "undefined"); + const isLoadingMore + = isLoading || (size > 0 && data && data[size - 1] === undefined); const handleShowMore = () => { setSize(size + 1); }; return ( -
+
} text="Beatmap requests" roundBottom={true} />
-
-
+
+
Total requests: {totalCount}
@@ -52,7 +47,7 @@ export default function Page() { onValueChange={setViewMode} className="h-9 " > - + Grid List @@ -64,26 +59,26 @@ export default function Page() {
- {beatmapsets?.map((beatmapSet, i) => ( - + {beatmapsets?.map(beatmapSet => ( + ))}
- - {beatmapsets?.map((beatmapSet, i) => ( - + + {beatmapsets?.map(beatmapSet => ( + ))}
{beatmapsets && beatmapsets?.length < totalCount && ( -
+
{beatmapSet ? ( <> -
-
-
+
+
+

{beatmapSet.title}

-

{beatmapSet.artist}

+

{beatmapSet.artist}

@@ -78,10 +80,10 @@ export default function AdminBeatmapset(props: BeatmapsetProps) { alt="" width={48} height={48} - className="rounded-lg object-contain bg-stone-800 max-h-12 max-w-12" + className="max-h-12 max-w-12 rounded-lg bg-stone-800 object-contain" fallBackSrc="/images/placeholder.png" /> -
+
submitted by 

@@ -95,20 +97,20 @@ export default function AdminBeatmapset(props: BeatmapsetProps) { className="font-bold" />

- {beatmapSet.ranked_date && - beatmapSet.status === BeatmapStatusWeb.RANKED && ( -
- ranked on  - -
- )} + {beatmapSet.ranked_date + && beatmapSet.status === BeatmapStatusWeb.RANKED && ( +
+ ranked on  + +
+ )}
-
+
-
+
{/* Cards */} -
+
Beatmap Status @@ -169,24 +171,26 @@ export default function AdminBeatmapset(props: BeatmapsetProps) {
- ) : beatmapsetQuery?.error ? ( - -
-

{errorMessage}

-

- The beatmapset you are looking for does not exist or has been - deleted. -

-
- 404 -
- ) : null} + ) : beatmapsetQuery?.error + ? ( + +
+

{errorMessage}

+

+ The beatmapset you are looking for does not exist or has been + deleted. +

+
+ 404 +
+ ) + : null}
); diff --git a/app/(admin)/admin/beatmapsets/components/BeatmapPerformanceTooltip.tsx b/app/(admin)/admin/beatmapsets/components/BeatmapPerformanceTooltip.tsx index c540565..964b574 100644 --- a/app/(admin)/admin/beatmapsets/components/BeatmapPerformanceTooltip.tsx +++ b/app/(admin)/admin/beatmapsets/components/BeatmapPerformanceTooltip.tsx @@ -1,16 +1,19 @@ +import { useCallback, useEffect, useMemo, useState } from "react"; + import { Tooltip } from "@/components/Tooltip"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { EosIconsThreeDotsLoading } from "@/components/ui/icons/three-dots-loading"; import { ShortenedMods } from "@/lib/hooks/api/score/types"; import fetcher from "@/lib/services/fetcher"; -import { +import type { BeatmapResponse, + PerformanceAttributes, +} from "@/lib/types/api"; +import { GameMode, Mods, - PerformanceAttributes, } from "@/lib/types/api"; -import { useEffect, useState } from "react"; export function BeatmapPerformanceTooltip({ beatmap, @@ -19,59 +22,62 @@ export function BeatmapPerformanceTooltip({ }) { const gamerule = [Mods.NONE]; - if (beatmap.mode != GameMode.MANIA && !gamerule.includes(Mods.RELAX)) { + if (beatmap.mode !== GameMode.MANIA && !gamerule.includes(Mods.RELAX)) { gamerule.push(Mods.RELAX); } - if (beatmap.mode == GameMode.STANDARD && !gamerule.includes(Mods.RELAX2)) { + if (beatmap.mode === GameMode.STANDARD && !gamerule.includes(Mods.RELAX2)) { gamerule.push(Mods.RELAX2); } - const performance = [ + const performance = useMemo(() => [ Mods.NONE, Mods.HIDDEN, Mods.HARD_ROCK, Mods.DOUBLE_TIME, - ]; + ], []); const [currentGamerule, setCurrentGamerule] = useState(Mods.NONE); const [beatmapPerformances, setBeatmapPerformances] = useState< PerformanceAttributes[] >([]); - const fetchData = async (force?: boolean) => { - if (beatmapPerformances.length > 0 && !force) return; + const fetchData = useCallback(async (force?: boolean) => { + if (beatmapPerformances.length > 0 && !force) + return; const results = await Promise.all( performance.map((acc) => { return fetcher( - `beatmap/${beatmap.id}/pp?mods=${acc}&mods=${currentGamerule}` + `beatmap/${beatmap.id}/pp?mods=${acc}&mods=${currentGamerule}`, ); - }) + }), ); setBeatmapPerformances(results); - }; + }, [beatmap.id, beatmapPerformances.length, currentGamerule, performance]); useEffect(() => { - if (beatmapPerformances.length == 0) return; + if (beatmapPerformances.length === 0) + return; fetchData(true); - }, [currentGamerule]); + }, [beatmapPerformances.length, currentGamerule, fetchData]); return ( -
+ content={( +
+
{beatmapPerformances.length > 0 ? ( beatmapPerformances.map((pp, i) => { return ( {ShortenedMods[performance[i]]} {100}% @@ -82,27 +88,27 @@ export function BeatmapPerformanceTooltip({ ); }) ) : ( - + )}
- {gamerule.map((rule, i) => ( + {gamerule.map(rule => ( ))}
- } + )} > PP diff --git a/app/(admin)/admin/beatmapsets/components/BeatmapSetEvent.tsx b/app/(admin)/admin/beatmapsets/components/BeatmapSetEvent.tsx index 40f9080..16aa058 100644 --- a/app/(admin)/admin/beatmapsets/components/BeatmapSetEvent.tsx +++ b/app/(admin)/admin/beatmapsets/components/BeatmapSetEvent.tsx @@ -1,8 +1,10 @@ +import { Clock } from "lucide-react"; + import { BeatmapNominatorUser } from "@/app/(website)/beatmapsets/components/BeatmapNominatorUser"; import PrettyDate from "@/components/General/PrettyDate"; import { SmallBeatmapElement } from "@/components/SmallBeatmapElement"; -import { BeatmapEventResponse, BeatmapEventType } from "@/lib/types/api"; -import { Clock } from "lucide-react"; +import type { BeatmapEventResponse } from "@/lib/types/api"; +import { BeatmapEventType } from "@/lib/types/api"; export function BeatmapSetEvent({ event }: { event: BeatmapEventResponse }) { const { @@ -29,33 +31,34 @@ export function BeatmapSetEvent({ event }: { event: BeatmapEventResponse }) { eventMessage = ( <> reset beatmapset - hypes + + {" "} + hypes ); break; case BeatmapEventType.BEATMAP_STATUS_CHANGED: - const beatmap = beatmapset.beatmaps.find((b) => b.hash === beatmap_hash); eventMessage = ( <> changed beatmap - + b.hash === beatmap_hash)} /> status to - + {new_status ?? "their default status"} ); break; default: - eventMessage = - "created unhandled event. Please report it to the developer"; + eventMessage + = "created unhandled event. Please report it to the developer"; break; } return ( -
-
-
+
+
+

ID: {event_id}

User @@ -63,8 +66,8 @@ export function BeatmapSetEvent({ event }: { event: BeatmapEventResponse }) { {eventMessage}.

-
- +
+
diff --git a/app/(admin)/admin/beatmapsets/components/BeatmapSetEvents.tsx b/app/(admin)/admin/beatmapsets/components/BeatmapSetEvents.tsx index 9f5b3a9..468e75b 100644 --- a/app/(admin)/admin/beatmapsets/components/BeatmapSetEvents.tsx +++ b/app/(admin)/admin/beatmapsets/components/BeatmapSetEvents.tsx @@ -1,8 +1,9 @@ +import { ChevronDown } from "lucide-react"; + import { BeatmapSetEvent } from "@/app/(admin)/admin/beatmapsets/components/BeatmapSetEvent"; import { Button } from "@/components/ui/button"; import { useBeatmapSetEvents } from "@/lib/hooks/api/beatmap/useBeatmapSetEvents"; -import { BeatmapSetResponse } from "@/lib/types/api"; -import { ChevronDown } from "lucide-react"; +import type { BeatmapSetResponse } from "@/lib/types/api"; export function BeatmapSetEvents({ beatmapSet, @@ -11,15 +12,15 @@ export function BeatmapSetEvents({ }) { const { data, setSize, size, isLoading } = useBeatmapSetEvents( beatmapSet.id, - 5 + 5, ); - const events = data?.flatMap((item) => item.events); - const totalCount = - data?.find((item) => item.total_count !== undefined)?.total_count ?? 0; + const events = data?.flatMap(item => item.events); + const totalCount + = data?.find(item => item.total_count !== undefined)?.total_count ?? 0; - const isLoadingMore = - isLoading || (size > 0 && data && typeof data[size - 1] === "undefined"); + const isLoadingMore + = isLoading || (size > 0 && data && data[size - 1] === undefined); const handleShowMore = () => { setSize(size + 1); @@ -27,14 +28,14 @@ export function BeatmapSetEvents({ return (
- {events?.map((event, i) => { - return ; + {events?.map((event) => { + return ; })} {events && events?.length < totalCount && ( -
+
@@ -130,8 +130,8 @@ export function BeatmapsStatusTable({ - selectedBeatmaps.includes(beatmap.id.toString()) + checked={beatmapSet.beatmaps.every(beatmap => + selectedBeatmaps.includes(beatmap.id.toString()), )} onCheckedChange={handleSelectAll} aria-label="Select all" @@ -159,8 +159,8 @@ export function BeatmapsStatusTable({ {beatmapSet.beatmaps .sort( (a, b) => - getBeatmapStarRating(b, b.mode) - - getBeatmapStarRating(a, a.mode) + getBeatmapStarRating(b, b.mode) + - getBeatmapStarRating(a, a.mode), ) .sort((a, b) => a.mode_int - b.mode_int) .map((beatmap) => { @@ -179,23 +179,22 @@ export function BeatmapsStatusTable({ - handleSelectBeatmap(beatmap.id.toString()) - } + handleSelectBeatmap(beatmap.id.toString())} /> {beatmap.id} - + {beatmap.hash.slice(0, 7)} -
-
+
+
{`${beatmap.creator}'s @@ -254,17 +253,15 @@ export function BeatmapsStatusTable({
- handleUpdateBeatmapStatus(beatmap.id, s) - } + onValueChange={s => + handleUpdateBeatmapStatus(beatmap.id, s)} /> {beatmap.beatmap_nominator_user && ( diff --git a/app/(admin)/admin/dashboard/components/serverStatusCards.tsx b/app/(admin)/admin/dashboard/components/serverStatusCards.tsx index 51440c6..da0a0c3 100644 --- a/app/(admin)/admin/dashboard/components/serverStatusCards.tsx +++ b/app/(admin)/admin/dashboard/components/serverStatusCards.tsx @@ -1,7 +1,8 @@ -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; +import { Activity, AlertCircle, BarChart3, Users } from "lucide-react"; + +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { useServerStatus } from "@/lib/hooks/api/useServerStatus"; -import { Users, Activity, AlertCircle, BarChart3 } from "lucide-react"; export function ServerStatusCards() { const serverStatusQuery = useServerStatus(); @@ -12,7 +13,7 @@ export function ServerStatusCards() { Total Users - + {serverStatus ? ( @@ -27,7 +28,7 @@ export function ServerStatusCards() { Users Online - + {serverStatus ? ( @@ -37,8 +38,8 @@ export function ServerStatusCards() {

{( - (serverStatus.users_online / serverStatus.total_users) * - 100 + (serverStatus.users_online / serverStatus.total_users) + * 100 ).toFixed(2)} % of total users

@@ -51,7 +52,7 @@ export function ServerStatusCards() { Restrictions - + {serverStatus ? ( @@ -61,9 +62,9 @@ export function ServerStatusCards() {

{( - ((serverStatus.total_restrictions || 0) / - serverStatus.total_users) * - 100 + ((serverStatus.total_restrictions || 0) + / serverStatus.total_users) + * 100 ).toFixed(2)} % of users

@@ -76,7 +77,7 @@ export function ServerStatusCards() { Total Scores - + {serverStatus ? ( diff --git a/app/(admin)/admin/dashboard/layout.tsx b/app/(admin)/admin/dashboard/layout.tsx index d5213b5..74cad4a 100644 --- a/app/(admin)/admin/dashboard/layout.tsx +++ b/app/(admin)/admin/dashboard/layout.tsx @@ -1,4 +1,5 @@ -import { Metadata } from "next"; +import type { Metadata } from "next"; + import Page from "./page"; export const metadata: Metadata = { diff --git a/app/(admin)/admin/dashboard/page.tsx b/app/(admin)/admin/dashboard/page.tsx index 2e93ec8..871ed21 100644 --- a/app/(admin)/admin/dashboard/page.tsx +++ b/app/(admin)/admin/dashboard/page.tsx @@ -4,10 +4,10 @@ import { BeatmapSetsEvents } from "@/app/(admin)/admin/beatmapsets/components/Be import { ServerStatusCards } from "@/app/(admin)/admin/dashboard/components/serverStatusCards"; import { Card, - CardHeader, - CardTitle, CardContent, CardDescription, + CardHeader, + CardTitle, } from "@/components/ui/card"; import { UserListItem } from "@/components/UserListElement"; import { WorkInProgress } from "@/components/WorkInProgress"; @@ -28,11 +28,11 @@ export default function Page() { Latest registered users - {serverStatus?.recent_users && - serverStatus.recent_users.map((user, i) => ( + {serverStatus?.recent_users + && serverStatus.recent_users.map(user => ( ))} @@ -47,7 +47,7 @@ export default function Page() { - + Recent Beatmap Status Events Latests changes with beatmaps diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserBasicInfo.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserBasicInfo.tsx index bcf758c..f9686db 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserBasicInfo.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserBasicInfo.tsx @@ -1,18 +1,17 @@ "use client"; -import { UserSensitiveResponse } from "@/lib/types/api"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Label } from "@/components/ui/label"; -import { Mail, User, KeyRound } from "lucide-react"; - -import { useUserPreviousUsernames } from "@/lib/hooks/api/user/useUserPreviousUsernames"; -import { Badge } from "@/components/ui/badge"; +import { Mail, User } from "lucide-react"; -import AdminUserRestrictButton from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserRestrictButton"; import AdminUserEmailInput from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserEmailInput"; -import AdminUserUsernameInput from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserUsernameInput"; -import AdminUserResetPassword from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserResetPassword"; import AdminUserPrivilegeInput from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserPrivilegeInput"; +import AdminUserResetPassword from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserResetPassword"; +import AdminUserRestrictButton from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserRestrictButton"; +import AdminUserUsernameInput from "@/app/(admin)/admin/users/[id]/edit/components/AdminUserUsernameInput"; +import { Badge } from "@/components/ui/badge"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Label } from "@/components/ui/label"; +import { useUserPreviousUsernames } from "@/lib/hooks/api/user/useUserPreviousUsernames"; +import type { UserSensitiveResponse } from "@/lib/types/api"; export default function AdminUserBasicInfo({ user, @@ -25,14 +24,14 @@ export default function AdminUserBasicInfo({ - + Basic Information
@@ -40,7 +39,7 @@ export default function AdminUserBasicInfo({
@@ -55,7 +54,8 @@ export default function AdminUserBasicInfo({
{previousUsernames.usernames.map((username, index) => ( - + // eslint-disable-next-line @eslint-react/no-array-index-key -- would actually prefer to use index here + {username} ))} diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserConnections.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserConnections.tsx index 8dbf361..bb4e237 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserConnections.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserConnections.tsx @@ -1,16 +1,17 @@ "use client"; +import { UserPlus, Users } from "lucide-react"; import { useState } from "react"; -import { UserSensitiveResponse } from "@/lib/types/api"; + +import Spinner from "@/components/Spinner"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Users, UserPlus } from "lucide-react"; import { UserListItem } from "@/components/UserListElement"; -import Spinner from "@/components/Spinner"; import { useAdminUserFollowers, useAdminUserFriends, } from "@/lib/hooks/api/user/useAdminUserEdit"; +import type { UserSensitiveResponse } from "@/lib/types/api"; export default function AdminUserConnections({ user, @@ -19,11 +20,11 @@ export default function AdminUserConnections({ }) { const [activeTab, setActiveTab] = useState("followers"); - const { data: followersData, isLoading: isLoadingFollowers } = - useAdminUserFollowers(user.user_id, 100, 1); + const { data: followersData, isLoading: isLoadingFollowers } + = useAdminUserFollowers(user.user_id, 100, 1); - const { data: followingData, isLoading: isLoadingFollowing } = - useAdminUserFriends(user.user_id, 100, 1); + const { data: followingData, isLoading: isLoadingFollowing } + = useAdminUserFriends(user.user_id, 100, 1); // TODO: Pagination for followers/following lists @@ -31,7 +32,7 @@ export default function AdminUserConnections({ - + Connections @@ -39,11 +40,11 @@ export default function AdminUserConnections({ - + Followers - + Following @@ -53,28 +54,35 @@ export default function AdminUserConnections({
- ) : followersData && followersData.followers.length > 0 ? ( - <> -
- {followersData.followers.map((follower) => ( - - ))} -
-

- Showing {followersData?.followers.length || 0}/ - {followersData?.total_count || 0} followers -

- - ) : ( -
- -

No followers yet

-
- )} + ) : followersData && followersData.followers.length > 0 + ? ( + <> +
+ {followersData.followers.map(follower => ( + + ))} +
+

+ Showing + {" "} + {followersData?.followers.length || 0} + / + {followersData?.total_count || 0} + {" "} + followers +

+ + ) + : ( +
+ +

No followers yet

+
+ )} @@ -82,28 +90,35 @@ export default function AdminUserConnections({
- ) : followingData && followingData.friends.length > 0 ? ( - <> -
- {followingData.friends.map((friend) => ( - - ))} -
-

- Showing {followingData?.friends.length || 0}/ - {followingData?.total_count || 0} following -

- - ) : ( -
- -

Not following anyone yet

-
- )} + ) : followingData && followingData.friends.length > 0 + ? ( + <> +
+ {followingData.friends.map(friend => ( + + ))} +
+

+ Showing + {" "} + {followingData?.friends.length || 0} + / + {followingData?.total_count || 0} + {" "} + following +

+ + ) + : ( +
+ +

Not following anyone yet

+
+ )}
diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserEmailInput.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserEmailInput.tsx index 9c992c5..51e1591 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserEmailInput.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserEmailInput.tsx @@ -1,10 +1,9 @@ -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { UserSensitiveResponse } from "@/lib/types/api"; -import { Mail, EyeOff, Eye } from "lucide-react"; +import { Eye, EyeOff } from "lucide-react"; import { useState } from "react"; -import { Label } from "recharts"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import type { UserSensitiveResponse } from "@/lib/types/api"; export default function AdminUserEmailInput({ user, @@ -30,9 +29,9 @@ export default function AdminUserEmailInput({ onClick={() => setShowEmail(!showEmail)} > {showEmail ? ( - + ) : ( - + )}
diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserImages.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserImages.tsx index 37774c7..0e81ce2 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserImages.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserImages.tsx @@ -1,17 +1,18 @@ "use client"; -import { useEffect, useState } from "react"; -import { UserSensitiveResponse } from "@/lib/types/api"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Image as ImageIcon, Upload } from "lucide-react"; +import { useEffect, useState } from "react"; + import ImageSelect from "@/components/General/ImageSelect"; import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { useToast } from "@/hooks/use-toast"; import { useAdminUploadAvatar, useAdminUploadBanner, } from "@/lib/hooks/api/user/useAdminUserEdit"; -import { useToast } from "@/hooks/use-toast"; +import type { UserSensitiveResponse } from "@/lib/types/api"; export default function AdminUserImages({ user, @@ -23,14 +24,14 @@ export default function AdminUserImages({ const [activeTab, setActiveTab] = useState("avatar"); - const { trigger: uploadAvatar, isMutating: isUploadingAvatar } = - useAdminUploadAvatar(user.user_id); - const { trigger: uploadBanner, isMutating: isUploadingBanner } = - useAdminUploadBanner(user.user_id); + const { trigger: uploadAvatar, isMutating: isUploadingAvatar } + = useAdminUploadAvatar(user.user_id); + const { trigger: uploadBanner, isMutating: isUploadingBanner } + = useAdminUploadBanner(user.user_id); const { toast } = useToast(); useEffect(() => { - const fetches: Promise[] = []; + const fetches: Array> = []; let isCancelled = false; if (avatarFile == null) { @@ -39,7 +40,8 @@ export default function AdminUserImages({ fetches.push( fetch(avatarUrl) .then(async (res) => { - if (isCancelled) return; + if (isCancelled) + return; const file = await res.blob(); if (!isCancelled) { setAvatarFile(new File([file], "file.png")); @@ -49,7 +51,7 @@ export default function AdminUserImages({ if (!isCancelled) { console.error("Failed to fetch avatar:", error); } - }) + }), ); } @@ -59,7 +61,8 @@ export default function AdminUserImages({ fetches.push( fetch(bannerUrl) .then(async (res) => { - if (isCancelled) return; + if (isCancelled) + return; const file = await res.blob(); if (!isCancelled) { setBannerFile(new File([file], "file.png")); @@ -69,7 +72,7 @@ export default function AdminUserImages({ if (!isCancelled) { console.error("Failed to fetch banner:", error); } - }) + }), ); } @@ -82,7 +85,8 @@ export default function AdminUserImages({ const handleUpload = async (type: "avatar" | "banner") => { const file = type === "avatar" ? avatarFile : bannerFile; - if (!file) return; + if (!file) + return; try { if (type === "avatar") { @@ -91,14 +95,16 @@ export default function AdminUserImages({ title: "Avatar uploaded successfully!", variant: "success", }); - } else { + } + else { await uploadBanner(file); toast({ title: "Banner uploaded successfully!", variant: "success", }); } - } catch (error: any) { + } + catch (error: any) { toast({ title: `Failed to upload ${type}`, description: error?.message || "An error occurred", @@ -111,7 +117,7 @@ export default function AdminUserImages({ - + Images @@ -122,7 +128,7 @@ export default function AdminUserImages({ Banner - + - + Upload Avatar

@@ -143,7 +149,7 @@ export default function AdminUserImages({

- + - + Upload Banner

diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserPrivilegeInput.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserPrivilegeInput.tsx index 7b076d6..5f08df0 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserPrivilegeInput.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserPrivilegeInput.tsx @@ -1,13 +1,15 @@ "use client"; -import { useState, useEffect } from "react"; -import { UserSensitiveResponse, UserPrivilege } from "@/lib/types/api"; -import { Button } from "@/components/ui/button"; import { Shield } from "lucide-react"; +import { useEffect, useState } from "react"; + +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; import { MultiSelect } from "@/components/ui/multi-select"; -import { useAdminEditPrivilege } from "@/lib/hooks/api/user/useAdminUserEdit"; import { useToast } from "@/hooks/use-toast"; -import { Label } from "@/components/ui/label"; +import { useAdminEditPrivilege } from "@/lib/hooks/api/user/useAdminUserEdit"; +import type { UserSensitiveResponse } from "@/lib/types/api"; +import { UserPrivilege } from "@/lib/types/api"; const PRIVILEGE_OPTIONS = [ { @@ -38,12 +40,12 @@ export default function AdminUserPrivilegeInput({ user: UserSensitiveResponse; }) { const [selectedPrivileges, setSelectedPrivileges] = useState( - user.privilege + user.privilege, ); const [error, setError] = useState(null); - const { trigger: editPrivilege, isMutating: isUpdatingPrivilege } = - useAdminEditPrivilege(user.user_id); + const { trigger: editPrivilege, isMutating: isUpdatingPrivilege } + = useAdminEditPrivilege(user.user_id); const { toast } = useToast(); useEffect(() => { @@ -63,7 +65,8 @@ export default function AdminUserPrivilegeInput({ description: `Updated privileges for ${user.username}.`, variant: "success", }); - } catch (err: any) { + } + catch (err: any) { const errorMessage = err.message ?? "Unknown error."; setError(errorMessage); toast({ @@ -76,24 +79,23 @@ export default function AdminUserPrivilegeInput({ const currentPrivileges = user.privilege; - const hasChanges = - selectedPrivileges.length !== currentPrivileges.length || - !selectedPrivileges.every((p) => currentPrivileges.includes(p)); + const hasChanges + = selectedPrivileges.length !== currentPrivileges.length + || !selectedPrivileges.every(p => currentPrivileges.includes(p)); return (

- setSelectedPrivileges(values as UserPrivilege[]) - } + setSelectedPrivileges(values as UserPrivilege[])} defaultValue={Object.values(user.privilege).filter( - (v) => v != UserPrivilege.USER + v => v !== UserPrivilege.USER, )} placeholder="Select privileges..." className="flex-1" @@ -107,10 +109,12 @@ export default function AdminUserPrivilegeInput({
{error &&

{error}

} - {selectedPrivileges.filter((p) => p !== UserPrivilege.USER).length > - 0 && ( + {selectedPrivileges.some(p => p !== UserPrivilege.USER) && (

- Selected {selectedPrivileges.length}{" "} + Selected + {" "} + {selectedPrivileges.length} + {" "} {selectedPrivileges.length === 1 ? "privilege" : "privileges"}

)} diff --git a/app/(admin)/admin/users/[id]/edit/components/AdminUserProfile.tsx b/app/(admin)/admin/users/[id]/edit/components/AdminUserProfile.tsx index cef8577..48a312e 100644 --- a/app/(admin)/admin/users/[id]/edit/components/AdminUserProfile.tsx +++ b/app/(admin)/admin/users/[id]/edit/components/AdminUserProfile.tsx @@ -1,16 +1,17 @@ "use client"; +import { FileText, Flag, Gamepad2, Globe } from "lucide-react"; import { useState } from "react"; -import { UserSensitiveResponse } from "@/lib/types/api"; + +import ChangeCountryInput from "@/app/(website)/settings/components/ChangeCountryInput"; +import ChangeDescriptionInput from "@/app/(website)/settings/components/ChangeDescriptionInput"; +import ChangePlaystyleForm from "@/app/(website)/settings/components/ChangePlaystyleForm"; +import ChangeSocialsForm from "@/app/(website)/settings/components/ChangeSocialsForm"; +import Spinner from "@/components/Spinner"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { FileText, Flag, Globe, Gamepad2 } from "lucide-react"; import { useUserMetadata } from "@/lib/hooks/api/user/useUserMetadata"; -import Spinner from "@/components/Spinner"; -import ChangeCountryInput from "@/app/(website)/settings/components/ChangeCountryInput"; -import ChangeSocialsForm from "@/app/(website)/settings/components/ChangeSocialsForm"; -import ChangePlaystyleForm from "@/app/(website)/settings/components/ChangePlaystyleForm"; -import ChangeDescriptionInput from "@/app/(website)/settings/components/ChangeDescriptionInput"; +import type { UserSensitiveResponse } from "@/lib/types/api"; export default function AdminUserProfile({ user, @@ -24,7 +25,7 @@ export default function AdminUserProfile({ - + Profile Information @@ -32,32 +33,32 @@ export default function AdminUserProfile({ - + About - + Country - + Socials - + Playstyle - + - + - + {userMetadata && user ? ( - + {userMetadata && user ? ( data.password === data.confirmPassword, { + .refine(data => data.password === data.confirmPassword, { message: "Passwords do not match", path: ["confirmPassword"], }); @@ -62,8 +61,8 @@ export default function AdminUserResetPassword({ const [showPasswordDialog, setShowPasswordDialog] = useState(false); const [error, setError] = useState(null); - const { trigger: changePassword, isMutating: isChangingPassword } = - useAdminPasswordChange(user.user_id); + const { trigger: changePassword, isMutating: isChangingPassword } + = useAdminPasswordChange(user.user_id); const { toast } = useToast(); const form = useForm>({ @@ -104,7 +103,7 @@ export default function AdminUserResetPassword({ variant: "destructive", }); }, - } + }, ); } @@ -112,7 +111,7 @@ export default function AdminUserResetPassword({ @@ -120,7 +119,8 @@ export default function AdminUserResetPassword({ Reset Password - Set a new password for{" "} + Set a new password for + {" "} {user.username} @@ -137,7 +137,7 @@ export default function AdminUserResetPassword({ New Password Confirm Password - + Unrestrict User @@ -72,7 +74,7 @@ export default function AdminUserRestrictButton({ className="w-full" disabled={isChangingRestriction} > - + Restrict User @@ -100,14 +102,15 @@ function DialogSelectRestrictionReason({ onOpenChange={setShowRestrictionDialog} > {children} - e.preventDefault()}> + e.preventDefault()}> - + Restrict User - Select a reason for restricting{" "} + Select a reason for restricting + {" "} {user.username} @@ -125,7 +128,7 @@ function DialogSelectRestrictionReason({ - {[...RESTRICTION_REASONS, "Other"].map((reason) => ( + {[...RESTRICTION_REASONS, "Other"].map(reason => ( {reason} @@ -138,12 +141,11 @@ function DialogSelectRestrictionReason({
+ /> -
+
{isMobile ? ( -
{formattors}
+
{formattors}
) : ( formattors )} diff --git a/components/BBCode/BBCodePreset.tsx b/components/BBCode/BBCodePreset.tsx index e6b3f3e..dcd6a46 100644 --- a/components/BBCode/BBCodePreset.tsx +++ b/components/BBCode/BBCodePreset.tsx @@ -34,25 +34,25 @@ export const allowedTags = [ "td", ]; -export const customBBCodePreset = htmlPreset.extend((tags) => ({ +export const customBBCodePreset = htmlPreset.extend(tags => ({ ...tags, br: () => ({ tag: "br" }), hr: () => ({ tag: "hr" }), - code: (node) => ({ + code: node => ({ tag: "pre", attrs: { className: "p-2 bg-card rounded", }, content: node.content, }), - c: (node) => ({ + c: node => ({ tag: "code", attrs: { className: "p-1 bg-card rounded", }, content: node.content, }), - spoiler: (node) => ({ + spoiler: node => ({ tag: "span", attrs: { className: "bg-black text-black", @@ -74,12 +74,12 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ }; }, imagemap: (node, { render }) => { - const lines = - !!node.content && Object.keys(node.content).length > 0 + const lines + = !!node.content && Object.keys(node.content).length > 0 ? Object.values(node.content) .join(" ") .split("[break]") - .filter((line) => line.trim() !== "") + .filter(line => line.trim() !== "") : []; const imageUrl = lines[0].trim(); @@ -98,7 +98,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ style: `position:absolute;display:block;left:${x}%;top:${y}%;width:${width}%;height:${height}%;`, ...(title ? { - title: title, + title, } : {}), }, @@ -128,7 +128,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ ], }; }, - centre: (node) => ({ + centre: node => ({ tag: "center", content: node.content, }), @@ -136,7 +136,8 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ const isOrdered = !!node.attrs && Object.keys(node.attrs).length > 0; const normalizeContent = (content: any | any[] | undefined): any[] => { - if (content === undefined || content === null) return []; + if (content === undefined || content === null) + return []; return Array.isArray(content) ? content : [content]; }; @@ -154,7 +155,8 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ result.push(current); current = []; } - } else if (current != null) { + } + else if (current != null) { current.push(item); } } @@ -169,7 +171,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ const contentArray = normalizeContent(node.content); const splitItems = splitContentByMarker(contentArray); - const items = splitItems.map((itemContent) => ({ + const items = splitItems.map(itemContent => ({ tag: "li", content: itemContent, })); @@ -181,14 +183,14 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ content: items, }; }, - notice: (node) => ({ + notice: node => ({ tag: "div", attrs: { class: "well", }, content: node.content, }), - quote: (node) => ({ + quote: node => ({ tag: "blockquote", content: [ { @@ -196,7 +198,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ attrs: { className: "text-base font-bold" }, content: !!node.attrs && Object.keys(node.attrs).length > 0 - ? Object.keys(node.attrs).join(" ") + " wrote" + ? `${Object.keys(node.attrs).join(" ")} wrote` : "", }, { @@ -205,7 +207,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ }, ], }), - heading: (node) => ({ + heading: node => ({ tag: "h2", attrs: { className: "text-2xl font-bold" }, content: node.content, @@ -218,13 +220,13 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ node, !!node.attrs && Object.keys(node.attrs).length > 0 ? Object.keys(node.attrs).join(" ") - : "" + : "", ); }, - profile: (node) => ({ + profile: node => ({ tag: "div", attrs: { - class: "user-name js-usercard", + "class": "user-name js-usercard", "data-user-id": !!node.attrs && Object.keys(node.attrs).length > 0 ? Object.keys(node.attrs).join(" ") @@ -232,7 +234,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ }, content: node.content, }), - youtube: (node) => ({ + youtube: node => ({ tag: "iframe", attrs: { width: "560", @@ -246,11 +248,11 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ }, }), size: (node) => { - let sizeValue = parseInt( + let sizeValue = Number.parseInt( !!node.attrs && Object.keys(node.attrs).length > 0 ? Object.keys(node.attrs).join(" ") : "", - 10 + 10, ); const minSize = 30; @@ -292,7 +294,7 @@ export const customBBCodePreset = htmlPreset.extend((tags) => ({ }, })); -const createSpoilerBox = (node: any, label: string) => { +function createSpoilerBox(node: any, label: string) { return { tag: "div", attrs: { @@ -327,4 +329,4 @@ const createSpoilerBox = (node: any, label: string) => { }, ], }; -}; +} diff --git a/components/BBCode/BBCodeReactParser.tsx b/components/BBCode/BBCodeReactParser.tsx index 022e0c4..a7077bb 100644 --- a/components/BBCode/BBCodeReactParser.tsx +++ b/components/BBCode/BBCodeReactParser.tsx @@ -1,3 +1,10 @@ +import { ChevronRight } from "lucide-react"; +import Link from "next/link"; +import { NextIntlClientProvider, useLocale, useMessages } from "next-intl"; +import * as React from "react"; +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { createRoot } from "react-dom/client"; + import { Popover, PopoverContent, @@ -5,15 +12,8 @@ import { } from "@/components/ui/popover"; import UserHoverCard from "@/components/UserHoverCard"; import fetcher from "@/lib/services/fetcher"; -import { UserResponse } from "@/lib/types/api"; +import type { UserResponse } from "@/lib/types/api"; import { tryParseNumber } from "@/lib/utils/type.util"; -import { ChevronRight } from "lucide-react"; -import Link from "next/link"; -import React, { useEffect, useState } from "react"; -import { useLayoutEffect, useRef } from "react"; -import { createRoot } from "react-dom/client"; -import { NextIntlClientProvider } from "next-intl"; -import { useLocale, useMessages } from "next-intl"; export const BBCodeReactParser = React.memo( ({ textHtml }: { textHtml: string }) => { @@ -21,9 +21,20 @@ export const BBCodeReactParser = React.memo( const locale = useLocale(); const messages = useMessages(); + const parseHtml = React.useCallback((container: HTMLDivElement) => { + parseSpoilerBoxes(container); + parseBlockquote(container); + parseLinks(container); + parseWell(container); + parseBreaks(container); + parseImageMapLink(container); + parseProfileLink(container, locale, messages); + }, [locale, messages]); + useLayoutEffect(() => { const container = containerRef.current; - if (!container) return; + if (!container) + return; const observer = new MutationObserver(() => { parseHtml(container); @@ -34,28 +45,18 @@ export const BBCodeReactParser = React.memo( parseHtml(container); return () => observer.disconnect(); - }, []); - - const parseHtml = (container: HTMLDivElement) => { - parseSpoilerBoxes(container); - parseBlockquote(container); - parseLinks(container); - parseWell(container); - parseBreaks(container); - parseImageMapLink(container); - parseProfileLink(container, locale, messages); - }; + }, [parseHtml]); return (
); - } + }, ); function parseLinks(container: HTMLDivElement) { @@ -67,40 +68,42 @@ function parseLinks(container: HTMLDivElement) { function walk(node: Node) { if ( - node.nodeType === Node.ELEMENT_NODE && - (node as Element).tagName.toLowerCase() === "a" + node.nodeType === Node.ELEMENT_NODE + && (node as Element).tagName.toLowerCase() === "a" ) { return; } if (node.nodeType === Node.TEXT_NODE) { const text = node.textContent; - if (!text || !urlRegex.test(text)) return; + if (!text || !urlRegex.test(text)) + return; const frag = document.createDocumentFragment(); let lastIndex = 0; - text.replace(urlRegex, (match, _url, offset) => { - frag.appendChild( - document.createTextNode(text.slice(lastIndex, offset)) + text.replaceAll(urlRegex, (match, _url, offset) => { + frag.append( + document.createTextNode(text.slice(lastIndex, offset)), ); const a = document.createElement("a"); a.href = match; a.className = "text-primary hover:underline"; a.textContent = match; - frag.appendChild(a); + frag.append(a); lastIndex = offset + match.length; return match; }); if (lastIndex < text.length) { - frag.appendChild(document.createTextNode(text.slice(lastIndex))); + frag.append(document.createTextNode(text.slice(lastIndex))); } node.parentNode?.replaceChild(frag, node); - } else if (node.nodeType === Node.ELEMENT_NODE) { + } + else if (node.nodeType === Node.ELEMENT_NODE) { Array.from(node.childNodes).forEach(walk); } } @@ -119,16 +122,16 @@ function parseBreaks(container: HTMLDivElement) { function parseBlockquote(container: HTMLDivElement) { const quotes = container.querySelectorAll("blockquote"); quotes.forEach((quote) => { - quote.className = - "px-4 my-2 border-l-4 border-gray-300 dark:border-gray-500"; + quote.className + = "px-4 my-2 border-l-4 border-gray-300 dark:border-gray-500"; }); } function parseWell(container: HTMLDivElement) { const quotes = container.querySelectorAll(".well"); quotes.forEach((quote) => { - quote.className = - "p-4 bg-card border-2 rounded border-gray-300 dark:border-gray-500"; + quote.className + = "p-4 bg-card border-2 rounded border-gray-300 dark:border-gray-500"; }); } @@ -137,23 +140,24 @@ function parseSpoilerBoxes(container: HTMLDivElement) { spoilerboxes.forEach((box) => { const body = box.querySelector( - ".js-spoilerbox__body" + ".js-spoilerbox__body", ) as HTMLElement | null; const link = box.querySelector( - ".js-spoilerbox__link" + ".js-spoilerbox__link", ) as HTMLElement | null; const icon = link?.querySelector( - ".bbcode-spoilerbox__link-icon" + ".bbcode-spoilerbox__link-icon", ) as HTMLElement | null; - if (!body || !link || !icon) return; + if (!body || !link || !icon) + return; const mountPoint = document.createElement("span"); mountPoint.className = "inline-block transition-transform"; icon.insertBefore(mountPoint, icon.firstChild); createRoot(mountPoint).render( - + , ); body.style.paddingLeft = "20px"; @@ -164,8 +168,8 @@ function parseSpoilerBoxes(container: HTMLDivElement) { e.preventDefault(); const isOpen = body.style.display === "block"; body.style.display = isOpen ? "none" : "block"; - mountPoint.style.transform = - body.style.display === "block" ? "rotate(90deg)" : "rotate(0deg)"; + mountPoint.style.transform + = body.style.display === "block" ? "rotate(90deg)" : "rotate(0deg)"; }; link.addEventListener("click", handleClick); @@ -180,7 +184,8 @@ function parseImageMapLink(container: HTMLDivElement) { const imageMapLinks = container.querySelectorAll(".imagemap__link"); imageMapLinks.forEach((link) => { - if (!link) return; + if (!link) + return; link.className = ""; @@ -195,7 +200,7 @@ function parseImageMapLink(container: HTMLDivElement) { triggerRef.current.innerHTML = ""; triggerRef.current.setAttribute( "style", - link.getAttribute("style") || "" + link.getAttribute("style") || "", ); } }, []); @@ -219,12 +224,13 @@ function parseImageMapLink(container: HTMLDivElement) { function parseProfileLink( container: HTMLDivElement, locale: string, - messages: Record + messages: Record, ) { const profileLinks = container.querySelectorAll(".js-usercard"); profileLinks.forEach((link) => { - if (!link) return; + if (!link) + return; link.className = ""; @@ -237,7 +243,9 @@ function parseProfileLink( const [user, setUser] = useState(null); + // eslint-disable-next-line unicorn/prefer-dom-node-dataset -- intentional const userId = tryParseNumber(link.getAttribute("data-user-id")) + // eslint-disable-next-line unicorn/prefer-dom-node-dataset -- intentional ? Number(link.getAttribute("data-user-id")) : null; @@ -252,12 +260,13 @@ function parseProfileLink( triggerRef.current.innerHTML = ""; triggerRef.current.setAttribute( "style", - link.getAttribute("style") || "" + link.getAttribute("style") || "", ); } - }, []); + }, [userId]); - if (!user) return null; + if (!user) + return null; return ( diff --git a/components/BBCode/BBCodeTextField.tsx b/components/BBCode/BBCodeTextField.tsx index 34ecac9..2ee2ac5 100644 --- a/components/BBCode/BBCodeTextField.tsx +++ b/components/BBCode/BBCodeTextField.tsx @@ -1,9 +1,10 @@ import bbobHTML from "@bbob/html"; -import { BBCodeReactParser } from "@/components/BBCode/BBCodeReactParser"; + import { allowedTags, customBBCodePreset, } from "@/components/BBCode/BBCodePreset"; +import { BBCodeReactParser } from "@/components/BBCode/BBCodeReactParser"; export default function BBCodeTextField({ text }: { text: string }) { const textWithCustomBreaks = text @@ -12,7 +13,7 @@ export default function BBCodeTextField({ text }: { text: string }) { const htmlString = bbobHTML(textWithCustomBreaks, customBBCodePreset(), { onlyAllowTags: allowedTags, - }).replace(/className/g, "class"); + }).replaceAll("className", "class"); return ; } diff --git a/components/BeatmapDifficultyBadge.tsx b/components/BeatmapDifficultyBadge.tsx index 1a9dc66..6453f70 100644 --- a/components/BeatmapDifficultyBadge.tsx +++ b/components/BeatmapDifficultyBadge.tsx @@ -1,7 +1,7 @@ import DifficultyIcon from "@/components/DifficultyIcon"; import { Tooltip } from "@/components/Tooltip"; import { Badge } from "@/components/ui/badge"; -import { BeatmapResponse } from "@/lib/types/api"; +import type { BeatmapResponse } from "@/lib/types/api"; import { getBeatmapStarRating } from "@/lib/utils/getBeatmapStarRating"; interface BeatmapDifficultyBadgeProps { @@ -16,31 +16,32 @@ export default function BeatmapDifficultyBadge({ return ( + content={( +
<> - ★{getBeatmapStarRating(beatmap)} + ★ + {getBeatmapStarRating(beatmap)} -

{beatmap.version}

+

{beatmap.version}

- } + )} > -
+
{!iconPreview && ( -

{beatmap.version}

+

{beatmap.version}

)}
diff --git a/components/BeatmapStatus.tsx b/components/BeatmapStatus.tsx index 90f642a..c1858c0 100644 --- a/components/BeatmapStatus.tsx +++ b/components/BeatmapStatus.tsx @@ -1,4 +1,3 @@ -import { BeatmapStatusWeb } from "@/lib/types/api"; import { Check, ChevronsUp, @@ -9,11 +8,13 @@ import { } from "lucide-react"; import { twMerge } from "tailwind-merge"; +import { BeatmapStatusWeb } from "@/lib/types/api"; + interface BeatmapStatusIconProps { status: BeatmapStatusWeb; } -export const getBeatmapStatusStatusColor = (status: BeatmapStatusWeb) => { +export function getBeatmapStatusStatusColor(status: BeatmapStatusWeb) { switch (status) { case BeatmapStatusWeb.LOVED: return "pink-500"; @@ -33,7 +34,7 @@ export const getBeatmapStatusStatusColor = (status: BeatmapStatusWeb) => { default: return ""; } -}; +} export default function BeatmapStatusIcon({ status }: BeatmapStatusIconProps) { const color = `text-${getBeatmapStatusStatusColor(status)}`; diff --git a/components/BeatmapStatusBadge.tsx b/components/BeatmapStatusBadge.tsx index 37e2aa3..c672dec 100644 --- a/components/BeatmapStatusBadge.tsx +++ b/components/BeatmapStatusBadge.tsx @@ -1,8 +1,8 @@ +import { twMerge } from "tailwind-merge"; + import { getBeatmapStatusStatusColor } from "@/components/BeatmapStatus"; import { Badge } from "@/components/ui/badge"; -import { BeatmapStatusWeb } from "@/lib/types/api"; - -import { twMerge } from "tailwind-merge"; +import type { BeatmapStatusWeb } from "@/lib/types/api"; interface BeatmapStatusBadgeProps { status: BeatmapStatusWeb; @@ -18,7 +18,7 @@ export default function BeatmapStatusBadge({ variant="outline" className={twMerge( "font-normal", - `bg-${color}/20 text-${color} hover:bg-${color}/20 hover:text-${color}` + `bg-${color}/20 text-${color} hover:bg-${color}/20 hover:text-${color}`, )} > {status} diff --git a/components/Beatmaps/BeatmapSetCard.tsx b/components/Beatmaps/BeatmapSetCard.tsx index c5825e2..957e849 100644 --- a/components/Beatmaps/BeatmapSetCard.tsx +++ b/components/Beatmaps/BeatmapSetCard.tsx @@ -1,22 +1,22 @@ -import { Card, CardContent, CardFooter } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { Download, ExternalLink } from "lucide-react"; +import { ExternalLink } from "lucide-react"; import Link from "next/link"; -import BeatmapStatusBadge from "@/components/BeatmapStatusBadge"; -import { BeatmapSetResponse } from "@/lib/types/api"; +import { usePathname } from "next/navigation"; +import { useEffect, useState } from "react"; +import { twMerge } from "tailwind-merge"; + +import AudioPreview from "@/app/(website)/user/[id]/components/AudioPreview"; import BeatmapDifficultyBadge from "@/components/BeatmapDifficultyBadge"; +import BeatmapStatusIcon from "@/components/BeatmapStatus"; import { CollapsibleBadgeList } from "@/components/CollapsibleBadgeList"; -import AudioPreview from "@/app/(website)/user/[id]/components/AudioPreview"; +import PrettyDate from "@/components/General/PrettyDate"; import ProgressBar from "@/components/ProgressBar"; -import useAudioPlayer from "@/lib/hooks/useAudioPlayer"; -import { twMerge } from "tailwind-merge"; -import { useState, useEffect } from "react"; -import { getBeatmapStarRating } from "@/lib/utils/getBeatmapStarRating"; import { BanchoSmallUserElement } from "@/components/SmallUserElement"; -import BeatmapStatusIcon from "@/components/BeatmapStatus"; -import PrettyDate from "@/components/General/PrettyDate"; -import { usePathname } from "next/navigation"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardFooter } from "@/components/ui/card"; +import useAudioPlayer from "@/lib/hooks/useAudioPlayer"; import { useT } from "@/lib/i18n/utils"; +import type { BeatmapSetResponse } from "@/lib/types/api"; +import { getBeatmapStarRating } from "@/lib/utils/getBeatmapStarRating"; interface BeatmapSetCardProps { beatmapSet: BeatmapSetResponse; @@ -26,49 +26,48 @@ export function BeatmapSetCard({ beatmapSet }: BeatmapSetCardProps) { const t = useT("components.beatmapSetCard"); const pathname = usePathname(); - const { player, isPlaying, isPlayingThis, currentTimestamp } = - useAudioPlayer(); + const { player, isPlaying, isPlayingThis, currentTimestamp } + = useAudioPlayer(); const [isPlayingCurrent, setIsPlayingCurrent] = useState(false); useEffect(() => { - if (!player.current) return; + if (!player.current) + return; setIsPlayingCurrent(isPlayingThis(`${beatmapSet.id}.mp3`)); - }, [isPlaying]); + }, [beatmapSet.id, isPlaying, isPlayingThis, player]); return ( - +
-
+
-
+

{beatmapSet.title}

-

+

{beatmapSet.artist}

@@ -77,29 +76,29 @@ export function BeatmapSetCard({ beatmapSet }: BeatmapSetCardProps) { maxValue={player.current?.duration || 10} className={twMerge( "absolute bottom-0 left-0 w-full h-0.5", - !isPlayingCurrent || - !isPlaying || - currentTimestamp === player.current?.duration || - currentTimestamp === 0 + !isPlayingCurrent + || !isPlaying + || currentTimestamp === player.current?.duration + || currentTimestamp === 0 ? "hidden" - : undefined + : undefined, )} />
- +
getBeatmapStarRating(a) - getBeatmapStarRating(b)) .sort((a, b) => a.mode_int - b.mode_int) - .map((beatmap, i) => ( - + .map(beatmap => ( + ))} />

-
+

{t("submittedBy")}

{t("submittedOn")}

@@ -118,12 +117,10 @@ export function BeatmapSetCard({ beatmapSet }: BeatmapSetCardProps) { diff --git a/components/Beatmaps/Search/BeatmapsSearch.tsx b/components/Beatmaps/Search/BeatmapsSearch.tsx index d8dfb9c..d3e3c38 100644 --- a/components/Beatmaps/Search/BeatmapsSearch.tsx +++ b/components/Beatmaps/Search/BeatmapsSearch.tsx @@ -1,22 +1,22 @@ "use client"; -import type React from "react"; +import { ChevronDown, Filter, Search } from "lucide-react"; +import type * as React from "react"; +import { useCallback, useState } from "react"; +import { twMerge } from "tailwind-merge"; -import { useState, useCallback } from "react"; -import { Input } from "@/components/ui/input"; +import BeatmapSetOverview from "@/app/(website)/user/[id]/components/BeatmapSetOverview"; +import { BeatmapSetCard } from "@/components/Beatmaps/BeatmapSetCard"; +import { BeatmapsSearchFilters } from "@/components/Beatmaps/Search/BeatmapsSearchFilters"; import { Button } from "@/components/ui/button"; -import { Search, Filter, ChevronDown } from "lucide-react"; +import { Card, CardContent } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { BeatmapStatusWeb, GameMode } from "@/lib/types/api"; - -import { BeatmapsSearchFilters } from "@/components/Beatmaps/Search/BeatmapsSearchFilters"; import { useBeatmapsetSearch } from "@/lib/hooks/api/beatmap/useBeatmapsetSearch"; -import { BeatmapSetCard } from "@/components/Beatmaps/BeatmapSetCard"; -import { twMerge } from "tailwind-merge"; -import BeatmapSetOverview from "@/app/(website)/user/[id]/components/BeatmapSetOverview"; import useDebounce from "@/lib/hooks/useDebounce"; -import { Card, CardContent } from "@/components/ui/card"; import { useT } from "@/lib/i18n/utils"; +import type { GameMode } from "@/lib/types/api"; +import { BeatmapStatusWeb } from "@/lib/types/api"; export default function BeatmapsSearch({ forceThreeGridCols = false, @@ -48,13 +48,13 @@ export default function BeatmapsSearch({ refreshInterval: 0, revalidateOnFocus: false, keepPreviousData: true, - } + }, ); - const beatmapsets = data?.flatMap((item) => item.sets); + const beatmapsets = data?.flatMap(item => item.sets); - const isLoadingMore = - isLoading || (size > 0 && data && typeof data[size - 1] === "undefined"); + const isLoadingMore + = isLoading || (size > 0 && data && data[size - 1] === undefined); const handleShowMore = useCallback(() => { setSize(size + 1); @@ -66,13 +66,13 @@ export default function BeatmapsSearch({ status: BeatmapStatusWeb[] | null; searchByCustomStatus: boolean; }) => { - let { mode, status, searchByCustomStatus } = filters; + const { mode, status, searchByCustomStatus } = filters; setModeFilter(mode); setStatusFilter(status ?? null); setSearchByCustomStatus(searchByCustomStatus); }, - [] + [], ); return ( @@ -80,14 +80,14 @@ export default function BeatmapsSearch({
- + setSearchQuery(e.target.value)} + onChange={e => setSearchQuery(e.target.value)} />
@@ -113,7 +113,7 @@ export default function BeatmapsSearch({ onValueChange={setViewMode} className="h-9 " > - + {t("viewMode.grid")} {t("viewMode.list")} @@ -128,8 +128,8 @@ export default function BeatmapsSearch({
- {beatmapsets?.map((beatmapSet, i) => ( - + {beatmapsets?.map(beatmapSet => ( + ))}
- - {beatmapsets?.map((beatmapSet, i) => ( - + + {beatmapsets?.map(beatmapSet => ( + ))} - {beatmapsets && - beatmapsets?.length >= (searchByCustomStatus ? 12 : 24) && ( -
- -
- )} + {beatmapsets + && beatmapsets?.length >= (searchByCustomStatus ? 12 : 24) && ( +
+ +
+ )}
); diff --git a/components/Beatmaps/Search/BeatmapsSearchFilters.tsx b/components/Beatmaps/Search/BeatmapsSearchFilters.tsx index d55e355..d8f2c92 100644 --- a/components/Beatmaps/Search/BeatmapsSearchFilters.tsx +++ b/components/Beatmaps/Search/BeatmapsSearchFilters.tsx @@ -1,5 +1,7 @@ "use client"; +import { useCallback, useState } from "react"; + import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { MultiSelect } from "@/components/ui/multi-select"; @@ -11,12 +13,11 @@ import { SelectValue, } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; -import { BeatmapStatusWeb, GameMode } from "@/lib/types/api"; -import { useState, useCallback, useMemo } from "react"; import { useT } from "@/lib/i18n/utils"; +import { BeatmapStatusWeb, GameMode } from "@/lib/types/api"; const beatmapSearchStatusList = Object.values(BeatmapStatusWeb) - .filter((v) => v != BeatmapStatusWeb.UNKNOWN) + .filter(v => v !== BeatmapStatusWeb.UNKNOWN) .map((v) => { return { value: v, @@ -45,7 +46,7 @@ export function BeatmapsSearchFilters({ const t = useT("pages.beatmaps.components.filters"); const [mode, setMode] = useState(defaultMode); const [status, setStatus] = useState( - defaultStatus + defaultStatus, ); const [searchByCustomStatus, setSearchByCustomStatus] = useState(false); @@ -65,13 +66,13 @@ export function BeatmapsSearchFilters({ { const file = e.target.files?.[0]; - if (!file) return; + if (!file) + return; if (maxFileSizeBytes && file.size > maxFileSizeBytes) { toast({ title: t("imageTooBig"), @@ -48,20 +50,21 @@ export default function ImageSelect({ }); return; } - if (e.target.files) setFile(file); + if (e.target.files) + setFile(file); }} /> {file ? (
-
+
avatar
diff --git a/components/General/PrettyCounter.tsx b/components/General/PrettyCounter.tsx index bd1f429..0fe114e 100644 --- a/components/General/PrettyCounter.tsx +++ b/components/General/PrettyCounter.tsx @@ -6,20 +6,18 @@ interface Props { duration?: number; } -export default function PrettyCounter({ value, duration }: Props) { +export default function PrettyCounter({ value, duration = 1300 }: Props) { const [count, setCount] = useState(0); - if (duration === undefined) { - duration = 1300; - } - useEffect(() => { let startTime = null as null | number; - const easeOut: (t: number) => number = (t) => --t * t * t + 1; + // eslint-disable-next-line no-param-reassign -- intentional + const easeOut: (t: number) => number = t => --t * t * t + 1; const step = (timestamp: number) => { - if (!startTime) startTime = timestamp; + if (!startTime) + startTime = timestamp; const progress = timestamp - startTime; const percentage = Math.min(progress / duration!, 1); diff --git a/components/General/PrettyDate.tsx b/components/General/PrettyDate.tsx index ec5ef85..7d2c946 100644 --- a/components/General/PrettyDate.tsx +++ b/components/General/PrettyDate.tsx @@ -1,7 +1,8 @@ "use client"; -import { Tooltip } from "@/components/Tooltip"; import Cookies from "js-cookie"; +import { Tooltip } from "@/components/Tooltip"; + interface PrettyDateProps { time: string | Date; className?: string; @@ -23,15 +24,17 @@ export default function PrettyDate({ const locale = Cookies.get("locale") || "en"; - return withTime ? ( - -
- {date.toLocaleDateString(locale, options)} -
-
- ) : ( -
{date.toLocaleDateString(locale, options)}
- ); + return withTime + ? ( + +
+ {date.toLocaleDateString(locale, options)} +
+
+ ) + : ( +
{date.toLocaleDateString(locale, options)}
+ ); } export function dateToPrettyString(time: string | Date) { diff --git a/components/General/PrettyHeader.tsx b/components/General/PrettyHeader.tsx index 622a9e0..036e944 100644 --- a/components/General/PrettyHeader.tsx +++ b/components/General/PrettyHeader.tsx @@ -23,19 +23,19 @@ export default function PrettyHeader({ `bg-card rounded-t-lg p-4 flex items-center border shadow`, children ? "place-content-between" : "", roundBottom ? "rounded-b-lg" : "", - className + className, )} >
- {icon &&
{icon}
} + {icon &&
{icon}
}

{text}

{counter && ( -
+
{counter}
)} diff --git a/components/General/RoundedContent.tsx b/components/General/RoundedContent.tsx index 2c3ae21..a32adb8 100644 --- a/components/General/RoundedContent.tsx +++ b/components/General/RoundedContent.tsx @@ -13,7 +13,7 @@ export default function RoundedContent({
{children} diff --git a/components/Header/Header.tsx b/components/Header/Header.tsx index 2a1e656..3868cf1 100644 --- a/components/Header/Header.tsx +++ b/components/Header/Header.tsx @@ -1,13 +1,15 @@ "use client"; +import Link from "next/link"; import { useEffect, useState } from "react"; -import HeaderLink from "@/components/Header/HeaderLink"; - import { twMerge } from "tailwind-merge"; -import { ThemeModeToggle } from "@/components/Header/ThemeModeToggle"; -import HeaderSearchCommand from "@/components/Header/HeaderSearchCommand"; -import HeaderMobileDrawer from "@/components/Header/HeaderMobileDrawer"; + +import { Brand } from "@/components/Brand"; import HeaderAvatar from "@/components/Header/HeaderAvatar"; -import Link from "next/link"; +import HeaderLink from "@/components/Header/HeaderLink"; +import HeaderMobileDrawer from "@/components/Header/HeaderMobileDrawer"; +import HeaderSearchCommand from "@/components/Header/HeaderSearchCommand"; +import { LanguageSelector } from "@/components/Header/LanguageSelector"; +import { ThemeModeToggle } from "@/components/Header/ThemeModeToggle"; import { DropdownMenu, DropdownMenuContent, @@ -15,9 +17,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Brand } from "@/components/Brand"; import { useT } from "@/lib/i18n/utils"; -import { LanguageSelector } from "@/components/Header/LanguageSelector"; export default function Header() { const t = useT("components.header"); @@ -43,7 +43,7 @@ export default function Header() {
@@ -51,7 +51,7 @@ export default function Header() { -
+
@@ -63,11 +63,11 @@ export default function Header() { - {t("links.wiki")} + {t("links.wiki")} - {t("links.rules")} + {t("links.rules")} @@ -86,8 +86,8 @@ export default function Header() { )} - {(process.env.NEXT_PUBLIC_KOFI_LINK || - process.env.NEXT_PUBLIC_BOOSTY_LINK) && ( + {(process.env.NEXT_PUBLIC_KOFI_LINK + || process.env.NEXT_PUBLIC_BOOSTY_LINK) && ( {t("links.supportUs")} @@ -98,14 +98,14 @@ export default function Header() {
-
+
-
+
diff --git a/components/Header/HeaderAvatar.tsx b/components/Header/HeaderAvatar.tsx index ba62a77..8d10d0b 100644 --- a/components/Header/HeaderAvatar.tsx +++ b/components/Header/HeaderAvatar.tsx @@ -1,30 +1,33 @@ "use client"; -import useSelf from "@/lib/hooks/useSelf"; -import HeaderUserDropdown from "@/components/Header/HeaderUserDropdown"; +import Image from "next/image"; +import { Suspense } from "react"; + import HeaderLoginDialog from "@/components/Header/HeaderLoginDialog"; +import HeaderUserDropdown from "@/components/Header/HeaderUserDropdown"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { Suspense } from "react"; -import Image from "next/image"; import { Button } from "@/components/ui/button"; +import useSelf from "@/lib/hooks/useSelf"; export default function HeaderAvatar() { const { self } = useSelf(); - return self ? ( - - - - ) : ( - - ); + return self + ? ( + + + + ) + : ( + + ); } diff --git a/components/Header/HeaderLink.tsx b/components/Header/HeaderLink.tsx index e18e6ba..532e323 100644 --- a/components/Header/HeaderLink.tsx +++ b/components/Header/HeaderLink.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; -import React from "react"; +import * as React from "react"; interface Props { name: string; @@ -14,27 +14,27 @@ export default function HeaderLink({ name, href }: Props) { const isActive = pathname === href; const Wrapper = href ? Link : React.Fragment; - const wrapperProps = href ? { href: href } : {}; + const wrapperProps = href ? { href } : {}; return (
- {/* @ts-ignore */} + {/* @ts-expect-error -- We hangle props the same way as Wrapper object */}

{name} {/* Active indicator */} diff --git a/components/Header/HeaderLoginDialog.tsx b/components/Header/HeaderLoginDialog.tsx index f2f16f9..3724aea 100644 --- a/components/Header/HeaderLoginDialog.tsx +++ b/components/Header/HeaderLoginDialog.tsx @@ -1,24 +1,25 @@ "use client"; -import React, { useContext, useState, useMemo } from "react"; +import { zodResolver } from "@hookform/resolvers/zod"; +import Cookies from "js-cookie"; +import { useRouter } from "next/navigation"; +import * as React from "react"; +import { useContext, useMemo, useState } from "react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { MobileDrawerContext } from "@/components/Header/HeaderMobileDrawer"; import { Button } from "@/components/ui/button"; import { - DialogHeader, - DialogFooter, Dialog, + DialogClose, DialogContent, DialogDescription, + DialogFooter, + DialogHeader, DialogTitle, DialogTrigger, - DialogClose, } from "@/components/ui/dialog"; -import { Input } from "@/components/ui/input"; -import useSelf from "@/lib/hooks/useSelf"; -import useRestriction from "@/lib/hooks/useRestriction"; -import { useAuthorize } from "@/lib/hooks/api/auth/useAuthorize"; - -import Cookies from "js-cookie"; import { Form, FormControl, @@ -27,13 +28,12 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useToast } from "@/hooks/use-toast"; +import { Input } from "@/components/ui/input"; import { Separator } from "@/components/ui/separator"; -import { useRouter } from "next/navigation"; -import { MobileDrawerContext } from "@/components/Header/HeaderMobileDrawer"; +import { useToast } from "@/hooks/use-toast"; +import { useAuthorize } from "@/lib/hooks/api/auth/useAuthorize"; +import useRestriction from "@/lib/hooks/useRestriction"; +import useSelf from "@/lib/hooks/useSelf"; import { useT } from "@/lib/i18n/utils"; export default function HeaderLoginDialog() { @@ -70,7 +70,7 @@ export default function HeaderLoginDialog() { message: t("validation.passwordMaxLength"), }), }), - [t] + [t], ); const form = useForm>({ @@ -116,7 +116,7 @@ export default function HeaderLoginDialog() { setError(errorMessage || "Unknown error"); }, - } + }, ); } @@ -169,6 +169,7 @@ export default function HeaderLoginDialog() { @@ -164,14 +167,14 @@ export default function HeaderSearchCommand() { {userSearchQuery.isLoading && !userSearch ? ( -

+
) : ( - searchQuery != "" && - userSearch?.map((result, index) => ( + searchQuery !== "" + && userSearch?.map(result => ( openPage(`/user/${result.user_id}`)} > @@ -182,14 +185,14 @@ export default function HeaderSearchCommand() { {beatmapsetSearchQuery.isLoading && !beatmapsetSearch ? ( -
+
) : ( - searchQuery != "" && - beatmapsetSearch?.map((result, index) => ( + searchQuery !== "" + && beatmapsetSearch?.map(result => ( openPage(`/beatmapsets/${result.id}`)} > @@ -200,7 +203,7 @@ export default function HeaderSearchCommand() { - {pagesList.map((page) => ( + {pagesList.map(page => ( openPage(page.url)} diff --git a/components/Header/HeaderUserDropdown.tsx b/components/Header/HeaderUserDropdown.tsx index 742ba8b..f3a953a 100644 --- a/components/Header/HeaderUserDropdown.tsx +++ b/components/Header/HeaderUserDropdown.tsx @@ -1,6 +1,22 @@ "use client"; +import { + Cog, + Home, + LogOutIcon, + MonitorCog, + UserCircleIcon, + Users2, +} from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; import { Suspense } from "react"; + +import UserPrivilegeBadges from "@/app/(website)/user/[id]/components/UserPrivilegeBadges"; +import { HeaderLogoutAlert } from "@/components/Header/HeaderLogoutAlert"; +import ImageWithFallback from "@/components/ImageWithFallback"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { DropdownMenu, DropdownMenuContent, @@ -10,25 +26,9 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; - -import Image from "next/image"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import ImageWithFallback from "@/components/ImageWithFallback"; -import { HeaderLogoutAlert } from "@/components/Header/HeaderLogoutAlert"; -import Link from "next/link"; -import { UserBadge, UserResponse } from "@/lib/types/api"; -import { - Cog, - Home, - LogOutIcon, - MonitorCog, - UserCircleIcon, - Users2, -} from "lucide-react"; -import UserPrivilegeBadges from "@/app/(website)/user/[id]/components/UserPrivilegeBadges"; -import { usePathname, useRouter } from "next/navigation"; -import { isUserCanUseAdminPanel } from "@/lib/utils/userPrivileges.util"; import { useT } from "@/lib/i18n/utils"; +import type { UserResponse } from "@/lib/types/api"; +import { isUserCanUseAdminPanel } from "@/lib/utils/userPrivileges.util"; interface Props { self: UserResponse | null; @@ -58,22 +58,22 @@ export default function HeaderUserDropdown({ sideOffset={sideOffset} align={align} > - + <>
-
+
- + UA}> -
-
+
+
{self.username}
@@ -104,13 +104,13 @@ export default function HeaderUserDropdown({ - + {t("friends")} - + {t("settings")} @@ -122,12 +122,12 @@ export default function HeaderUserDropdown({ {pathname.includes("/admin") ? ( - + {t("returnToMainSite")} ) : ( - + {t("adminPanel")} @@ -138,7 +138,7 @@ export default function HeaderUserDropdown({ e.preventDefault()} + onSelect={e => e.preventDefault()} asChild className="cursor-pointer" > diff --git a/components/Header/LanguageSelector.tsx b/components/Header/LanguageSelector.tsx index 4c1babf..d095143 100644 --- a/components/Header/LanguageSelector.tsx +++ b/components/Header/LanguageSelector.tsx @@ -1,21 +1,22 @@ "use client"; -import { useCallback, useMemo } from "react"; -import { useRouter } from "next/navigation"; import Cookies from "js-cookie"; +import { Check, Languages } from "lucide-react"; +import Image from "next/image"; +import { useRouter } from "next/navigation"; import { useLocale } from "next-intl"; +import { useCallback, useMemo } from "react"; + +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Languages, Check } from "lucide-react"; -import { cn } from "@/lib/utils"; -import Image from "next/image"; import { AVAILABLE_LOCALES, DISPLAY_NAMES_LOCALES } from "@/lib/i18n/messages"; import { getCountryCodeForLocale } from "@/lib/i18n/utils"; +import { cn } from "@/lib/utils"; export function LanguageSelector() { const router = useRouter(); @@ -26,7 +27,7 @@ export function LanguageSelector() { Cookies.set("locale", locale); router.refresh(); }, - [router] + [router], ); const getLanguageName = useCallback( @@ -36,20 +37,21 @@ export function LanguageSelector() { type: "language", }); - const name = - DISPLAY_NAMES_LOCALES[locale] || - displayNames.of(locale) || - locale.toUpperCase(); + const name + = DISPLAY_NAMES_LOCALES[locale] + || displayNames.of(locale) + || locale.toUpperCase(); return name; - } catch { + } + catch { return DISPLAY_NAMES_LOCALES[locale] || locale.toUpperCase(); } }, - [currentLocale] + [currentLocale], ); const languages = useMemo(() => { - return AVAILABLE_LOCALES.map((localeCode) => ({ + return AVAILABLE_LOCALES.map(localeCode => ({ code: localeCode, countryCode: getCountryCodeForLocale(localeCode), nativeName: getLanguageName(localeCode, localeCode), @@ -62,15 +64,15 @@ export function LanguageSelector() { {languages @@ -83,8 +85,8 @@ export function LanguageSelector() { key={locale.code} onClick={() => changeLanguage(locale.code)} className={cn( - "flex items-center gap-3 cursor-pointer py-2.5 px-3", - isActive && "bg-accent" + "flex cursor-pointer items-center gap-3 px-3 py-2.5", + isActive && "bg-accent", )} > {`${locale.nativeName} {locale.nativeName} {isActive && ( - + )} ); diff --git a/components/Header/ThemeModeToggle.tsx b/components/Header/ThemeModeToggle.tsx index d32032b..f6ef9de 100644 --- a/components/Header/ThemeModeToggle.tsx +++ b/components/Header/ThemeModeToggle.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import { Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; +import * as React from "react"; import { Button } from "@/components/ui/button"; import { @@ -20,13 +20,11 @@ export function ThemeModeToggle({ children }: { children?: React.ReactNode }) { return ( - {children ? ( - children - ) : ( + {children ?? (