From 672f91d673aff0f0d2b0db3ffe700f2cc49b5bdc Mon Sep 17 00:00:00 2001 From: Chen Date: Sun, 12 Apr 2026 23:39:53 +0900 Subject: [PATCH 1/6] feat: mission1 upload --- week05/Plat/mission1/.gitignore | 24 + week05/Plat/mission1/README.md | 1 + week05/Plat/mission1/eslint.config.js | 23 + week05/Plat/mission1/index.html | 13 + week05/Plat/mission1/package-lock.json | 3346 +++++++++++++++++ week05/Plat/mission1/package.json | 35 + week05/Plat/mission1/src/App.css | 0 week05/Plat/mission1/src/App.tsx | 51 + week05/Plat/mission1/src/apis/auth.ts | 39 + week05/Plat/mission1/src/apis/axios.ts | 23 + week05/Plat/mission1/src/constants/key.ts | 4 + .../Plat/mission1/src/context/AuthContext.tsx | 92 + week05/Plat/mission1/src/hooks/useForm.ts | 46 + .../mission1/src/hooks/useLocalStorage.ts | 29 + week05/Plat/mission1/src/index.css | 1 + .../Plat/mission1/src/layouts/HomeLayout.tsx | 48 + .../mission1/src/layouts/ProtectedLayout.tsx | 16 + week05/Plat/mission1/src/main.tsx | 10 + week05/Plat/mission1/src/pages/HomePage.tsx | 40 + week05/Plat/mission1/src/pages/LoginPage.tsx | 61 + week05/Plat/mission1/src/pages/Mypage.tsx | 76 + .../Plat/mission1/src/pages/NotFoundPage.tsx | 25 + week05/Plat/mission1/src/pages/SignupPage.tsx | 120 + week05/Plat/mission1/src/types/auth.ts | 44 + week05/Plat/mission1/src/types/common.ts | 6 + week05/Plat/mission1/src/utils/validate.ts | 31 + week05/Plat/mission1/src/vite-env.d.ts | 7 + week05/Plat/mission1/tsconfig.app.json | 25 + week05/Plat/mission1/tsconfig.json | 7 + week05/Plat/mission1/tsconfig.node.json | 24 + week05/Plat/mission1/vite.config.ts | 8 + 31 files changed, 4275 insertions(+) create mode 100644 week05/Plat/mission1/.gitignore create mode 100644 week05/Plat/mission1/README.md create mode 100644 week05/Plat/mission1/eslint.config.js create mode 100644 week05/Plat/mission1/index.html create mode 100644 week05/Plat/mission1/package-lock.json create mode 100644 week05/Plat/mission1/package.json create mode 100644 week05/Plat/mission1/src/App.css create mode 100644 week05/Plat/mission1/src/App.tsx create mode 100644 week05/Plat/mission1/src/apis/auth.ts create mode 100644 week05/Plat/mission1/src/apis/axios.ts create mode 100644 week05/Plat/mission1/src/constants/key.ts create mode 100644 week05/Plat/mission1/src/context/AuthContext.tsx create mode 100644 week05/Plat/mission1/src/hooks/useForm.ts create mode 100644 week05/Plat/mission1/src/hooks/useLocalStorage.ts create mode 100644 week05/Plat/mission1/src/index.css create mode 100644 week05/Plat/mission1/src/layouts/HomeLayout.tsx create mode 100644 week05/Plat/mission1/src/layouts/ProtectedLayout.tsx create mode 100644 week05/Plat/mission1/src/main.tsx create mode 100644 week05/Plat/mission1/src/pages/HomePage.tsx create mode 100644 week05/Plat/mission1/src/pages/LoginPage.tsx create mode 100644 week05/Plat/mission1/src/pages/Mypage.tsx create mode 100644 week05/Plat/mission1/src/pages/NotFoundPage.tsx create mode 100644 week05/Plat/mission1/src/pages/SignupPage.tsx create mode 100644 week05/Plat/mission1/src/types/auth.ts create mode 100644 week05/Plat/mission1/src/types/common.ts create mode 100644 week05/Plat/mission1/src/utils/validate.ts create mode 100644 week05/Plat/mission1/src/vite-env.d.ts create mode 100644 week05/Plat/mission1/tsconfig.app.json create mode 100644 week05/Plat/mission1/tsconfig.json create mode 100644 week05/Plat/mission1/tsconfig.node.json create mode 100644 week05/Plat/mission1/vite.config.ts diff --git a/week05/Plat/mission1/.gitignore b/week05/Plat/mission1/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/week05/Plat/mission1/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/week05/Plat/mission1/README.md b/week05/Plat/mission1/README.md new file mode 100644 index 0000000..c429874 --- /dev/null +++ b/week05/Plat/mission1/README.md @@ -0,0 +1 @@ +# 커스텀 훅과 로그인 유효성 검사 & 에러메시지 표현 \ No newline at end of file diff --git a/week05/Plat/mission1/eslint.config.js b/week05/Plat/mission1/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/week05/Plat/mission1/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/week05/Plat/mission1/index.html b/week05/Plat/mission1/index.html new file mode 100644 index 0000000..c045894 --- /dev/null +++ b/week05/Plat/mission1/index.html @@ -0,0 +1,13 @@ + + + + + + + login + + +
+ + + diff --git a/week05/Plat/mission1/package-lock.json b/week05/Plat/mission1/package-lock.json new file mode 100644 index 0000000..2df8943 --- /dev/null +++ b/week05/Plat/mission1/package-lock.json @@ -0,0 +1,3346 @@ +{ + "name": "login", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "login", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "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, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "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/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, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.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.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", + "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "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/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/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, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-hook-form": { + "version": "7.72.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.1.tgz", + "integrity": "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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" + } + } + } +} diff --git a/week05/Plat/mission1/package.json b/week05/Plat/mission1/package.json new file mode 100644 index 0000000..9c99619 --- /dev/null +++ b/week05/Plat/mission1/package.json @@ -0,0 +1,35 @@ +{ + "name": "login", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} diff --git a/week05/Plat/mission1/src/App.css b/week05/Plat/mission1/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/week05/Plat/mission1/src/App.tsx b/week05/Plat/mission1/src/App.tsx new file mode 100644 index 0000000..afecf25 --- /dev/null +++ b/week05/Plat/mission1/src/App.tsx @@ -0,0 +1,51 @@ +import './App.css' +import { createBrowserRouter, RouterProvider, type RouteObject } from 'react-router-dom' +import HomePage from './pages/HomePage' +import NotFoundPage from './pages/NotFoundPage' +import HomeLayout from './layouts/HomeLayout' +import SignupPage from './pages/SignupPage' +import LoginPage from './pages/LoginPage' +import MyPage from './pages/Mypage' +import { AuthProvider } from './context/AuthContext' +import ProtectedLayout from './layouts/ProtectedLayout' + + +const publicRoutes:RouteObject[]=[ + { + path: "/", + element: , + errorElement: , + children: [ + { index: true, element: }, + { path: "login", element: }, + { path: "signup", element: }, + ] + } +]; + +const protectedRoutes:RouteObject[] = [ + { + path:"/", + element: , + errorElement: , + children:[ + { + path:"my", + element:, + } + ] + } +] + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); + +function App() { + + return ( + + + + ) +} + +export default App diff --git a/week05/Plat/mission1/src/apis/auth.ts b/week05/Plat/mission1/src/apis/auth.ts new file mode 100644 index 0000000..b0b3cdc --- /dev/null +++ b/week05/Plat/mission1/src/apis/auth.ts @@ -0,0 +1,39 @@ +import { axiosInstance } from "./axios"; +import type { + RequestSignupDto, + ResponseSignupDto, + RequestSigninDto, + ResponseSigninDto, + ResponseMyInfoDto, +} from "../types/auth" + +export const postSignup = async ( + body: RequestSignupDto, +):Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signup", + body, + ); + return data; +} + +export const postSignin = async ( + body: RequestSigninDto, + ): Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signin", + body, + ); + return data; +} + +export const getMyInfo = async ():Promise => { + const { data } = await axiosInstance.get("/v1/users/me"); + + return data; +}; + +export const postLogout = async () => { + const { data } = await axiosInstance.post("/v1/auth/signout"); + return data; +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/apis/axios.ts b/week05/Plat/mission1/src/apis/axios.ts new file mode 100644 index 0000000..b30ca46 --- /dev/null +++ b/week05/Plat/mission1/src/apis/axios.ts @@ -0,0 +1,23 @@ +import axios from "axios"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { useLocalStorage } from "../hooks/useLocalStorage"; + +export const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + /* + headers: { + Authorization: `Bearer ${localStorage.getItem(LOCAL_STORAGE_KEY.accessToken)}` + }, + */ +}); + +axiosInstance.interceptors.request.use((config) => { + const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const token = getItem(); + + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + + return config; +}) \ No newline at end of file diff --git a/week05/Plat/mission1/src/constants/key.ts b/week05/Plat/mission1/src/constants/key.ts new file mode 100644 index 0000000..cc4fb34 --- /dev/null +++ b/week05/Plat/mission1/src/constants/key.ts @@ -0,0 +1,4 @@ +export const LOCAL_STORAGE_KEY = { + accessToken: "accessToken", + refreshToken: "refreshToken" +}; diff --git a/week05/Plat/mission1/src/context/AuthContext.tsx b/week05/Plat/mission1/src/context/AuthContext.tsx new file mode 100644 index 0000000..7d45973 --- /dev/null +++ b/week05/Plat/mission1/src/context/AuthContext.tsx @@ -0,0 +1,92 @@ +import { createContext, useContext, useState, type PropsWithChildren } from "react"; +import type { RequestSigninDto } from "../types/auth"; +import { useLocalStorage } from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { postSignin, postLogout } from "../apis/auth"; + +interface AuthContextType { + accessToken: string | null; + refreshToken: string | null; + login: (signinData: RequestSigninDto) => Promise; + logout: () => Promise; +} + +export const AuthContext = createContext({ + accessToken: null, + refreshToken: null, + login: async () => {}, + logout: async () => {}, +}); + +export const AuthProvider = ({children}:PropsWithChildren) => { + const { + getItem: getAccessTokenFormStorage, + setItem: setAccessTokenInStorage, + removeItem: removeAccessTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const { + getItem: getRefreshTokenFormStorage, + setItem: setRefreshTokenInStorage, + removeItem: removeRefreshTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.refreshToken); + + const [accessToken, setAccessToken] = useState( + getAccessTokenFormStorage(), + ) + const [refreshToken, setRefreshToken] = useState( + getRefreshTokenFormStorage(), + ) + + const login = async (signinData: RequestSigninDto) => { + try{ + const { data } = await postSignin(signinData); + + if(data){ + const newAccessToken = data.accessToken; + const newRefreshToken = data.refreshToken; + + setAccessToken(newAccessToken); + setRefreshToken(newRefreshToken); + + setAccessTokenInStorage(newAccessToken); + setRefreshTokenInStorage(newRefreshToken); + } + window.location.href='my'; + } catch (error) { + console.error("Login Error", error); + alert("Login Failed"); + } + } + + const logout = async () => { + try { + await postLogout(); + removeAccessTokenFromStroage(); + removeRefreshTokenFromStroage(); + + setAccessToken(null); + setRefreshToken(null); + + alert("Logout Successs"); + } catch(error) { + console.log("Logout Error", error); + alert("Logout Failed"); + } + } + + return ( + + {children} + + ) +} + +export const useAuth = () => { + const context = useContext(AuthContext); + + if(!context){ + throw new Error("Not Found AuthContext"); + } + + return context; +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/hooks/useForm.ts b/week05/Plat/mission1/src/hooks/useForm.ts new file mode 100644 index 0000000..08ccffb --- /dev/null +++ b/week05/Plat/mission1/src/hooks/useForm.ts @@ -0,0 +1,46 @@ +import { useEffect, useState } from "react"; + +interface UseFormProps { + initialValues: T; + validate?: (values: T) => Record; +} + +export function useForm({ initialValues, validate }: UseFormProps) { + const [values, setValues] = useState(initialValues); + const [touched, setTouched] = useState>(); + const [errors, setErrors] = useState>(); + + const handleChange = (name: keyof T, text: string) => { + setValues({ + ...values, + [name]: text, + }); + }; + + const handleBlur = (name: keyof T) => { + setTouched({ + ...touched, + [name]: true, + }); + }; + + const getInputProps = (name: keyof T) => { + const value = values[name]; + const onChange = (e: React.ChangeEvent,) => + handleChange(name, e.target.value); + const onBlur = () => handleBlur(name); + + return { + value, + onChange, + onBlur, + }; + } + + useEffect(() => { + const newErrors = validate ? validate(values) : {}; + setErrors(newErrors); + }, [values, validate]); + + return { values, errors, touched, getInputProps }; +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/hooks/useLocalStorage.ts b/week05/Plat/mission1/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..e497c66 --- /dev/null +++ b/week05/Plat/mission1/src/hooks/useLocalStorage.ts @@ -0,0 +1,29 @@ +export const useLocalStorage = (key: string) => { + const setItem = (value: unknown) => { + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.log(error) + } + }; + + const getItem = () => { + try { + const item = window.localStorage.getItem(key); + + return item ? JSON.parse(item) : null; + } catch(e) { + console.log(e); + } + }; + + const removeItem = () => { + try { + window.localStorage.removeItem(key); + } catch (error) { + console.log(error) + } + }; + + return { setItem, getItem, removeItem } +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/index.css b/week05/Plat/mission1/src/index.css new file mode 100644 index 0000000..a461c50 --- /dev/null +++ b/week05/Plat/mission1/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file diff --git a/week05/Plat/mission1/src/layouts/HomeLayout.tsx b/week05/Plat/mission1/src/layouts/HomeLayout.tsx new file mode 100644 index 0000000..6424f8b --- /dev/null +++ b/week05/Plat/mission1/src/layouts/HomeLayout.tsx @@ -0,0 +1,48 @@ +import { Outlet, Link } from "react-router-dom"; + +export default function HomeLayout() { + return ( +
+ + {/* Header */} +
+
+ + MyApp + + + +
+
+ + {/* Main */} +
+ +
+ + {/* Footer */} +
+
+ © 2026 MyApp + Built with React + Tailwind +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/layouts/ProtectedLayout.tsx b/week05/Plat/mission1/src/layouts/ProtectedLayout.tsx new file mode 100644 index 0000000..f471295 --- /dev/null +++ b/week05/Plat/mission1/src/layouts/ProtectedLayout.tsx @@ -0,0 +1,16 @@ +import { useAuth } from "../context/AuthContext" +import { Navigate, Outlet } from "react-router-dom"; + +const ProtectedLayout = () => { + const { accessToken } = useAuth(); + + if(!accessToken){ + return + } + + return( + + ) +} + +export default ProtectedLayout; \ No newline at end of file diff --git a/week05/Plat/mission1/src/main.tsx b/week05/Plat/mission1/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/week05/Plat/mission1/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/week05/Plat/mission1/src/pages/HomePage.tsx b/week05/Plat/mission1/src/pages/HomePage.tsx new file mode 100644 index 0000000..f6d3449 --- /dev/null +++ b/week05/Plat/mission1/src/pages/HomePage.tsx @@ -0,0 +1,40 @@ +import { Link } from "react-router-dom"; + +export default function HomePage() { + return ( +
+
+ + {/* 타이틀 */} +

Welcome

+

+ Please choose an option below +

+ + {/* 버튼 영역 */} +
+ + Login + + + + Sign Up + + + + My Page + +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/pages/LoginPage.tsx b/week05/Plat/mission1/src/pages/LoginPage.tsx new file mode 100644 index 0000000..8bcd38f --- /dev/null +++ b/week05/Plat/mission1/src/pages/LoginPage.tsx @@ -0,0 +1,61 @@ +import { useAuth } from "../context/AuthContext"; +import { useForm } from "../hooks/useForm"; +import { validateSignin, type UserSignInformation } from "../utils/validate"; +import { Link } from "react-router-dom"; + +export default function LoginPage() { + const { login } = useAuth(); + const { values, errors, touched, getInputProps } = + useForm({ + initialValues: { + email: "", + password: "", + }, + validate: validateSignin, + }); + + const handleSubmit = async () => { + await login(values); + } + + const isDisabled = + Object.values(errors || {}).some((error) => error.length > 0) || + Object.values(values).some((value) => value === ""); + + return ( +
+
+ Sign up | + My +
+
+ + {errors?.email && touched?.email && ( +

{errors.email}

+ )} + + {errors?.password && touched?.password && ( +

{errors.password}

+ )} + +
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/pages/Mypage.tsx b/week05/Plat/mission1/src/pages/Mypage.tsx new file mode 100644 index 0000000..44b498b --- /dev/null +++ b/week05/Plat/mission1/src/pages/Mypage.tsx @@ -0,0 +1,76 @@ +import { useEffect, useState } from "react"; +import { getMyInfo } from "../apis/auth"; +import { type ResponseMyInfoDto } from "../types/auth"; +import { useAuth } from "../context/AuthContext"; +import { useNavigate } from "react-router-dom"; + +const MyPage = () => { + const [data, setData] = useState(); + const { logout } = useAuth(); + const navigate = useNavigate(); + + useEffect(() => { + const getData = async () => { + const response = await getMyInfo(); + console.log(response); + setData(response); + }; + + getData(); + }, []); + + const handleLogout = async () => { + await logout(); + navigate("/"); + }; + + if (!data) { + return ( +
+
+

Loading...

+
+
+ ); + } + + return ( +
+
+
+
+ {data.data?.name?.charAt(0).toUpperCase()} +
+ +

My Page

+

Your profile information

+
+ +
+
+

Nickname

+

+ {data.data?.name} +

+
+ +
+

Email

+

+ {data.data?.email} +

+
+
+ + +
+
+ ); +}; + +export default MyPage; \ No newline at end of file diff --git a/week05/Plat/mission1/src/pages/NotFoundPage.tsx b/week05/Plat/mission1/src/pages/NotFoundPage.tsx new file mode 100644 index 0000000..36bbb32 --- /dev/null +++ b/week05/Plat/mission1/src/pages/NotFoundPage.tsx @@ -0,0 +1,25 @@ +import { Link } from "react-router-dom"; + +export default function NotFoundPage() { + return ( +
+ +

404

+ +

+ 페이지를 찾을 수 없습니다 +

+ +

+ 요청하신 페이지가 존재하지 않거나 잘못된 경로입니다. +

+ + + 홈으로 돌아가기 + +
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/pages/SignupPage.tsx b/week05/Plat/mission1/src/pages/SignupPage.tsx new file mode 100644 index 0000000..c302b7d --- /dev/null +++ b/week05/Plat/mission1/src/pages/SignupPage.tsx @@ -0,0 +1,120 @@ +import { z } from 'zod'; +import { useForm, type SubmitHandler } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { postSignup } from '../apis/auth'; +import { Link } from 'react-router-dom'; + +const schema = z.object({ + email: z + .string() + .email({ message: 'Invalid email address' }), + + password: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + passwordCheck: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + name: z + .string() + .min(1, { message: 'Name is required' }), +}) +.refine((data) => data.password === data.passwordCheck, { + message: "Passwords do not match", + path: ['passwordCheck'], +}); + +type FormFields = z.infer; + +const SignupPage = () => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues: { + name: '', + password: '', + passwordCheck: '', + email: '', + }, + resolver: zodResolver(schema), + }); + + const onSubmit: SubmitHandler = async (data) => { + const {passwordCheck, ...rest} = data; + + const response = await postSignup(rest); + + console.log(response); + }; + + return ( +
+
+ Sign in | + My +
+
+ + {errors.email && ( +
{errors.email.message}
+ )} + + {errors.password && ( +
{errors.password.message}
+ )} + + {errors.passwordCheck && ( +
{errors.passwordCheck.message}
+ )} + + {errors.name && ( +
{errors.name.message}
+ )} + +
+
+ ); +} + +export default SignupPage; \ No newline at end of file diff --git a/week05/Plat/mission1/src/types/auth.ts b/week05/Plat/mission1/src/types/auth.ts new file mode 100644 index 0000000..9fc47d7 --- /dev/null +++ b/week05/Plat/mission1/src/types/auth.ts @@ -0,0 +1,44 @@ +import type { CommonResponse } from "./common"; + +//Signup +export type RequestSignupDto = { + name: string; + email: string; + bio?: string; + avatar?: string; + password: string; +}; + +export type ResponseSignupDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}>; + +//Login +export type RequestSigninDto = { + email: string; + password: string; +} + +export type ResponseSigninDto = CommonResponse<{ + id: number; + name: string; + accessToken: string; + refreshToken: string; +}> + +// My Data Join +export type ResponseMyInfoDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}> \ No newline at end of file diff --git a/week05/Plat/mission1/src/types/common.ts b/week05/Plat/mission1/src/types/common.ts new file mode 100644 index 0000000..aa8a9fd --- /dev/null +++ b/week05/Plat/mission1/src/types/common.ts @@ -0,0 +1,6 @@ +export type CommonResponse = { + status: boolean; + statusCode: number; + message: string; + data: T; +} \ No newline at end of file diff --git a/week05/Plat/mission1/src/utils/validate.ts b/week05/Plat/mission1/src/utils/validate.ts new file mode 100644 index 0000000..e392766 --- /dev/null +++ b/week05/Plat/mission1/src/utils/validate.ts @@ -0,0 +1,31 @@ +export type UserSignInformation = { + email: string; + password: string; +} + +function validateUser(values: UserSignInformation) { + const errors: Record = { + email: "", + password: "", + }; + + if (!values.email) { + errors.email = "Email is required"; + } else if (!/\S+@\S+\.\S+/.test(values.email)) { + errors.email = "Email is invalid"; + } + + if (!values.password) { + errors.password = "Password is required"; + } else if (values.password.length < 8 || values.password.length > 20) { + errors.password = "Password must be at least 8~20 characters"; + } + + return errors; +} + +function validateSignin(values: UserSignInformation) { + return validateUser(values); +}; + +export { validateSignin }; \ No newline at end of file diff --git a/week05/Plat/mission1/src/vite-env.d.ts b/week05/Plat/mission1/src/vite-env.d.ts new file mode 100644 index 0000000..7461706 --- /dev/null +++ b/week05/Plat/mission1/src/vite-env.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly VITE_SERVER_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} \ No newline at end of file diff --git a/week05/Plat/mission1/tsconfig.app.json b/week05/Plat/mission1/tsconfig.app.json new file mode 100644 index 0000000..1d29c88 --- /dev/null +++ b/week05/Plat/mission1/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/week05/Plat/mission1/tsconfig.json b/week05/Plat/mission1/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/week05/Plat/mission1/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/week05/Plat/mission1/tsconfig.node.json b/week05/Plat/mission1/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/week05/Plat/mission1/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/week05/Plat/mission1/vite.config.ts b/week05/Plat/mission1/vite.config.ts new file mode 100644 index 0000000..c4069b7 --- /dev/null +++ b/week05/Plat/mission1/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}) From 33a35705130a47734baecd77afe814308704b766 Mon Sep 17 00:00:00 2001 From: Chen Date: Sun, 12 Apr 2026 23:48:08 +0900 Subject: [PATCH 2/6] feat: mission2 upload --- week05/Plat/mission2/.gitignore | 24 + week05/Plat/mission2/README.md | 1 + week05/Plat/mission2/eslint.config.js | 23 + week05/Plat/mission2/index.html | 13 + week05/Plat/mission2/package-lock.json | 3346 +++++++++++++++++ week05/Plat/mission2/package.json | 35 + week05/Plat/mission2/src/App.css | 0 week05/Plat/mission2/src/App.tsx | 51 + week05/Plat/mission2/src/apis/auth.ts | 39 + week05/Plat/mission2/src/apis/axios.ts | 23 + week05/Plat/mission2/src/constants/key.ts | 4 + .../Plat/mission2/src/context/AuthContext.tsx | 92 + week05/Plat/mission2/src/hooks/useForm.ts | 46 + .../mission2/src/hooks/useLocalStorage.ts | 29 + week05/Plat/mission2/src/index.css | 1 + .../Plat/mission2/src/layouts/HomeLayout.tsx | 48 + .../mission2/src/layouts/ProtectedLayout.tsx | 16 + week05/Plat/mission2/src/main.tsx | 10 + week05/Plat/mission2/src/pages/HomePage.tsx | 40 + week05/Plat/mission2/src/pages/LoginPage.tsx | 61 + week05/Plat/mission2/src/pages/Mypage.tsx | 76 + .../Plat/mission2/src/pages/NotFoundPage.tsx | 25 + week05/Plat/mission2/src/pages/SignupPage.tsx | 120 + week05/Plat/mission2/src/types/auth.ts | 44 + week05/Plat/mission2/src/types/common.ts | 6 + week05/Plat/mission2/src/utils/validate.ts | 31 + week05/Plat/mission2/src/vite-env.d.ts | 7 + week05/Plat/mission2/tsconfig.app.json | 25 + week05/Plat/mission2/tsconfig.json | 7 + week05/Plat/mission2/tsconfig.node.json | 24 + week05/Plat/mission2/vite.config.ts | 8 + 31 files changed, 4275 insertions(+) create mode 100644 week05/Plat/mission2/.gitignore create mode 100644 week05/Plat/mission2/README.md create mode 100644 week05/Plat/mission2/eslint.config.js create mode 100644 week05/Plat/mission2/index.html create mode 100644 week05/Plat/mission2/package-lock.json create mode 100644 week05/Plat/mission2/package.json create mode 100644 week05/Plat/mission2/src/App.css create mode 100644 week05/Plat/mission2/src/App.tsx create mode 100644 week05/Plat/mission2/src/apis/auth.ts create mode 100644 week05/Plat/mission2/src/apis/axios.ts create mode 100644 week05/Plat/mission2/src/constants/key.ts create mode 100644 week05/Plat/mission2/src/context/AuthContext.tsx create mode 100644 week05/Plat/mission2/src/hooks/useForm.ts create mode 100644 week05/Plat/mission2/src/hooks/useLocalStorage.ts create mode 100644 week05/Plat/mission2/src/index.css create mode 100644 week05/Plat/mission2/src/layouts/HomeLayout.tsx create mode 100644 week05/Plat/mission2/src/layouts/ProtectedLayout.tsx create mode 100644 week05/Plat/mission2/src/main.tsx create mode 100644 week05/Plat/mission2/src/pages/HomePage.tsx create mode 100644 week05/Plat/mission2/src/pages/LoginPage.tsx create mode 100644 week05/Plat/mission2/src/pages/Mypage.tsx create mode 100644 week05/Plat/mission2/src/pages/NotFoundPage.tsx create mode 100644 week05/Plat/mission2/src/pages/SignupPage.tsx create mode 100644 week05/Plat/mission2/src/types/auth.ts create mode 100644 week05/Plat/mission2/src/types/common.ts create mode 100644 week05/Plat/mission2/src/utils/validate.ts create mode 100644 week05/Plat/mission2/src/vite-env.d.ts create mode 100644 week05/Plat/mission2/tsconfig.app.json create mode 100644 week05/Plat/mission2/tsconfig.json create mode 100644 week05/Plat/mission2/tsconfig.node.json create mode 100644 week05/Plat/mission2/vite.config.ts diff --git a/week05/Plat/mission2/.gitignore b/week05/Plat/mission2/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/week05/Plat/mission2/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/week05/Plat/mission2/README.md b/week05/Plat/mission2/README.md new file mode 100644 index 0000000..c429874 --- /dev/null +++ b/week05/Plat/mission2/README.md @@ -0,0 +1 @@ +# 커스텀 훅과 로그인 유효성 검사 & 에러메시지 표현 \ No newline at end of file diff --git a/week05/Plat/mission2/eslint.config.js b/week05/Plat/mission2/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/week05/Plat/mission2/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/week05/Plat/mission2/index.html b/week05/Plat/mission2/index.html new file mode 100644 index 0000000..c045894 --- /dev/null +++ b/week05/Plat/mission2/index.html @@ -0,0 +1,13 @@ + + + + + + + login + + +
+ + + diff --git a/week05/Plat/mission2/package-lock.json b/week05/Plat/mission2/package-lock.json new file mode 100644 index 0000000..2df8943 --- /dev/null +++ b/week05/Plat/mission2/package-lock.json @@ -0,0 +1,3346 @@ +{ + "name": "login", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "login", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "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, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "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/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, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.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.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", + "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "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/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/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, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-hook-form": { + "version": "7.72.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.1.tgz", + "integrity": "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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" + } + } + } +} diff --git a/week05/Plat/mission2/package.json b/week05/Plat/mission2/package.json new file mode 100644 index 0000000..9c99619 --- /dev/null +++ b/week05/Plat/mission2/package.json @@ -0,0 +1,35 @@ +{ + "name": "login", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} diff --git a/week05/Plat/mission2/src/App.css b/week05/Plat/mission2/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/week05/Plat/mission2/src/App.tsx b/week05/Plat/mission2/src/App.tsx new file mode 100644 index 0000000..afecf25 --- /dev/null +++ b/week05/Plat/mission2/src/App.tsx @@ -0,0 +1,51 @@ +import './App.css' +import { createBrowserRouter, RouterProvider, type RouteObject } from 'react-router-dom' +import HomePage from './pages/HomePage' +import NotFoundPage from './pages/NotFoundPage' +import HomeLayout from './layouts/HomeLayout' +import SignupPage from './pages/SignupPage' +import LoginPage from './pages/LoginPage' +import MyPage from './pages/Mypage' +import { AuthProvider } from './context/AuthContext' +import ProtectedLayout from './layouts/ProtectedLayout' + + +const publicRoutes:RouteObject[]=[ + { + path: "/", + element: , + errorElement: , + children: [ + { index: true, element: }, + { path: "login", element: }, + { path: "signup", element: }, + ] + } +]; + +const protectedRoutes:RouteObject[] = [ + { + path:"/", + element: , + errorElement: , + children:[ + { + path:"my", + element:, + } + ] + } +] + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); + +function App() { + + return ( + + + + ) +} + +export default App diff --git a/week05/Plat/mission2/src/apis/auth.ts b/week05/Plat/mission2/src/apis/auth.ts new file mode 100644 index 0000000..b0b3cdc --- /dev/null +++ b/week05/Plat/mission2/src/apis/auth.ts @@ -0,0 +1,39 @@ +import { axiosInstance } from "./axios"; +import type { + RequestSignupDto, + ResponseSignupDto, + RequestSigninDto, + ResponseSigninDto, + ResponseMyInfoDto, +} from "../types/auth" + +export const postSignup = async ( + body: RequestSignupDto, +):Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signup", + body, + ); + return data; +} + +export const postSignin = async ( + body: RequestSigninDto, + ): Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signin", + body, + ); + return data; +} + +export const getMyInfo = async ():Promise => { + const { data } = await axiosInstance.get("/v1/users/me"); + + return data; +}; + +export const postLogout = async () => { + const { data } = await axiosInstance.post("/v1/auth/signout"); + return data; +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/apis/axios.ts b/week05/Plat/mission2/src/apis/axios.ts new file mode 100644 index 0000000..b30ca46 --- /dev/null +++ b/week05/Plat/mission2/src/apis/axios.ts @@ -0,0 +1,23 @@ +import axios from "axios"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { useLocalStorage } from "../hooks/useLocalStorage"; + +export const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + /* + headers: { + Authorization: `Bearer ${localStorage.getItem(LOCAL_STORAGE_KEY.accessToken)}` + }, + */ +}); + +axiosInstance.interceptors.request.use((config) => { + const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const token = getItem(); + + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + + return config; +}) \ No newline at end of file diff --git a/week05/Plat/mission2/src/constants/key.ts b/week05/Plat/mission2/src/constants/key.ts new file mode 100644 index 0000000..cc4fb34 --- /dev/null +++ b/week05/Plat/mission2/src/constants/key.ts @@ -0,0 +1,4 @@ +export const LOCAL_STORAGE_KEY = { + accessToken: "accessToken", + refreshToken: "refreshToken" +}; diff --git a/week05/Plat/mission2/src/context/AuthContext.tsx b/week05/Plat/mission2/src/context/AuthContext.tsx new file mode 100644 index 0000000..7d45973 --- /dev/null +++ b/week05/Plat/mission2/src/context/AuthContext.tsx @@ -0,0 +1,92 @@ +import { createContext, useContext, useState, type PropsWithChildren } from "react"; +import type { RequestSigninDto } from "../types/auth"; +import { useLocalStorage } from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { postSignin, postLogout } from "../apis/auth"; + +interface AuthContextType { + accessToken: string | null; + refreshToken: string | null; + login: (signinData: RequestSigninDto) => Promise; + logout: () => Promise; +} + +export const AuthContext = createContext({ + accessToken: null, + refreshToken: null, + login: async () => {}, + logout: async () => {}, +}); + +export const AuthProvider = ({children}:PropsWithChildren) => { + const { + getItem: getAccessTokenFormStorage, + setItem: setAccessTokenInStorage, + removeItem: removeAccessTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const { + getItem: getRefreshTokenFormStorage, + setItem: setRefreshTokenInStorage, + removeItem: removeRefreshTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.refreshToken); + + const [accessToken, setAccessToken] = useState( + getAccessTokenFormStorage(), + ) + const [refreshToken, setRefreshToken] = useState( + getRefreshTokenFormStorage(), + ) + + const login = async (signinData: RequestSigninDto) => { + try{ + const { data } = await postSignin(signinData); + + if(data){ + const newAccessToken = data.accessToken; + const newRefreshToken = data.refreshToken; + + setAccessToken(newAccessToken); + setRefreshToken(newRefreshToken); + + setAccessTokenInStorage(newAccessToken); + setRefreshTokenInStorage(newRefreshToken); + } + window.location.href='my'; + } catch (error) { + console.error("Login Error", error); + alert("Login Failed"); + } + } + + const logout = async () => { + try { + await postLogout(); + removeAccessTokenFromStroage(); + removeRefreshTokenFromStroage(); + + setAccessToken(null); + setRefreshToken(null); + + alert("Logout Successs"); + } catch(error) { + console.log("Logout Error", error); + alert("Logout Failed"); + } + } + + return ( + + {children} + + ) +} + +export const useAuth = () => { + const context = useContext(AuthContext); + + if(!context){ + throw new Error("Not Found AuthContext"); + } + + return context; +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/hooks/useForm.ts b/week05/Plat/mission2/src/hooks/useForm.ts new file mode 100644 index 0000000..08ccffb --- /dev/null +++ b/week05/Plat/mission2/src/hooks/useForm.ts @@ -0,0 +1,46 @@ +import { useEffect, useState } from "react"; + +interface UseFormProps { + initialValues: T; + validate?: (values: T) => Record; +} + +export function useForm({ initialValues, validate }: UseFormProps) { + const [values, setValues] = useState(initialValues); + const [touched, setTouched] = useState>(); + const [errors, setErrors] = useState>(); + + const handleChange = (name: keyof T, text: string) => { + setValues({ + ...values, + [name]: text, + }); + }; + + const handleBlur = (name: keyof T) => { + setTouched({ + ...touched, + [name]: true, + }); + }; + + const getInputProps = (name: keyof T) => { + const value = values[name]; + const onChange = (e: React.ChangeEvent,) => + handleChange(name, e.target.value); + const onBlur = () => handleBlur(name); + + return { + value, + onChange, + onBlur, + }; + } + + useEffect(() => { + const newErrors = validate ? validate(values) : {}; + setErrors(newErrors); + }, [values, validate]); + + return { values, errors, touched, getInputProps }; +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/hooks/useLocalStorage.ts b/week05/Plat/mission2/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..e497c66 --- /dev/null +++ b/week05/Plat/mission2/src/hooks/useLocalStorage.ts @@ -0,0 +1,29 @@ +export const useLocalStorage = (key: string) => { + const setItem = (value: unknown) => { + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.log(error) + } + }; + + const getItem = () => { + try { + const item = window.localStorage.getItem(key); + + return item ? JSON.parse(item) : null; + } catch(e) { + console.log(e); + } + }; + + const removeItem = () => { + try { + window.localStorage.removeItem(key); + } catch (error) { + console.log(error) + } + }; + + return { setItem, getItem, removeItem } +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/index.css b/week05/Plat/mission2/src/index.css new file mode 100644 index 0000000..a461c50 --- /dev/null +++ b/week05/Plat/mission2/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file diff --git a/week05/Plat/mission2/src/layouts/HomeLayout.tsx b/week05/Plat/mission2/src/layouts/HomeLayout.tsx new file mode 100644 index 0000000..6424f8b --- /dev/null +++ b/week05/Plat/mission2/src/layouts/HomeLayout.tsx @@ -0,0 +1,48 @@ +import { Outlet, Link } from "react-router-dom"; + +export default function HomeLayout() { + return ( +
+ + {/* Header */} +
+
+ + MyApp + + + +
+
+ + {/* Main */} +
+ +
+ + {/* Footer */} +
+
+ © 2026 MyApp + Built with React + Tailwind +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/layouts/ProtectedLayout.tsx b/week05/Plat/mission2/src/layouts/ProtectedLayout.tsx new file mode 100644 index 0000000..f471295 --- /dev/null +++ b/week05/Plat/mission2/src/layouts/ProtectedLayout.tsx @@ -0,0 +1,16 @@ +import { useAuth } from "../context/AuthContext" +import { Navigate, Outlet } from "react-router-dom"; + +const ProtectedLayout = () => { + const { accessToken } = useAuth(); + + if(!accessToken){ + return + } + + return( + + ) +} + +export default ProtectedLayout; \ No newline at end of file diff --git a/week05/Plat/mission2/src/main.tsx b/week05/Plat/mission2/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/week05/Plat/mission2/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/week05/Plat/mission2/src/pages/HomePage.tsx b/week05/Plat/mission2/src/pages/HomePage.tsx new file mode 100644 index 0000000..f6d3449 --- /dev/null +++ b/week05/Plat/mission2/src/pages/HomePage.tsx @@ -0,0 +1,40 @@ +import { Link } from "react-router-dom"; + +export default function HomePage() { + return ( +
+
+ + {/* 타이틀 */} +

Welcome

+

+ Please choose an option below +

+ + {/* 버튼 영역 */} +
+ + Login + + + + Sign Up + + + + My Page + +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/pages/LoginPage.tsx b/week05/Plat/mission2/src/pages/LoginPage.tsx new file mode 100644 index 0000000..8bcd38f --- /dev/null +++ b/week05/Plat/mission2/src/pages/LoginPage.tsx @@ -0,0 +1,61 @@ +import { useAuth } from "../context/AuthContext"; +import { useForm } from "../hooks/useForm"; +import { validateSignin, type UserSignInformation } from "../utils/validate"; +import { Link } from "react-router-dom"; + +export default function LoginPage() { + const { login } = useAuth(); + const { values, errors, touched, getInputProps } = + useForm({ + initialValues: { + email: "", + password: "", + }, + validate: validateSignin, + }); + + const handleSubmit = async () => { + await login(values); + } + + const isDisabled = + Object.values(errors || {}).some((error) => error.length > 0) || + Object.values(values).some((value) => value === ""); + + return ( +
+
+ Sign up | + My +
+
+ + {errors?.email && touched?.email && ( +

{errors.email}

+ )} + + {errors?.password && touched?.password && ( +

{errors.password}

+ )} + +
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/pages/Mypage.tsx b/week05/Plat/mission2/src/pages/Mypage.tsx new file mode 100644 index 0000000..44b498b --- /dev/null +++ b/week05/Plat/mission2/src/pages/Mypage.tsx @@ -0,0 +1,76 @@ +import { useEffect, useState } from "react"; +import { getMyInfo } from "../apis/auth"; +import { type ResponseMyInfoDto } from "../types/auth"; +import { useAuth } from "../context/AuthContext"; +import { useNavigate } from "react-router-dom"; + +const MyPage = () => { + const [data, setData] = useState(); + const { logout } = useAuth(); + const navigate = useNavigate(); + + useEffect(() => { + const getData = async () => { + const response = await getMyInfo(); + console.log(response); + setData(response); + }; + + getData(); + }, []); + + const handleLogout = async () => { + await logout(); + navigate("/"); + }; + + if (!data) { + return ( +
+
+

Loading...

+
+
+ ); + } + + return ( +
+
+
+
+ {data.data?.name?.charAt(0).toUpperCase()} +
+ +

My Page

+

Your profile information

+
+ +
+
+

Nickname

+

+ {data.data?.name} +

+
+ +
+

Email

+

+ {data.data?.email} +

+
+
+ + +
+
+ ); +}; + +export default MyPage; \ No newline at end of file diff --git a/week05/Plat/mission2/src/pages/NotFoundPage.tsx b/week05/Plat/mission2/src/pages/NotFoundPage.tsx new file mode 100644 index 0000000..36bbb32 --- /dev/null +++ b/week05/Plat/mission2/src/pages/NotFoundPage.tsx @@ -0,0 +1,25 @@ +import { Link } from "react-router-dom"; + +export default function NotFoundPage() { + return ( +
+ +

404

+ +

+ 페이지를 찾을 수 없습니다 +

+ +

+ 요청하신 페이지가 존재하지 않거나 잘못된 경로입니다. +

+ + + 홈으로 돌아가기 + +
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/pages/SignupPage.tsx b/week05/Plat/mission2/src/pages/SignupPage.tsx new file mode 100644 index 0000000..c302b7d --- /dev/null +++ b/week05/Plat/mission2/src/pages/SignupPage.tsx @@ -0,0 +1,120 @@ +import { z } from 'zod'; +import { useForm, type SubmitHandler } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { postSignup } from '../apis/auth'; +import { Link } from 'react-router-dom'; + +const schema = z.object({ + email: z + .string() + .email({ message: 'Invalid email address' }), + + password: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + passwordCheck: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + name: z + .string() + .min(1, { message: 'Name is required' }), +}) +.refine((data) => data.password === data.passwordCheck, { + message: "Passwords do not match", + path: ['passwordCheck'], +}); + +type FormFields = z.infer; + +const SignupPage = () => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues: { + name: '', + password: '', + passwordCheck: '', + email: '', + }, + resolver: zodResolver(schema), + }); + + const onSubmit: SubmitHandler = async (data) => { + const {passwordCheck, ...rest} = data; + + const response = await postSignup(rest); + + console.log(response); + }; + + return ( +
+
+ Sign in | + My +
+
+ + {errors.email && ( +
{errors.email.message}
+ )} + + {errors.password && ( +
{errors.password.message}
+ )} + + {errors.passwordCheck && ( +
{errors.passwordCheck.message}
+ )} + + {errors.name && ( +
{errors.name.message}
+ )} + +
+
+ ); +} + +export default SignupPage; \ No newline at end of file diff --git a/week05/Plat/mission2/src/types/auth.ts b/week05/Plat/mission2/src/types/auth.ts new file mode 100644 index 0000000..9fc47d7 --- /dev/null +++ b/week05/Plat/mission2/src/types/auth.ts @@ -0,0 +1,44 @@ +import type { CommonResponse } from "./common"; + +//Signup +export type RequestSignupDto = { + name: string; + email: string; + bio?: string; + avatar?: string; + password: string; +}; + +export type ResponseSignupDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}>; + +//Login +export type RequestSigninDto = { + email: string; + password: string; +} + +export type ResponseSigninDto = CommonResponse<{ + id: number; + name: string; + accessToken: string; + refreshToken: string; +}> + +// My Data Join +export type ResponseMyInfoDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}> \ No newline at end of file diff --git a/week05/Plat/mission2/src/types/common.ts b/week05/Plat/mission2/src/types/common.ts new file mode 100644 index 0000000..aa8a9fd --- /dev/null +++ b/week05/Plat/mission2/src/types/common.ts @@ -0,0 +1,6 @@ +export type CommonResponse = { + status: boolean; + statusCode: number; + message: string; + data: T; +} \ No newline at end of file diff --git a/week05/Plat/mission2/src/utils/validate.ts b/week05/Plat/mission2/src/utils/validate.ts new file mode 100644 index 0000000..e392766 --- /dev/null +++ b/week05/Plat/mission2/src/utils/validate.ts @@ -0,0 +1,31 @@ +export type UserSignInformation = { + email: string; + password: string; +} + +function validateUser(values: UserSignInformation) { + const errors: Record = { + email: "", + password: "", + }; + + if (!values.email) { + errors.email = "Email is required"; + } else if (!/\S+@\S+\.\S+/.test(values.email)) { + errors.email = "Email is invalid"; + } + + if (!values.password) { + errors.password = "Password is required"; + } else if (values.password.length < 8 || values.password.length > 20) { + errors.password = "Password must be at least 8~20 characters"; + } + + return errors; +} + +function validateSignin(values: UserSignInformation) { + return validateUser(values); +}; + +export { validateSignin }; \ No newline at end of file diff --git a/week05/Plat/mission2/src/vite-env.d.ts b/week05/Plat/mission2/src/vite-env.d.ts new file mode 100644 index 0000000..7461706 --- /dev/null +++ b/week05/Plat/mission2/src/vite-env.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly VITE_SERVER_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} \ No newline at end of file diff --git a/week05/Plat/mission2/tsconfig.app.json b/week05/Plat/mission2/tsconfig.app.json new file mode 100644 index 0000000..1d29c88 --- /dev/null +++ b/week05/Plat/mission2/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/week05/Plat/mission2/tsconfig.json b/week05/Plat/mission2/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/week05/Plat/mission2/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/week05/Plat/mission2/tsconfig.node.json b/week05/Plat/mission2/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/week05/Plat/mission2/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/week05/Plat/mission2/vite.config.ts b/week05/Plat/mission2/vite.config.ts new file mode 100644 index 0000000..c4069b7 --- /dev/null +++ b/week05/Plat/mission2/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}) From 7ac6669f2531d5809f6805c706e942d8b92dce53 Mon Sep 17 00:00:00 2001 From: Chen Date: Sun, 12 Apr 2026 23:49:38 +0900 Subject: [PATCH 3/6] feat: mission3 upload --- week05/Plat/mission3/.gitignore | 24 + week05/Plat/mission3/README.md | 1 + week05/Plat/mission3/eslint.config.js | 23 + week05/Plat/mission3/index.html | 13 + week05/Plat/mission3/package-lock.json | 3346 +++++++++++++++++ week05/Plat/mission3/package.json | 35 + week05/Plat/mission3/src/App.css | 0 week05/Plat/mission3/src/App.tsx | 51 + week05/Plat/mission3/src/apis/auth.ts | 39 + week05/Plat/mission3/src/apis/axios.ts | 23 + week05/Plat/mission3/src/constants/key.ts | 4 + .../Plat/mission3/src/context/AuthContext.tsx | 92 + week05/Plat/mission3/src/hooks/useForm.ts | 46 + .../mission3/src/hooks/useLocalStorage.ts | 29 + week05/Plat/mission3/src/index.css | 1 + .../Plat/mission3/src/layouts/HomeLayout.tsx | 48 + .../mission3/src/layouts/ProtectedLayout.tsx | 16 + week05/Plat/mission3/src/main.tsx | 10 + week05/Plat/mission3/src/pages/HomePage.tsx | 40 + week05/Plat/mission3/src/pages/LoginPage.tsx | 61 + week05/Plat/mission3/src/pages/Mypage.tsx | 76 + .../Plat/mission3/src/pages/NotFoundPage.tsx | 25 + week05/Plat/mission3/src/pages/SignupPage.tsx | 120 + week05/Plat/mission3/src/types/auth.ts | 44 + week05/Plat/mission3/src/types/common.ts | 6 + week05/Plat/mission3/src/utils/validate.ts | 31 + week05/Plat/mission3/src/vite-env.d.ts | 7 + week05/Plat/mission3/tsconfig.app.json | 25 + week05/Plat/mission3/tsconfig.json | 7 + week05/Plat/mission3/tsconfig.node.json | 24 + week05/Plat/mission3/vite.config.ts | 8 + 31 files changed, 4275 insertions(+) create mode 100644 week05/Plat/mission3/.gitignore create mode 100644 week05/Plat/mission3/README.md create mode 100644 week05/Plat/mission3/eslint.config.js create mode 100644 week05/Plat/mission3/index.html create mode 100644 week05/Plat/mission3/package-lock.json create mode 100644 week05/Plat/mission3/package.json create mode 100644 week05/Plat/mission3/src/App.css create mode 100644 week05/Plat/mission3/src/App.tsx create mode 100644 week05/Plat/mission3/src/apis/auth.ts create mode 100644 week05/Plat/mission3/src/apis/axios.ts create mode 100644 week05/Plat/mission3/src/constants/key.ts create mode 100644 week05/Plat/mission3/src/context/AuthContext.tsx create mode 100644 week05/Plat/mission3/src/hooks/useForm.ts create mode 100644 week05/Plat/mission3/src/hooks/useLocalStorage.ts create mode 100644 week05/Plat/mission3/src/index.css create mode 100644 week05/Plat/mission3/src/layouts/HomeLayout.tsx create mode 100644 week05/Plat/mission3/src/layouts/ProtectedLayout.tsx create mode 100644 week05/Plat/mission3/src/main.tsx create mode 100644 week05/Plat/mission3/src/pages/HomePage.tsx create mode 100644 week05/Plat/mission3/src/pages/LoginPage.tsx create mode 100644 week05/Plat/mission3/src/pages/Mypage.tsx create mode 100644 week05/Plat/mission3/src/pages/NotFoundPage.tsx create mode 100644 week05/Plat/mission3/src/pages/SignupPage.tsx create mode 100644 week05/Plat/mission3/src/types/auth.ts create mode 100644 week05/Plat/mission3/src/types/common.ts create mode 100644 week05/Plat/mission3/src/utils/validate.ts create mode 100644 week05/Plat/mission3/src/vite-env.d.ts create mode 100644 week05/Plat/mission3/tsconfig.app.json create mode 100644 week05/Plat/mission3/tsconfig.json create mode 100644 week05/Plat/mission3/tsconfig.node.json create mode 100644 week05/Plat/mission3/vite.config.ts diff --git a/week05/Plat/mission3/.gitignore b/week05/Plat/mission3/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/week05/Plat/mission3/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/week05/Plat/mission3/README.md b/week05/Plat/mission3/README.md new file mode 100644 index 0000000..c429874 --- /dev/null +++ b/week05/Plat/mission3/README.md @@ -0,0 +1 @@ +# 커스텀 훅과 로그인 유효성 검사 & 에러메시지 표현 \ No newline at end of file diff --git a/week05/Plat/mission3/eslint.config.js b/week05/Plat/mission3/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/week05/Plat/mission3/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/week05/Plat/mission3/index.html b/week05/Plat/mission3/index.html new file mode 100644 index 0000000..c045894 --- /dev/null +++ b/week05/Plat/mission3/index.html @@ -0,0 +1,13 @@ + + + + + + + login + + +
+ + + diff --git a/week05/Plat/mission3/package-lock.json b/week05/Plat/mission3/package-lock.json new file mode 100644 index 0000000..2df8943 --- /dev/null +++ b/week05/Plat/mission3/package-lock.json @@ -0,0 +1,3346 @@ +{ + "name": "login", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "login", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "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, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "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/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, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.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.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", + "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "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/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/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, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-hook-form": { + "version": "7.72.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.1.tgz", + "integrity": "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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" + } + } + } +} diff --git a/week05/Plat/mission3/package.json b/week05/Plat/mission3/package.json new file mode 100644 index 0000000..9c99619 --- /dev/null +++ b/week05/Plat/mission3/package.json @@ -0,0 +1,35 @@ +{ + "name": "login", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} diff --git a/week05/Plat/mission3/src/App.css b/week05/Plat/mission3/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/week05/Plat/mission3/src/App.tsx b/week05/Plat/mission3/src/App.tsx new file mode 100644 index 0000000..afecf25 --- /dev/null +++ b/week05/Plat/mission3/src/App.tsx @@ -0,0 +1,51 @@ +import './App.css' +import { createBrowserRouter, RouterProvider, type RouteObject } from 'react-router-dom' +import HomePage from './pages/HomePage' +import NotFoundPage from './pages/NotFoundPage' +import HomeLayout from './layouts/HomeLayout' +import SignupPage from './pages/SignupPage' +import LoginPage from './pages/LoginPage' +import MyPage from './pages/Mypage' +import { AuthProvider } from './context/AuthContext' +import ProtectedLayout from './layouts/ProtectedLayout' + + +const publicRoutes:RouteObject[]=[ + { + path: "/", + element: , + errorElement: , + children: [ + { index: true, element: }, + { path: "login", element: }, + { path: "signup", element: }, + ] + } +]; + +const protectedRoutes:RouteObject[] = [ + { + path:"/", + element: , + errorElement: , + children:[ + { + path:"my", + element:, + } + ] + } +] + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); + +function App() { + + return ( + + + + ) +} + +export default App diff --git a/week05/Plat/mission3/src/apis/auth.ts b/week05/Plat/mission3/src/apis/auth.ts new file mode 100644 index 0000000..b0b3cdc --- /dev/null +++ b/week05/Plat/mission3/src/apis/auth.ts @@ -0,0 +1,39 @@ +import { axiosInstance } from "./axios"; +import type { + RequestSignupDto, + ResponseSignupDto, + RequestSigninDto, + ResponseSigninDto, + ResponseMyInfoDto, +} from "../types/auth" + +export const postSignup = async ( + body: RequestSignupDto, +):Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signup", + body, + ); + return data; +} + +export const postSignin = async ( + body: RequestSigninDto, + ): Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signin", + body, + ); + return data; +} + +export const getMyInfo = async ():Promise => { + const { data } = await axiosInstance.get("/v1/users/me"); + + return data; +}; + +export const postLogout = async () => { + const { data } = await axiosInstance.post("/v1/auth/signout"); + return data; +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/apis/axios.ts b/week05/Plat/mission3/src/apis/axios.ts new file mode 100644 index 0000000..b30ca46 --- /dev/null +++ b/week05/Plat/mission3/src/apis/axios.ts @@ -0,0 +1,23 @@ +import axios from "axios"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { useLocalStorage } from "../hooks/useLocalStorage"; + +export const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + /* + headers: { + Authorization: `Bearer ${localStorage.getItem(LOCAL_STORAGE_KEY.accessToken)}` + }, + */ +}); + +axiosInstance.interceptors.request.use((config) => { + const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const token = getItem(); + + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + + return config; +}) \ No newline at end of file diff --git a/week05/Plat/mission3/src/constants/key.ts b/week05/Plat/mission3/src/constants/key.ts new file mode 100644 index 0000000..cc4fb34 --- /dev/null +++ b/week05/Plat/mission3/src/constants/key.ts @@ -0,0 +1,4 @@ +export const LOCAL_STORAGE_KEY = { + accessToken: "accessToken", + refreshToken: "refreshToken" +}; diff --git a/week05/Plat/mission3/src/context/AuthContext.tsx b/week05/Plat/mission3/src/context/AuthContext.tsx new file mode 100644 index 0000000..7d45973 --- /dev/null +++ b/week05/Plat/mission3/src/context/AuthContext.tsx @@ -0,0 +1,92 @@ +import { createContext, useContext, useState, type PropsWithChildren } from "react"; +import type { RequestSigninDto } from "../types/auth"; +import { useLocalStorage } from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { postSignin, postLogout } from "../apis/auth"; + +interface AuthContextType { + accessToken: string | null; + refreshToken: string | null; + login: (signinData: RequestSigninDto) => Promise; + logout: () => Promise; +} + +export const AuthContext = createContext({ + accessToken: null, + refreshToken: null, + login: async () => {}, + logout: async () => {}, +}); + +export const AuthProvider = ({children}:PropsWithChildren) => { + const { + getItem: getAccessTokenFormStorage, + setItem: setAccessTokenInStorage, + removeItem: removeAccessTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const { + getItem: getRefreshTokenFormStorage, + setItem: setRefreshTokenInStorage, + removeItem: removeRefreshTokenFromStroage, + } = useLocalStorage(LOCAL_STORAGE_KEY.refreshToken); + + const [accessToken, setAccessToken] = useState( + getAccessTokenFormStorage(), + ) + const [refreshToken, setRefreshToken] = useState( + getRefreshTokenFormStorage(), + ) + + const login = async (signinData: RequestSigninDto) => { + try{ + const { data } = await postSignin(signinData); + + if(data){ + const newAccessToken = data.accessToken; + const newRefreshToken = data.refreshToken; + + setAccessToken(newAccessToken); + setRefreshToken(newRefreshToken); + + setAccessTokenInStorage(newAccessToken); + setRefreshTokenInStorage(newRefreshToken); + } + window.location.href='my'; + } catch (error) { + console.error("Login Error", error); + alert("Login Failed"); + } + } + + const logout = async () => { + try { + await postLogout(); + removeAccessTokenFromStroage(); + removeRefreshTokenFromStroage(); + + setAccessToken(null); + setRefreshToken(null); + + alert("Logout Successs"); + } catch(error) { + console.log("Logout Error", error); + alert("Logout Failed"); + } + } + + return ( + + {children} + + ) +} + +export const useAuth = () => { + const context = useContext(AuthContext); + + if(!context){ + throw new Error("Not Found AuthContext"); + } + + return context; +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/hooks/useForm.ts b/week05/Plat/mission3/src/hooks/useForm.ts new file mode 100644 index 0000000..08ccffb --- /dev/null +++ b/week05/Plat/mission3/src/hooks/useForm.ts @@ -0,0 +1,46 @@ +import { useEffect, useState } from "react"; + +interface UseFormProps { + initialValues: T; + validate?: (values: T) => Record; +} + +export function useForm({ initialValues, validate }: UseFormProps) { + const [values, setValues] = useState(initialValues); + const [touched, setTouched] = useState>(); + const [errors, setErrors] = useState>(); + + const handleChange = (name: keyof T, text: string) => { + setValues({ + ...values, + [name]: text, + }); + }; + + const handleBlur = (name: keyof T) => { + setTouched({ + ...touched, + [name]: true, + }); + }; + + const getInputProps = (name: keyof T) => { + const value = values[name]; + const onChange = (e: React.ChangeEvent,) => + handleChange(name, e.target.value); + const onBlur = () => handleBlur(name); + + return { + value, + onChange, + onBlur, + }; + } + + useEffect(() => { + const newErrors = validate ? validate(values) : {}; + setErrors(newErrors); + }, [values, validate]); + + return { values, errors, touched, getInputProps }; +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/hooks/useLocalStorage.ts b/week05/Plat/mission3/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..e497c66 --- /dev/null +++ b/week05/Plat/mission3/src/hooks/useLocalStorage.ts @@ -0,0 +1,29 @@ +export const useLocalStorage = (key: string) => { + const setItem = (value: unknown) => { + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.log(error) + } + }; + + const getItem = () => { + try { + const item = window.localStorage.getItem(key); + + return item ? JSON.parse(item) : null; + } catch(e) { + console.log(e); + } + }; + + const removeItem = () => { + try { + window.localStorage.removeItem(key); + } catch (error) { + console.log(error) + } + }; + + return { setItem, getItem, removeItem } +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/index.css b/week05/Plat/mission3/src/index.css new file mode 100644 index 0000000..a461c50 --- /dev/null +++ b/week05/Plat/mission3/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file diff --git a/week05/Plat/mission3/src/layouts/HomeLayout.tsx b/week05/Plat/mission3/src/layouts/HomeLayout.tsx new file mode 100644 index 0000000..6424f8b --- /dev/null +++ b/week05/Plat/mission3/src/layouts/HomeLayout.tsx @@ -0,0 +1,48 @@ +import { Outlet, Link } from "react-router-dom"; + +export default function HomeLayout() { + return ( +
+ + {/* Header */} +
+
+ + MyApp + + + +
+
+ + {/* Main */} +
+ +
+ + {/* Footer */} +
+
+ © 2026 MyApp + Built with React + Tailwind +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/layouts/ProtectedLayout.tsx b/week05/Plat/mission3/src/layouts/ProtectedLayout.tsx new file mode 100644 index 0000000..f471295 --- /dev/null +++ b/week05/Plat/mission3/src/layouts/ProtectedLayout.tsx @@ -0,0 +1,16 @@ +import { useAuth } from "../context/AuthContext" +import { Navigate, Outlet } from "react-router-dom"; + +const ProtectedLayout = () => { + const { accessToken } = useAuth(); + + if(!accessToken){ + return + } + + return( + + ) +} + +export default ProtectedLayout; \ No newline at end of file diff --git a/week05/Plat/mission3/src/main.tsx b/week05/Plat/mission3/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/week05/Plat/mission3/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/week05/Plat/mission3/src/pages/HomePage.tsx b/week05/Plat/mission3/src/pages/HomePage.tsx new file mode 100644 index 0000000..f6d3449 --- /dev/null +++ b/week05/Plat/mission3/src/pages/HomePage.tsx @@ -0,0 +1,40 @@ +import { Link } from "react-router-dom"; + +export default function HomePage() { + return ( +
+
+ + {/* 타이틀 */} +

Welcome

+

+ Please choose an option below +

+ + {/* 버튼 영역 */} +
+ + Login + + + + Sign Up + + + + My Page + +
+
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/LoginPage.tsx b/week05/Plat/mission3/src/pages/LoginPage.tsx new file mode 100644 index 0000000..8bcd38f --- /dev/null +++ b/week05/Plat/mission3/src/pages/LoginPage.tsx @@ -0,0 +1,61 @@ +import { useAuth } from "../context/AuthContext"; +import { useForm } from "../hooks/useForm"; +import { validateSignin, type UserSignInformation } from "../utils/validate"; +import { Link } from "react-router-dom"; + +export default function LoginPage() { + const { login } = useAuth(); + const { values, errors, touched, getInputProps } = + useForm({ + initialValues: { + email: "", + password: "", + }, + validate: validateSignin, + }); + + const handleSubmit = async () => { + await login(values); + } + + const isDisabled = + Object.values(errors || {}).some((error) => error.length > 0) || + Object.values(values).some((value) => value === ""); + + return ( +
+
+ Sign up | + My +
+
+ + {errors?.email && touched?.email && ( +

{errors.email}

+ )} + + {errors?.password && touched?.password && ( +

{errors.password}

+ )} + +
+
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/Mypage.tsx b/week05/Plat/mission3/src/pages/Mypage.tsx new file mode 100644 index 0000000..44b498b --- /dev/null +++ b/week05/Plat/mission3/src/pages/Mypage.tsx @@ -0,0 +1,76 @@ +import { useEffect, useState } from "react"; +import { getMyInfo } from "../apis/auth"; +import { type ResponseMyInfoDto } from "../types/auth"; +import { useAuth } from "../context/AuthContext"; +import { useNavigate } from "react-router-dom"; + +const MyPage = () => { + const [data, setData] = useState(); + const { logout } = useAuth(); + const navigate = useNavigate(); + + useEffect(() => { + const getData = async () => { + const response = await getMyInfo(); + console.log(response); + setData(response); + }; + + getData(); + }, []); + + const handleLogout = async () => { + await logout(); + navigate("/"); + }; + + if (!data) { + return ( +
+
+

Loading...

+
+
+ ); + } + + return ( +
+
+
+
+ {data.data?.name?.charAt(0).toUpperCase()} +
+ +

My Page

+

Your profile information

+
+ +
+
+

Nickname

+

+ {data.data?.name} +

+
+ +
+

Email

+

+ {data.data?.email} +

+
+
+ + +
+
+ ); +}; + +export default MyPage; \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/NotFoundPage.tsx b/week05/Plat/mission3/src/pages/NotFoundPage.tsx new file mode 100644 index 0000000..36bbb32 --- /dev/null +++ b/week05/Plat/mission3/src/pages/NotFoundPage.tsx @@ -0,0 +1,25 @@ +import { Link } from "react-router-dom"; + +export default function NotFoundPage() { + return ( +
+ +

404

+ +

+ 페이지를 찾을 수 없습니다 +

+ +

+ 요청하신 페이지가 존재하지 않거나 잘못된 경로입니다. +

+ + + 홈으로 돌아가기 + +
+ ); +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/SignupPage.tsx b/week05/Plat/mission3/src/pages/SignupPage.tsx new file mode 100644 index 0000000..c302b7d --- /dev/null +++ b/week05/Plat/mission3/src/pages/SignupPage.tsx @@ -0,0 +1,120 @@ +import { z } from 'zod'; +import { useForm, type SubmitHandler } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { postSignup } from '../apis/auth'; +import { Link } from 'react-router-dom'; + +const schema = z.object({ + email: z + .string() + .email({ message: 'Invalid email address' }), + + password: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + passwordCheck: z + .string() + .min(8, { message: 'Password must be at least 8 characters' }) + .max(20, { message: 'Password must be at most 20 characters' }), + + name: z + .string() + .min(1, { message: 'Name is required' }), +}) +.refine((data) => data.password === data.passwordCheck, { + message: "Passwords do not match", + path: ['passwordCheck'], +}); + +type FormFields = z.infer; + +const SignupPage = () => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues: { + name: '', + password: '', + passwordCheck: '', + email: '', + }, + resolver: zodResolver(schema), + }); + + const onSubmit: SubmitHandler = async (data) => { + const {passwordCheck, ...rest} = data; + + const response = await postSignup(rest); + + console.log(response); + }; + + return ( +
+
+ Sign in | + My +
+
+ + {errors.email && ( +
{errors.email.message}
+ )} + + {errors.password && ( +
{errors.password.message}
+ )} + + {errors.passwordCheck && ( +
{errors.passwordCheck.message}
+ )} + + {errors.name && ( +
{errors.name.message}
+ )} + +
+
+ ); +} + +export default SignupPage; \ No newline at end of file diff --git a/week05/Plat/mission3/src/types/auth.ts b/week05/Plat/mission3/src/types/auth.ts new file mode 100644 index 0000000..9fc47d7 --- /dev/null +++ b/week05/Plat/mission3/src/types/auth.ts @@ -0,0 +1,44 @@ +import type { CommonResponse } from "./common"; + +//Signup +export type RequestSignupDto = { + name: string; + email: string; + bio?: string; + avatar?: string; + password: string; +}; + +export type ResponseSignupDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}>; + +//Login +export type RequestSigninDto = { + email: string; + password: string; +} + +export type ResponseSigninDto = CommonResponse<{ + id: number; + name: string; + accessToken: string; + refreshToken: string; +}> + +// My Data Join +export type ResponseMyInfoDto = CommonResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createAt: Date; + updateAt: Date; +}> \ No newline at end of file diff --git a/week05/Plat/mission3/src/types/common.ts b/week05/Plat/mission3/src/types/common.ts new file mode 100644 index 0000000..aa8a9fd --- /dev/null +++ b/week05/Plat/mission3/src/types/common.ts @@ -0,0 +1,6 @@ +export type CommonResponse = { + status: boolean; + statusCode: number; + message: string; + data: T; +} \ No newline at end of file diff --git a/week05/Plat/mission3/src/utils/validate.ts b/week05/Plat/mission3/src/utils/validate.ts new file mode 100644 index 0000000..e392766 --- /dev/null +++ b/week05/Plat/mission3/src/utils/validate.ts @@ -0,0 +1,31 @@ +export type UserSignInformation = { + email: string; + password: string; +} + +function validateUser(values: UserSignInformation) { + const errors: Record = { + email: "", + password: "", + }; + + if (!values.email) { + errors.email = "Email is required"; + } else if (!/\S+@\S+\.\S+/.test(values.email)) { + errors.email = "Email is invalid"; + } + + if (!values.password) { + errors.password = "Password is required"; + } else if (values.password.length < 8 || values.password.length > 20) { + errors.password = "Password must be at least 8~20 characters"; + } + + return errors; +} + +function validateSignin(values: UserSignInformation) { + return validateUser(values); +}; + +export { validateSignin }; \ No newline at end of file diff --git a/week05/Plat/mission3/src/vite-env.d.ts b/week05/Plat/mission3/src/vite-env.d.ts new file mode 100644 index 0000000..7461706 --- /dev/null +++ b/week05/Plat/mission3/src/vite-env.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly VITE_SERVER_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} \ No newline at end of file diff --git a/week05/Plat/mission3/tsconfig.app.json b/week05/Plat/mission3/tsconfig.app.json new file mode 100644 index 0000000..1d29c88 --- /dev/null +++ b/week05/Plat/mission3/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/week05/Plat/mission3/tsconfig.json b/week05/Plat/mission3/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/week05/Plat/mission3/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/week05/Plat/mission3/tsconfig.node.json b/week05/Plat/mission3/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/week05/Plat/mission3/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/week05/Plat/mission3/vite.config.ts b/week05/Plat/mission3/vite.config.ts new file mode 100644 index 0000000..c4069b7 --- /dev/null +++ b/week05/Plat/mission3/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}) From fe2ff572fb277c2934b6d6c0c0c5a87ddf264e8b Mon Sep 17 00:00:00 2001 From: Chen Date: Sat, 25 Apr 2026 14:42:38 +0900 Subject: [PATCH 4/6] =?UTF-8?q?chore:=20=EC=9D=B4=EC=A0=84=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week05/Plat/mission2/README.md | 57 +++++++++++++- week05/Plat/mission2/package-lock.json | 12 +-- week05/Plat/mission2/src/apis/axios.ts | 100 +++++++++++++++++++++++-- 3 files changed, 157 insertions(+), 12 deletions(-) diff --git a/week05/Plat/mission2/README.md b/week05/Plat/mission2/README.md index c429874..f8bb300 100644 --- a/week05/Plat/mission2/README.md +++ b/week05/Plat/mission2/README.md @@ -1 +1,56 @@ -# 커스텀 훅과 로그인 유효성 검사 & 에러메시지 표현 \ No newline at end of file +## README + +### 🔐 Refresh Token 적용 + +이번 작업에서는 기존 인증 구조에 **Refresh Token 기반 재발급 로직**을 추가하여, +Access Token 만료 시 자동으로 토큰을 갱신할 수 있도록 구현했습니다. + +--- + +### 📌 구현 목적 + +* Access Token 만료 시 사용자 로그아웃 방지 +* 인증 상태 유지 (UX 개선) +* 보안성과 편의성 균형 확보 + +--- + +### ⚙️ 동작 방식 + +1. Access Token이 만료된 요청 발생 (401 Unauthorized) +2. 인터셉터에서 Refresh Token으로 재발급 요청 +3. 새로운 Access Token 발급 +4. 기존 요청 재시도 + +--- + +### 🔄 토큰 흐름 + +* Access Token: API 요청 시 사용 +* Refresh Token: Access Token 재발급 용도 + +--- + +### 🛠 주요 구현 + +* Axios Interceptor 기반 자동 재요청 처리 +* Refresh 요청 중복 방지 (`Promise` 활용) +* LocalStorage에 토큰 저장 및 갱신 +* Refresh 실패 시 로그아웃 처리 + +--- + +### ⚠️ 이슈 및 해결 + +* **문제**: 새로고침 2회 시 로그아웃 발생 +* **원인**: Refresh Token 저장 경로 오류 +* **해결**: 응답 구조에 맞게 `refreshToken` 정상 저장 + +--- + +### 📎 참고 + +* 인증 방식: JWT (Access + Refresh Token) +* 저장 방식: LocalStorage + +--- \ No newline at end of file diff --git a/week05/Plat/mission2/package-lock.json b/week05/Plat/mission2/package-lock.json index 2df8943..d81891e 100644 --- a/week05/Plat/mission2/package-lock.json +++ b/week05/Plat/mission2/package-lock.json @@ -1946,9 +1946,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -2795,9 +2795,9 @@ } }, "node_modules/postcss": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", - "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { diff --git a/week05/Plat/mission2/src/apis/axios.ts b/week05/Plat/mission2/src/apis/axios.ts index b30ca46..62f74a0 100644 --- a/week05/Plat/mission2/src/apis/axios.ts +++ b/week05/Plat/mission2/src/apis/axios.ts @@ -1,7 +1,13 @@ -import axios from "axios"; +import axios, { type InternalAxiosRequestConfig } from "axios"; import { LOCAL_STORAGE_KEY } from "../constants/key"; import { useLocalStorage } from "../hooks/useLocalStorage"; +interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig{ + _retry?:boolean; +} + +let refreshPromise:Promise | null = null; + export const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_SERVER_API_URL, /* @@ -13,11 +19,95 @@ export const axiosInstance = axios.create({ axiosInstance.interceptors.request.use((config) => { const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); - const token = getItem(); + const accessToken = getItem(); - if (token) { - config.headers.Authorization = `Bearer ${token}` + if(accessToken){ + config.headers = config.headers || {}; + config.headers.Authorization = `Bearer ${accessToken}`; } return config; -}) \ No newline at end of file + }, + (error) => Promise.reject(error), +); + +axiosInstance.interceptors.response.use( + (response) => response, + async(error) => { + const originalRequest: CustomInternalAxiosRequestConfig = error.config; + + if( + error.response && + error.response.status === 401 && + !originalRequest._retry + ) { + if(originalRequest.url === '/v1/auth/refresh'){ + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + return Promise.reject(error); + } + + originalRequest._retry = true; + + if(!refreshPromise) { + refreshPromise = (async() => { + const{ getItem:getRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + const refreshToken = getRefreshToken(); + + const { data } = await axiosInstance.post("/v1/auth/refresh", { + refresh:refreshToken, + }); + + const { setItem:setAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { setItem:setRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + + const newAccessToken = data.data.accessToken; + const newRefreshToken = data.data.refreshToken; + + setAccessToken(newAccessToken); + + if(newRefreshToken) { + setRefreshToken(newRefreshToken); + } + + return newAccessToken; + })().catch((error) => { + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + + window.location.href = "/login"; + + throw error; + }).finally(() => { + refreshPromise = null; + }); + } + + return refreshPromise.then((newAccessToken)=> { + originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; + + return axiosInstance.request(originalRequest); + }); + } + return Promise.reject(error); + }, +) \ No newline at end of file From cafaeb99201fdbfbfdb2d7ac2d8e8dc182661996 Mon Sep 17 00:00:00 2001 From: Chen Date: Sat, 25 Apr 2026 19:58:12 +0900 Subject: [PATCH 5/6] feat:mission3 upload --- week05/Plat/mission3/README.md | 41 +++- week05/Plat/mission3/package-lock.json | 12 +- week05/Plat/mission3/public/googlelogo.png | Bin 0 -> 79671 bytes week05/Plat/mission3/src/App.tsx | 3 +- week05/Plat/mission3/src/apis/axios.ts | 100 ++++++++- .../src/pages/GoogleLoginRedirectPage.tsx | 28 +++ week05/Plat/mission3/src/pages/HomePage.tsx | 19 +- week05/Plat/mission3/src/pages/LoginPage.tsx | 112 ++++++---- week05/Plat/mission3/src/pages/Mypage.tsx | 12 +- .../Plat/mission3/src/pages/NotFoundPage.tsx | 48 ++-- week05/Plat/mission3/src/pages/SignupPage.tsx | 208 ++++++++++-------- 11 files changed, 412 insertions(+), 171 deletions(-) create mode 100644 week05/Plat/mission3/public/googlelogo.png create mode 100644 week05/Plat/mission3/src/pages/GoogleLoginRedirectPage.tsx diff --git a/week05/Plat/mission3/README.md b/week05/Plat/mission3/README.md index c429874..52c6b57 100644 --- a/week05/Plat/mission3/README.md +++ b/week05/Plat/mission3/README.md @@ -1 +1,40 @@ -# 커스텀 훅과 로그인 유효성 검사 & 에러메시지 표현 \ No newline at end of file +## README + +### 🔐 Google OAuth Redirect 처리 + +OAuth를 통해 Google 로그인 성공 후 리다이렉트 페이지를 구현했습니다. + +--- + +### 📌 구현 목적 + +* Google OAuth 로그인 결과 처리 +* 로그인 상태 유지 및 자동 이동 처리 + +--- + +### ⚙️ 동작 방식 + +1. Google 로그인 성공 후 `/google/callback`으로 리다이렉트 +2. URL Query에서 토큰 추출 +3. LocalStorage에 토큰 저장 +4. `/my` 페이지로 이동 + +--- + +### 🛠 주요 구현 코드 + +```ts +const urlParams = new URLSearchParams(window.location.search); + +const accessToken = urlParams.get(LOCAL_STORAGE_KEY.accessToken); +const refreshToken = urlParams.get(LOCAL_STORAGE_KEY.refreshToken); + +if (accessToken) { + setAccessToken(accessToken); + setRefreshToken(refreshToken); + window.location.href = "/my"; +} +``` + +--- \ No newline at end of file diff --git a/week05/Plat/mission3/package-lock.json b/week05/Plat/mission3/package-lock.json index 2df8943..d81891e 100644 --- a/week05/Plat/mission3/package-lock.json +++ b/week05/Plat/mission3/package-lock.json @@ -1946,9 +1946,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -2795,9 +2795,9 @@ } }, "node_modules/postcss": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", - "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { diff --git a/week05/Plat/mission3/public/googlelogo.png b/week05/Plat/mission3/public/googlelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f21fb49f78b844e6f2963f725773e40a5afcbc GIT binary patch literal 79671 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 Z;XbGOoV^vrfB-FUin6LQ)zT(k{vR~}o%a9$ literal 0 HcmV?d00001 diff --git a/week05/Plat/mission3/src/App.tsx b/week05/Plat/mission3/src/App.tsx index afecf25..2568356 100644 --- a/week05/Plat/mission3/src/App.tsx +++ b/week05/Plat/mission3/src/App.tsx @@ -8,7 +8,7 @@ import LoginPage from './pages/LoginPage' import MyPage from './pages/Mypage' import { AuthProvider } from './context/AuthContext' import ProtectedLayout from './layouts/ProtectedLayout' - +import GoogleLoginRedirectPage from './pages/GoogleLoginRedirectPage' const publicRoutes:RouteObject[]=[ { @@ -19,6 +19,7 @@ const publicRoutes:RouteObject[]=[ { index: true, element: }, { path: "login", element: }, { path: "signup", element: }, + { path: "v1/auth/google/callback", element: } ] } ]; diff --git a/week05/Plat/mission3/src/apis/axios.ts b/week05/Plat/mission3/src/apis/axios.ts index b30ca46..62f74a0 100644 --- a/week05/Plat/mission3/src/apis/axios.ts +++ b/week05/Plat/mission3/src/apis/axios.ts @@ -1,7 +1,13 @@ -import axios from "axios"; +import axios, { type InternalAxiosRequestConfig } from "axios"; import { LOCAL_STORAGE_KEY } from "../constants/key"; import { useLocalStorage } from "../hooks/useLocalStorage"; +interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig{ + _retry?:boolean; +} + +let refreshPromise:Promise | null = null; + export const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_SERVER_API_URL, /* @@ -13,11 +19,95 @@ export const axiosInstance = axios.create({ axiosInstance.interceptors.request.use((config) => { const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); - const token = getItem(); + const accessToken = getItem(); - if (token) { - config.headers.Authorization = `Bearer ${token}` + if(accessToken){ + config.headers = config.headers || {}; + config.headers.Authorization = `Bearer ${accessToken}`; } return config; -}) \ No newline at end of file + }, + (error) => Promise.reject(error), +); + +axiosInstance.interceptors.response.use( + (response) => response, + async(error) => { + const originalRequest: CustomInternalAxiosRequestConfig = error.config; + + if( + error.response && + error.response.status === 401 && + !originalRequest._retry + ) { + if(originalRequest.url === '/v1/auth/refresh'){ + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + return Promise.reject(error); + } + + originalRequest._retry = true; + + if(!refreshPromise) { + refreshPromise = (async() => { + const{ getItem:getRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + const refreshToken = getRefreshToken(); + + const { data } = await axiosInstance.post("/v1/auth/refresh", { + refresh:refreshToken, + }); + + const { setItem:setAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { setItem:setRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + + const newAccessToken = data.data.accessToken; + const newRefreshToken = data.data.refreshToken; + + setAccessToken(newAccessToken); + + if(newRefreshToken) { + setRefreshToken(newRefreshToken); + } + + return newAccessToken; + })().catch((error) => { + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + + window.location.href = "/login"; + + throw error; + }).finally(() => { + refreshPromise = null; + }); + } + + return refreshPromise.then((newAccessToken)=> { + originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; + + return axiosInstance.request(originalRequest); + }); + } + return Promise.reject(error); + }, +) \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/GoogleLoginRedirectPage.tsx b/week05/Plat/mission3/src/pages/GoogleLoginRedirectPage.tsx new file mode 100644 index 0000000..31a8715 --- /dev/null +++ b/week05/Plat/mission3/src/pages/GoogleLoginRedirectPage.tsx @@ -0,0 +1,28 @@ +import { useEffect } from "react" +import { useLocalStorage } from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; + +const GoogleLoginRedirectPage = () => { + const { setItem:setAccessToken } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const { setItem:setRefreshToken } = useLocalStorage(LOCAL_STORAGE_KEY.refreshToken); + + useEffect(()=>{ + const urlParams = new URLSearchParams(window.location.search); + const accessToken = urlParams.get(LOCAL_STORAGE_KEY.accessToken); + const refreshToken = urlParams.get(LOCAL_STORAGE_KEY.refreshToken); + + if(accessToken){ + setAccessToken(accessToken); + setRefreshToken(refreshToken); + window.location.href="/my"; + } + + }, [setAccessToken, setRefreshToken]); + return ( +
+ +
+ ) +} + +export default GoogleLoginRedirectPage diff --git a/week05/Plat/mission3/src/pages/HomePage.tsx b/week05/Plat/mission3/src/pages/HomePage.tsx index f6d3449..5de7b21 100644 --- a/week05/Plat/mission3/src/pages/HomePage.tsx +++ b/week05/Plat/mission3/src/pages/HomePage.tsx @@ -2,34 +2,31 @@ import { Link } from "react-router-dom"; export default function HomePage() { return ( -
-
- - {/* 타이틀 */} -

Welcome

-

+

+
+

Welcome

+

Please choose an option below

- {/* 버튼 영역 */} -
+
Login Sign Up My Page diff --git a/week05/Plat/mission3/src/pages/LoginPage.tsx b/week05/Plat/mission3/src/pages/LoginPage.tsx index 8bcd38f..fbdf1c5 100644 --- a/week05/Plat/mission3/src/pages/LoginPage.tsx +++ b/week05/Plat/mission3/src/pages/LoginPage.tsx @@ -1,60 +1,96 @@ import { useAuth } from "../context/AuthContext"; import { useForm } from "../hooks/useForm"; import { validateSignin, type UserSignInformation } from "../utils/validate"; -import { Link } from "react-router-dom"; export default function LoginPage() { const { login } = useAuth(); - const { values, errors, touched, getInputProps } = + + const { values, errors, touched, getInputProps } = useForm({ initialValues: { email: "", password: "", }, validate: validateSignin, - }); - + }); + const handleSubmit = async () => { - await login(values); - } + await login(values); + }; + + const handleGoogleLogin = () => { + window.location.href = import.meta.env.VITE_SERVER_API_URL + "/v1/auth/google/login"; + }; const isDisabled = Object.values(errors || {}).some((error) => error.length > 0) || Object.values(values).some((value) => value === ""); return ( -
-
- Sign up | - My -
-
- - {errors?.email && touched?.email && ( -

{errors.email}

- )} - - {errors?.password && touched?.password && ( -

{errors.password}

- )} - +
+
+
+

Login

+

+ Sign in to continue +

+
+ +
+
+ + {errors?.email && touched?.email && ( +

{errors.email}

+ )} +
+ +
+ + {errors?.password && touched?.password && ( +

{errors.password}

+ )} +
+ + + +
+
+ or +
+
+ + +
); diff --git a/week05/Plat/mission3/src/pages/Mypage.tsx b/week05/Plat/mission3/src/pages/Mypage.tsx index 44b498b..7f72db8 100644 --- a/week05/Plat/mission3/src/pages/Mypage.tsx +++ b/week05/Plat/mission3/src/pages/Mypage.tsx @@ -38,8 +38,16 @@ const MyPage = () => {
-
- {data.data?.name?.charAt(0).toUpperCase()} +
+ {data.data?.avatar ? ( + Profile + ) : ( + data.data?.name?.charAt(0).toUpperCase() + )}

My Page

diff --git a/week05/Plat/mission3/src/pages/NotFoundPage.tsx b/week05/Plat/mission3/src/pages/NotFoundPage.tsx index 36bbb32..196a745 100644 --- a/week05/Plat/mission3/src/pages/NotFoundPage.tsx +++ b/week05/Plat/mission3/src/pages/NotFoundPage.tsx @@ -2,24 +2,42 @@ import { Link } from "react-router-dom"; export default function NotFoundPage() { return ( -
- -

404

+
-

- 페이지를 찾을 수 없습니다 -

+ {/* 배경 그라데이션 (은은한 네온 느낌) */} +
-

- 요청하신 페이지가 존재하지 않거나 잘못된 경로입니다. -

+ {/* 컨텐츠 */} +
- - 홈으로 돌아가기 - + {/* 404 텍스트 (네온 글로우) */} +

+ 404 +

+ +

+ Page Not Found +

+ +

+ The page you are looking for does not exist +

+ + {/* 네온 버튼 */} + + Go Home + +
); } \ No newline at end of file diff --git a/week05/Plat/mission3/src/pages/SignupPage.tsx b/week05/Plat/mission3/src/pages/SignupPage.tsx index c302b7d..b58ebf3 100644 --- a/week05/Plat/mission3/src/pages/SignupPage.tsx +++ b/week05/Plat/mission3/src/pages/SignupPage.tsx @@ -1,120 +1,144 @@ -import { z } from 'zod'; -import { useForm, type SubmitHandler } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; -import { postSignup } from '../apis/auth'; -import { Link } from 'react-router-dom'; +import { z } from "zod"; +import { useForm, type SubmitHandler } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { postSignup } from "../apis/auth"; -const schema = z.object({ - email: z - .string() - .email({ message: 'Invalid email address' }), +const schema = z + .object({ + email: z.string().email({ message: "Invalid email address" }), - password: z - .string() - .min(8, { message: 'Password must be at least 8 characters' }) - .max(20, { message: 'Password must be at most 20 characters' }), + password: z + .string() + .min(8, { message: "Password must be at least 8 characters" }) + .max(20, { message: "Password must be at most 20 characters" }), - passwordCheck: z - .string() - .min(8, { message: 'Password must be at least 8 characters' }) - .max(20, { message: 'Password must be at most 20 characters' }), + passwordCheck: z + .string() + .min(8, { message: "Password must be at least 8 characters" }) + .max(20, { message: "Password must be at most 20 characters" }), - name: z - .string() - .min(1, { message: 'Name is required' }), -}) -.refine((data) => data.password === data.passwordCheck, { - message: "Passwords do not match", - path: ['passwordCheck'], -}); + name: z.string().min(1, { message: "Name is required" }), + }) + .refine((data) => data.password === data.passwordCheck, { + message: "Passwords do not match", + path: ["passwordCheck"], + }); type FormFields = z.infer; const SignupPage = () => { const { - register, + register, handleSubmit, formState: { errors, isSubmitting }, - } = useForm({ + } = useForm({ defaultValues: { - name: '', - password: '', - passwordCheck: '', - email: '', + name: "", + password: "", + passwordCheck: "", + email: "", }, resolver: zodResolver(schema), }); const onSubmit: SubmitHandler = async (data) => { - const {passwordCheck, ...rest} = data; + const { passwordCheck, ...rest } = data; const response = await postSignup(rest); - console.log(response); }; return ( -
-
- Sign in | - My -
-
- - {errors.email && ( -
{errors.email.message}
- )} - - {errors.password && ( -
{errors.password.message}
- )} - - {errors.passwordCheck && ( -
{errors.passwordCheck.message}
- )} - - {errors.name && ( -
{errors.name.message}
- )} - +
+
+
+

Sign Up

+

+ Create your account +

+
+ +
+
+ + {errors.email && ( +

+ {errors.email.message} +

+ )} +
+ +
+ + {errors.password && ( +

+ {errors.password.message} +

+ )} +
+ +
+ + {errors.passwordCheck && ( +

+ {errors.passwordCheck.message} +

+ )} +
+ +
+ + {errors.name && ( +

+ {errors.name.message} +

+ )} +
+ + +
); -} +}; export default SignupPage; \ No newline at end of file From 9a37a728f49b8783bd8225595243fd1384c6932c Mon Sep 17 00:00:00 2001 From: Chen Date: Sat, 16 May 2026 23:09:30 +0900 Subject: [PATCH 6/6] feat: mission1 upload --- week07/Plat/mission1/.gitignore | 24 + week07/Plat/mission1/README.md | 40 + week07/Plat/mission1/eslint.config.js | 23 + week07/Plat/mission1/index.html | 13 + week07/Plat/mission1/package-lock.json | 3401 +++++++++++++++++ week07/Plat/mission1/package.json | 37 + week07/Plat/mission1/public/googlelogo.png | Bin 0 -> 79671 bytes week07/Plat/mission1/src/App.css | 0 week07/Plat/mission1/src/App.tsx | 71 + week07/Plat/mission1/src/apis/auth.ts | 57 + week07/Plat/mission1/src/apis/axios.ts | 113 + week07/Plat/mission1/src/apis/comment.ts | 75 + week07/Plat/mission1/src/apis/lp.ts | 72 + .../src/components/FloatingButton.tsx | 20 + .../Plat/mission1/src/components/Footer.tsx | 11 + .../Plat/mission1/src/components/Header.tsx | 136 + .../src/components/InfiniteScrollTrigger.tsx | 44 + .../mission1/src/components/QueryStatus.tsx | 42 + .../Plat/mission1/src/components/Sidebar.tsx | 93 + .../components/comment/CommentInputBox.tsx | 61 + .../src/components/comment/CommentList.tsx | 256 ++ .../src/components/lp/LpFormModal.tsx | 313 ++ .../components/skeleton/CommentSkeleton.tsx | 17 + .../skeleton/CommentSkeletonList.tsx | 17 + .../components/skeleton/LpCardSkeleton.tsx | 13 + .../skeleton/LpCardSkeletonGrid.tsx | 17 + week07/Plat/mission1/src/constants/key.ts | 12 + .../Plat/mission1/src/context/AuthContext.tsx | 146 + week07/Plat/mission1/src/enums/common.ts | 1 + .../hooks/mutations/useCommentMutations.ts | 49 + .../src/hooks/mutations/useLpMutations.ts | 75 + .../src/hooks/mutations/useMyInfoMutation.ts | 14 + .../hooks/queries/useGetInfiniteLpComments.ts | 40 + .../src/hooks/queries/useGetInfiniteLpList.ts | 39 + .../src/hooks/queries/useGetLpDetail.ts | 16 + .../src/hooks/queries/useGetLpList.ts | 22 + week07/Plat/mission1/src/hooks/useForm.ts | 45 + .../mission1/src/hooks/useLocalStorage.ts | 29 + week07/Plat/mission1/src/index.css | 1 + .../Plat/mission1/src/layouts/HomeLayout.tsx | 102 + .../mission1/src/layouts/ProtectedLayout.tsx | 20 + week07/Plat/mission1/src/main.tsx | 10 + .../src/pages/GoogleLoginRedirectPage.tsx | 40 + week07/Plat/mission1/src/pages/HomePage.tsx | 140 + week07/Plat/mission1/src/pages/LoginPage.tsx | 102 + .../Plat/mission1/src/pages/LpDetailPage.tsx | 246 ++ week07/Plat/mission1/src/pages/Mypage.tsx | 348 ++ .../Plat/mission1/src/pages/NotFoundPage.tsx | 43 + week07/Plat/mission1/src/pages/SignupPage.tsx | 146 + week07/Plat/mission1/src/types/auth.ts | 56 + week07/Plat/mission1/src/types/comment.ts | 29 + week07/Plat/mission1/src/types/common.ts | 25 + week07/Plat/mission1/src/types/lp.ts | 49 + week07/Plat/mission1/src/utils/validate.ts | 31 + week07/Plat/mission1/src/vite-env.d.ts | 7 + week07/Plat/mission1/tsconfig.app.json | 25 + week07/Plat/mission1/tsconfig.json | 7 + week07/Plat/mission1/tsconfig.node.json | 24 + week07/Plat/mission1/vite.config.ts | 11 + 59 files changed, 6916 insertions(+) create mode 100644 week07/Plat/mission1/.gitignore create mode 100644 week07/Plat/mission1/README.md create mode 100644 week07/Plat/mission1/eslint.config.js create mode 100644 week07/Plat/mission1/index.html create mode 100644 week07/Plat/mission1/package-lock.json create mode 100644 week07/Plat/mission1/package.json create mode 100644 week07/Plat/mission1/public/googlelogo.png create mode 100644 week07/Plat/mission1/src/App.css create mode 100644 week07/Plat/mission1/src/App.tsx create mode 100644 week07/Plat/mission1/src/apis/auth.ts create mode 100644 week07/Plat/mission1/src/apis/axios.ts create mode 100644 week07/Plat/mission1/src/apis/comment.ts create mode 100644 week07/Plat/mission1/src/apis/lp.ts create mode 100644 week07/Plat/mission1/src/components/FloatingButton.tsx create mode 100644 week07/Plat/mission1/src/components/Footer.tsx create mode 100644 week07/Plat/mission1/src/components/Header.tsx create mode 100644 week07/Plat/mission1/src/components/InfiniteScrollTrigger.tsx create mode 100644 week07/Plat/mission1/src/components/QueryStatus.tsx create mode 100644 week07/Plat/mission1/src/components/Sidebar.tsx create mode 100644 week07/Plat/mission1/src/components/comment/CommentInputBox.tsx create mode 100644 week07/Plat/mission1/src/components/comment/CommentList.tsx create mode 100644 week07/Plat/mission1/src/components/lp/LpFormModal.tsx create mode 100644 week07/Plat/mission1/src/components/skeleton/CommentSkeleton.tsx create mode 100644 week07/Plat/mission1/src/components/skeleton/CommentSkeletonList.tsx create mode 100644 week07/Plat/mission1/src/components/skeleton/LpCardSkeleton.tsx create mode 100644 week07/Plat/mission1/src/components/skeleton/LpCardSkeletonGrid.tsx create mode 100644 week07/Plat/mission1/src/constants/key.ts create mode 100644 week07/Plat/mission1/src/context/AuthContext.tsx create mode 100644 week07/Plat/mission1/src/enums/common.ts create mode 100644 week07/Plat/mission1/src/hooks/mutations/useCommentMutations.ts create mode 100644 week07/Plat/mission1/src/hooks/mutations/useLpMutations.ts create mode 100644 week07/Plat/mission1/src/hooks/mutations/useMyInfoMutation.ts create mode 100644 week07/Plat/mission1/src/hooks/queries/useGetInfiniteLpComments.ts create mode 100644 week07/Plat/mission1/src/hooks/queries/useGetInfiniteLpList.ts create mode 100644 week07/Plat/mission1/src/hooks/queries/useGetLpDetail.ts create mode 100644 week07/Plat/mission1/src/hooks/queries/useGetLpList.ts create mode 100644 week07/Plat/mission1/src/hooks/useForm.ts create mode 100644 week07/Plat/mission1/src/hooks/useLocalStorage.ts create mode 100644 week07/Plat/mission1/src/index.css create mode 100644 week07/Plat/mission1/src/layouts/HomeLayout.tsx create mode 100644 week07/Plat/mission1/src/layouts/ProtectedLayout.tsx create mode 100644 week07/Plat/mission1/src/main.tsx create mode 100644 week07/Plat/mission1/src/pages/GoogleLoginRedirectPage.tsx create mode 100644 week07/Plat/mission1/src/pages/HomePage.tsx create mode 100644 week07/Plat/mission1/src/pages/LoginPage.tsx create mode 100644 week07/Plat/mission1/src/pages/LpDetailPage.tsx create mode 100644 week07/Plat/mission1/src/pages/Mypage.tsx create mode 100644 week07/Plat/mission1/src/pages/NotFoundPage.tsx create mode 100644 week07/Plat/mission1/src/pages/SignupPage.tsx create mode 100644 week07/Plat/mission1/src/types/auth.ts create mode 100644 week07/Plat/mission1/src/types/comment.ts create mode 100644 week07/Plat/mission1/src/types/common.ts create mode 100644 week07/Plat/mission1/src/types/lp.ts create mode 100644 week07/Plat/mission1/src/utils/validate.ts create mode 100644 week07/Plat/mission1/src/vite-env.d.ts create mode 100644 week07/Plat/mission1/tsconfig.app.json create mode 100644 week07/Plat/mission1/tsconfig.json create mode 100644 week07/Plat/mission1/tsconfig.node.json create mode 100644 week07/Plat/mission1/vite.config.ts diff --git a/week07/Plat/mission1/.gitignore b/week07/Plat/mission1/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/week07/Plat/mission1/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/week07/Plat/mission1/README.md b/week07/Plat/mission1/README.md new file mode 100644 index 0000000..52c6b57 --- /dev/null +++ b/week07/Plat/mission1/README.md @@ -0,0 +1,40 @@ +## README + +### 🔐 Google OAuth Redirect 처리 + +OAuth를 통해 Google 로그인 성공 후 리다이렉트 페이지를 구현했습니다. + +--- + +### 📌 구현 목적 + +* Google OAuth 로그인 결과 처리 +* 로그인 상태 유지 및 자동 이동 처리 + +--- + +### ⚙️ 동작 방식 + +1. Google 로그인 성공 후 `/google/callback`으로 리다이렉트 +2. URL Query에서 토큰 추출 +3. LocalStorage에 토큰 저장 +4. `/my` 페이지로 이동 + +--- + +### 🛠 주요 구현 코드 + +```ts +const urlParams = new URLSearchParams(window.location.search); + +const accessToken = urlParams.get(LOCAL_STORAGE_KEY.accessToken); +const refreshToken = urlParams.get(LOCAL_STORAGE_KEY.refreshToken); + +if (accessToken) { + setAccessToken(accessToken); + setRefreshToken(refreshToken); + window.location.href = "/my"; +} +``` + +--- \ No newline at end of file diff --git a/week07/Plat/mission1/eslint.config.js b/week07/Plat/mission1/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/week07/Plat/mission1/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/week07/Plat/mission1/index.html b/week07/Plat/mission1/index.html new file mode 100644 index 0000000..423cb13 --- /dev/null +++ b/week07/Plat/mission1/index.html @@ -0,0 +1,13 @@ + + + + + + + Spinning Plat + + +
+ + + diff --git a/week07/Plat/mission1/package-lock.json b/week07/Plat/mission1/package-lock.json new file mode 100644 index 0000000..a5eed5a --- /dev/null +++ b/week07/Plat/mission1/package-lock.json @@ -0,0 +1,3401 @@ +{ + "name": "login", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "login", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "@tanstack/react-query": "^5.100.9", + "@tanstack/react-query-devtools": "^5.100.9", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "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, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "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, + "license": "Apache-2.0", + "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, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tanstack/query-core": { + "version": "5.100.9", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.9.tgz", + "integrity": "sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.100.9", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.100.9.tgz", + "integrity": "sha512-gqiptrTIhbK2PuCaPRHmWXfJG1NGYVFpAr0HqogEqiSBNB5xDz6fmesQt7w4WgMOqOQPnPHJ3ZDMuhDaXvNO8g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.100.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.9.tgz", + "integrity": "sha512-Oa44XkaI3kCNN6ME0KByU3xT3SEUNOMfZpHxL6+wFoTm+OeUFYHKdeYVe0aOXlRDm/f15sgLwEt2HDorIdW8+A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.100.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.100.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.100.9.tgz", + "integrity": "sha512-mM3slaVGXJmz+pOLgXdANj75ikgQCyudyl3kmFvm6brI1JyVeY/+IeD17uDHIvZrD8hfoO2sdZ54RFsHdYAuhA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.100.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.100.9", + "react": "^18 || ^19" + } + }, + "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/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, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.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.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "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.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", + "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "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/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/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, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-hook-form": { + "version": "7.72.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.1.tgz", + "integrity": "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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" + } + } + } +} diff --git a/week07/Plat/mission1/package.json b/week07/Plat/mission1/package.json new file mode 100644 index 0000000..f66173a --- /dev/null +++ b/week07/Plat/mission1/package.json @@ -0,0 +1,37 @@ +{ + "name": "login", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "@tanstack/react-query": "^5.100.9", + "@tanstack/react-query-devtools": "^5.100.9", + "axios": "^1.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.72.1", + "react-router-dom": "^7.14.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} diff --git a/week07/Plat/mission1/public/googlelogo.png b/week07/Plat/mission1/public/googlelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f21fb49f78b844e6f2963f725773e40a5afcbc GIT binary patch literal 79671 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 Z;XbGOoV^vrfB-FUin6LQ)zT(k{vR~}o%a9$ literal 0 HcmV?d00001 diff --git a/week07/Plat/mission1/src/App.css b/week07/Plat/mission1/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/week07/Plat/mission1/src/App.tsx b/week07/Plat/mission1/src/App.tsx new file mode 100644 index 0000000..a101461 --- /dev/null +++ b/week07/Plat/mission1/src/App.tsx @@ -0,0 +1,71 @@ +import "./App.css"; +import { + createBrowserRouter, + RouterProvider, + type RouteObject, +} from "react-router-dom"; +import HomePage from "./pages/HomePage"; +import NotFoundPage from "./pages/NotFoundPage"; +import HomeLayout from "./layouts/HomeLayout"; +import SignupPage from "./pages/SignupPage"; +import LoginPage from "./pages/LoginPage"; +import MyPage from "./pages/Mypage"; +import { AuthProvider } from "./context/AuthContext"; +import ProtectedLayout from "./layouts/ProtectedLayout"; +import GoogleLoginRedirectPage from "./pages/GoogleLoginRedirectPage"; +import LpDetailPage from "./pages/LpDetailPage"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +const publicRoutes: RouteObject[] = [ + { + path: "/", + element: , + errorElement: , + children: [ + { index: true, element: }, + { path: "login", element: }, + { path: "signup", element: }, + { path: "lp/:lpid", element: }, + { + path: "v1/auth/google/callback", + element: , + }, + ], + }, +]; + +const protectedRoutes: RouteObject[] = [ + { + path: "/", + element: , + errorElement: , + children: [ + { + path: "my", + element: , + }, + ], + }, +]; + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 3, + }, + }, +}); + +function App() { + return ( + + + + + + ); +} + +export default App; diff --git a/week07/Plat/mission1/src/apis/auth.ts b/week07/Plat/mission1/src/apis/auth.ts new file mode 100644 index 0000000..e7aea75 --- /dev/null +++ b/week07/Plat/mission1/src/apis/auth.ts @@ -0,0 +1,57 @@ +import { axiosInstance } from "./axios"; +import type { + RequestSignupDto, + ResponseSignupDto, + RequestSigninDto, + ResponseSigninDto, + ResponseMyInfoDto, + RequestUpdateMyInfoDto, + ResponseDeleteMyAccountDto, + ResponseLogoutDto, + ResponseUpdateMyInfoDto, +} from "../types/auth" + +export const postSignup = async ( + body: RequestSignupDto, +):Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signup", + body, + ); + return data; +} + +export const postSignin = async ( + body: RequestSigninDto, + ): Promise => { + const { data } = await axiosInstance.post( + "/v1/auth/signin", + body, + ); + return data; +} + +export const getMyInfo = async ():Promise => { + const { data } = await axiosInstance.get("/v1/users/me"); + + return data; +}; + +export const postLogout = async (): Promise => { + const { data } = await axiosInstance.post("/v1/auth/signout"); + return data; +} + +export const patchMyInfo = async ( + body: RequestUpdateMyInfoDto, +): Promise => { + const { data } = await axiosInstance.patch("/v1/users/me", body); + + return data; +}; + +export const deleteMyAccount = async (): Promise => { + const { data } = await axiosInstance.delete("/v1/users/me"); + + return data; +}; diff --git a/week07/Plat/mission1/src/apis/axios.ts b/week07/Plat/mission1/src/apis/axios.ts new file mode 100644 index 0000000..62f74a0 --- /dev/null +++ b/week07/Plat/mission1/src/apis/axios.ts @@ -0,0 +1,113 @@ +import axios, { type InternalAxiosRequestConfig } from "axios"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { useLocalStorage } from "../hooks/useLocalStorage"; + +interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig{ + _retry?:boolean; +} + +let refreshPromise:Promise | null = null; + +export const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + /* + headers: { + Authorization: `Bearer ${localStorage.getItem(LOCAL_STORAGE_KEY.accessToken)}` + }, + */ +}); + +axiosInstance.interceptors.request.use((config) => { + const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const accessToken = getItem(); + + if(accessToken){ + config.headers = config.headers || {}; + config.headers.Authorization = `Bearer ${accessToken}`; + } + + return config; + }, + (error) => Promise.reject(error), +); + +axiosInstance.interceptors.response.use( + (response) => response, + async(error) => { + const originalRequest: CustomInternalAxiosRequestConfig = error.config; + + if( + error.response && + error.response.status === 401 && + !originalRequest._retry + ) { + if(originalRequest.url === '/v1/auth/refresh'){ + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + return Promise.reject(error); + } + + originalRequest._retry = true; + + if(!refreshPromise) { + refreshPromise = (async() => { + const{ getItem:getRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + const refreshToken = getRefreshToken(); + + const { data } = await axiosInstance.post("/v1/auth/refresh", { + refresh:refreshToken, + }); + + const { setItem:setAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { setItem:setRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + + const newAccessToken = data.data.accessToken; + const newRefreshToken = data.data.refreshToken; + + setAccessToken(newAccessToken); + + if(newRefreshToken) { + setRefreshToken(newRefreshToken); + } + + return newAccessToken; + })().catch((error) => { + const { removeItem:removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken, + ); + const { removeItem:removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken, + ); + removeAccessToken(); + removeRefreshToken(); + + window.location.href = "/login"; + + throw error; + }).finally(() => { + refreshPromise = null; + }); + } + + return refreshPromise.then((newAccessToken)=> { + originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; + + return axiosInstance.request(originalRequest); + }); + } + return Promise.reject(error); + }, +) \ No newline at end of file diff --git a/week07/Plat/mission1/src/apis/comment.ts b/week07/Plat/mission1/src/apis/comment.ts new file mode 100644 index 0000000..c6000f0 --- /dev/null +++ b/week07/Plat/mission1/src/apis/comment.ts @@ -0,0 +1,75 @@ +import { axiosInstance } from "./axios.ts"; +import type { PAGINATION_ORDER } from "../enums/common.ts"; +import type { + RequestLpCommentDto, + ResponseDeleteLpCommentDto, + ResponseLpCommentDto, + ResponseLpCommentListDto, +} from "../types/comment.ts"; + +type GetLpCommentListParams = { + lpId: number; + cursor?: number; + limit?: number; + order?: PAGINATION_ORDER; +}; + +export const getLpCommentList = async ({ + lpId, + cursor, + limit = 10, + order = "desc", +}: GetLpCommentListParams): Promise => { + const { data } = await axiosInstance.get(`/v1/lps/${lpId}/comments`, { + params: { + cursor, + limit, + order, + }, + }); + + return data; +}; + +export const postLpComment = async ({ + lpId, + body, +}: { + lpId: number; + body: RequestLpCommentDto; +}): Promise => { + const { data } = await axiosInstance.post(`/v1/lps/${lpId}/comments`, body); + + return data; +}; + +export const patchLpComment = async ({ + lpId, + commentId, + body, +}: { + lpId: number; + commentId: number; + body: RequestLpCommentDto; +}): Promise => { + const { data } = await axiosInstance.patch( + `/v1/lps/${lpId}/comments/${commentId}`, + body + ); + + return data; +}; + +export const deleteLpComment = async ({ + lpId, + commentId, +}: { + lpId: number; + commentId: number; +}): Promise => { + const { data } = await axiosInstance.delete( + `/v1/lps/${lpId}/comments/${commentId}` + ); + + return data; +}; diff --git a/week07/Plat/mission1/src/apis/lp.ts b/week07/Plat/mission1/src/apis/lp.ts new file mode 100644 index 0000000..951b159 --- /dev/null +++ b/week07/Plat/mission1/src/apis/lp.ts @@ -0,0 +1,72 @@ +import { type PaginationDto } from "../types/common.ts"; +import type { + RequestCreateLpDto, + RequestUpdateLpDto, + ResponseDeleteLpDto, + ResponseLpDetailDto, + ResponseLpListDto, + ResponseLpMutationDto, +} from "../types/lp.ts"; +import { axiosInstance } from "./axios.ts"; + +export const getLpList = async ( + paginationDto: PaginationDto +): Promise => { + const { data } = await axiosInstance.get("/v1/lps", { + params: paginationDto, + }); + + return data; +}; + +export const getLpDetail = async ( + lpid: number +): Promise => { + const { data } = await axiosInstance.get(`/v1/lps/${lpid}`); + + return data; +}; + +export const postLp = async ( + body: RequestCreateLpDto +): Promise => { + const { data } = await axiosInstance.post("/v1/lps", body); + + return data; +}; + +export const patchLp = async ({ + lpId, + body, +}: { + lpId: number; + body: RequestUpdateLpDto; +}): Promise => { + const { data } = await axiosInstance.patch(`/v1/lps/${lpId}`, body); + + return data; +}; + +export const deleteLpById = async ( + lpId: number +): Promise => { + const { data } = await axiosInstance.delete(`/v1/lps/${lpId}`); + + return data; +}; + +export const postLpLike = async ( + lpId: number +): Promise => { + const { data } = await axiosInstance.post(`/v1/lps/${lpId}/likes`); + + return data; +}; + +export const deleteLpLike = async ( + lpId: number +): Promise => { + const { data } = await axiosInstance.delete(`/v1/lps/${lpId}/likes`); + + return data; +}; diff --git a/week07/Plat/mission1/src/components/FloatingButton.tsx b/week07/Plat/mission1/src/components/FloatingButton.tsx new file mode 100644 index 0000000..ef4458a --- /dev/null +++ b/week07/Plat/mission1/src/components/FloatingButton.tsx @@ -0,0 +1,20 @@ +type FloatingButtonProps = { + onClick: () => void; +}; + +export default function FloatingButton({ onClick }: FloatingButtonProps) { + return ( + + ); +} diff --git a/week07/Plat/mission1/src/components/Footer.tsx b/week07/Plat/mission1/src/components/Footer.tsx new file mode 100644 index 0000000..a15a0db --- /dev/null +++ b/week07/Plat/mission1/src/components/Footer.tsx @@ -0,0 +1,11 @@ + +export default function Footer() { + return ( +
+
+ © 2026 MyApp + Built with React + Tailwind +
+
+ ); +} \ No newline at end of file diff --git a/week07/Plat/mission1/src/components/Header.tsx b/week07/Plat/mission1/src/components/Header.tsx new file mode 100644 index 0000000..2867128 --- /dev/null +++ b/week07/Plat/mission1/src/components/Header.tsx @@ -0,0 +1,136 @@ +import type { FormEvent } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { useQuery } from "@tanstack/react-query"; +import { useAuth } from "../context/AuthContext"; +import { getMyInfo } from "../apis/auth"; +import { QUERY_KEY } from "../constants/key"; + +type HeaderProps = { + onMenuClick: () => void; +}; + +export default function Header({ onMenuClick }: HeaderProps) { + const { accessToken, isLoggingOut, logout } = useAuth(); + const navigate = useNavigate(); + + const { data: myInfo } = useQuery({ + queryKey: [QUERY_KEY.my], + queryFn: getMyInfo, + enabled: !!accessToken, + staleTime: 1000 * 60 * 5, + select: (response) => response.data, + }); + + const handleLogout = async () => { + try { + await logout(); + navigate("/login"); + } catch { + return; + } + }; + + const handleSearch = (event: FormEvent) => { + event.preventDefault(); + }; + + return ( +
+
+
+ + + + Cat YaOh + +
+ + +
+
+ ); +} diff --git a/week07/Plat/mission1/src/components/InfiniteScrollTrigger.tsx b/week07/Plat/mission1/src/components/InfiniteScrollTrigger.tsx new file mode 100644 index 0000000..e206444 --- /dev/null +++ b/week07/Plat/mission1/src/components/InfiniteScrollTrigger.tsx @@ -0,0 +1,44 @@ +// src/components/InfiniteScrollTrigger.tsx + +import { useEffect, useRef } from "react"; + +type InfiniteScrollTriggerProps = { + hasNextPage: boolean; + isFetchingNextPage: boolean; + onIntersect: () => void; +}; + +export default function InfiniteScrollTrigger({ + hasNextPage, + isFetchingNextPage, + onIntersect, +}: InfiniteScrollTriggerProps) { + const triggerRef = useRef(null); + + useEffect(() => { + const target = triggerRef.current; + + if (!target) return; + + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting && hasNextPage && !isFetchingNextPage) { + onIntersect(); + } + }, + { + root: null, + rootMargin: "200px", + threshold: 0.1, + } + ); + + observer.observe(target); + + return () => { + observer.unobserve(target); + }; + }, [hasNextPage, isFetchingNextPage, onIntersect]); + + return
; +} \ No newline at end of file diff --git a/week07/Plat/mission1/src/components/QueryStatus.tsx b/week07/Plat/mission1/src/components/QueryStatus.tsx new file mode 100644 index 0000000..278ea30 --- /dev/null +++ b/week07/Plat/mission1/src/components/QueryStatus.tsx @@ -0,0 +1,42 @@ +type LoadingStateProps = { + message?: string; +}; + +export function LoadingState({ message = "Loading..." }: LoadingStateProps) { + return ( +
+
+

{message}

+
+
+ ); +} + +type ErrorStateProps = { + message?: string; + onRetry?: () => void; +}; + +export function ErrorState({ + message = "데이터를 불러오지 못했습니다.", + onRetry, +}: ErrorStateProps) { + return ( +
+
+

오류 발생

+

{message}

+ + {onRetry && ( + + )} +
+
+ ); +} \ No newline at end of file diff --git a/week07/Plat/mission1/src/components/Sidebar.tsx b/week07/Plat/mission1/src/components/Sidebar.tsx new file mode 100644 index 0000000..111a432 --- /dev/null +++ b/week07/Plat/mission1/src/components/Sidebar.tsx @@ -0,0 +1,93 @@ +import { Link } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; + +type SidebarProps = { + isOpen: boolean; + onClose: () => void; +}; + +export default function Sidebar({ isOpen, onClose }: SidebarProps) { + const { accessToken } = useAuth(); + + return ( + <> + + + + ); +} diff --git a/week07/Plat/mission1/src/components/comment/CommentInputBox.tsx b/week07/Plat/mission1/src/components/comment/CommentInputBox.tsx new file mode 100644 index 0000000..1be34f5 --- /dev/null +++ b/week07/Plat/mission1/src/components/comment/CommentInputBox.tsx @@ -0,0 +1,61 @@ +import { useState } from "react"; +import { useCreateCommentMutation } from "../../hooks/mutations/useCommentMutations"; + +type CommentInputBoxProps = { + lpId?: string; +}; + +export default function CommentInputBox({ lpId }: CommentInputBoxProps) { + const [comment, setComment] = useState(""); + const createCommentMutation = useCreateCommentMutation(Number(lpId)); + + const isInvalid = comment.trim().length === 0; + + const handleCreateComment = async () => { + if (!lpId || isInvalid) return; + + await createCommentMutation.mutateAsync({ + lpId: Number(lpId), + body: { + content: comment.trim(), + }, + }); + setComment(""); + }; + + return ( +
+ + +