From 9a539e4b4bf1ca16f29262b229045d8b97eab45d Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 20 Oct 2025 18:21:55 -0300 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 14 + README.md | 48 + client/.gitignore | 24 + client/README.md | 69 + client/bun.lock | 645 +++++ client/eslint.config.js | 23 + client/index.html | 13 + client/package.json | 34 + client/public/android-chrome-192x192.png | Bin 0 -> 16139 bytes client/public/android-chrome-512x512.png | Bin 0 -> 40661 bytes client/public/apple-touch-icon.png | Bin 0 -> 14708 bytes client/public/favicon-16x16.png | Bin 0 -> 665 bytes client/public/favicon-32x32.png | Bin 0 -> 1779 bytes client/public/favicon.ico | Bin 0 -> 15406 bytes client/public/favicon_SETUP.md | 38 + client/public/index.html | 24 + client/public/manifest.json | 30 + client/public/robots.txt | 3 + client/public/vite.svg | 1 + client/src/@types/index.ts | 10 + client/src/App.css | 42 + client/src/App.tsx | 43 + client/src/assets/react.svg | 1 + client/src/components/AuthModal.tsx | 92 + client/src/components/Header.tsx | 70 + client/src/components/OnlineIndicator.tsx | 64 + client/src/constants/index.ts | 4 + client/src/contexts/AuthContext.tsx | 113 + client/src/functions/get-query-payload.ts | 19 + client/src/functions/get-token-payload.ts | 13 + client/src/hooks/useLocalStorage.ts | 42 + client/src/hooks/useMediaQuery.Ts | 30 + client/src/index.css | 68 + client/src/main.tsx | 18 + client/src/store/useModalStore.ts | 11 + client/src/styles/ReactWelcome.css | 23 + client/src/styles/index.css | 63 + client/src/utils/axios.ts | 8 + client/src/vite-env.d.ts | 1 + client/tsconfig.app.json | 27 + client/tsconfig.json | 32 + client/tsconfig.node.json | 25 + client/vite.config.ts | 7 + makefile | 11 + package.json | 16 + server/.env.example | 3 + server/bun.lock | 428 ++++ server/package-lock.json | 2101 +++++++++++++++++ server/package.json | 29 + server/src/@types/express.d.ts | 10 + server/src/@types/index.ts | 5 + server/src/constants/index.ts | 11 + .../src/controllers/auth/login-with-token.ts | 32 + server/src/controllers/auth/login.ts | 59 + server/src/controllers/auth/register.ts | 55 + server/src/index.ts | 28 + server/src/middlewares/check-bearer-token.ts | 35 + server/src/middlewares/error-handler.ts | 12 + server/src/models/Account.ts | 39 + server/src/routes/auth.ts | 20 + server/src/utils/app.ts | 13 + server/src/utils/crypt.ts | 22 + server/src/utils/joi.ts | 22 + server/src/utils/jwt.ts | 25 + server/src/utils/mongo.ts | 37 + server/tsconfig.json | 15 + 67 files changed, 4822 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 client/.gitignore create mode 100644 client/README.md create mode 100644 client/bun.lock create mode 100644 client/eslint.config.js create mode 100644 client/index.html create mode 100644 client/package.json create mode 100644 client/public/android-chrome-192x192.png create mode 100644 client/public/android-chrome-512x512.png create mode 100644 client/public/apple-touch-icon.png create mode 100644 client/public/favicon-16x16.png create mode 100644 client/public/favicon-32x32.png create mode 100644 client/public/favicon.ico create mode 100644 client/public/favicon_SETUP.md create mode 100644 client/public/index.html create mode 100644 client/public/manifest.json create mode 100644 client/public/robots.txt create mode 100644 client/public/vite.svg create mode 100644 client/src/@types/index.ts create mode 100644 client/src/App.css create mode 100644 client/src/App.tsx create mode 100644 client/src/assets/react.svg create mode 100644 client/src/components/AuthModal.tsx create mode 100644 client/src/components/Header.tsx create mode 100644 client/src/components/OnlineIndicator.tsx create mode 100644 client/src/constants/index.ts create mode 100644 client/src/contexts/AuthContext.tsx create mode 100644 client/src/functions/get-query-payload.ts create mode 100644 client/src/functions/get-token-payload.ts create mode 100644 client/src/hooks/useLocalStorage.ts create mode 100644 client/src/hooks/useMediaQuery.Ts create mode 100644 client/src/index.css create mode 100644 client/src/main.tsx create mode 100644 client/src/store/useModalStore.ts create mode 100644 client/src/styles/ReactWelcome.css create mode 100644 client/src/styles/index.css create mode 100644 client/src/utils/axios.ts create mode 100644 client/src/vite-env.d.ts create mode 100644 client/tsconfig.app.json create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts create mode 100644 makefile create mode 100644 package.json create mode 100644 server/.env.example create mode 100644 server/bun.lock create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/src/@types/express.d.ts create mode 100644 server/src/@types/index.ts create mode 100644 server/src/constants/index.ts create mode 100644 server/src/controllers/auth/login-with-token.ts create mode 100644 server/src/controllers/auth/login.ts create mode 100644 server/src/controllers/auth/register.ts create mode 100644 server/src/index.ts create mode 100644 server/src/middlewares/check-bearer-token.ts create mode 100644 server/src/middlewares/error-handler.ts create mode 100644 server/src/models/Account.ts create mode 100644 server/src/routes/auth.ts create mode 100644 server/src/utils/app.ts create mode 100644 server/src/utils/crypt.ts create mode 100644 server/src/utils/joi.ts create mode 100644 server/src/utils/jwt.ts create mode 100644 server/src/utils/mongo.ts create mode 100644 server/tsconfig.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..841e1e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# dependencies +node_modules +.pnp +.pnp.js + +# production +build +dist + +# misc +.env +.DS_Store +*.log +*.pid diff --git a/README.md b/README.md new file mode 100644 index 0000000..6310e33 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# MERN Stack Template + + + +- **M** = [MongoDB](https://www.mongodb.com) +- **E** = [Express.js](https://expressjs.com) +- **R** = [React.js](https://reactjs.org) +- **N** = [Node.js](https://nodejs.org) + +
+ +# Que es esta plantilla? + +Esta plantilla permite iniciar un proyecto usando el stack MERN, viene incluido con algunas funcionalidades de auth basicas y un cliente con vite + + + +
+ +# Como uso esta plantilla? +### 2. Instalar Dependencias + +#### 1 + +``` +cd ./server +bun install +``` + +#### 2 + +``` +cd ./client +bun install +``` + +### 3. MongoDB: + +Prepare your MongoDB database (using [Atlas](https://www.mongodb.com/cloud/atlas), +or [Community]()). Then configure your database within `server/src/constants/index.js` (or `server/src/.env`), by configuring the `MONGO_URI` variable. + +### 4. Iniciar Aplicaciones + +```bash +make +``` + +### 5. Happy Coding !!1!!!! diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/client/.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/client/README.md b/client/README.md new file mode 100644 index 0000000..7959ce4 --- /dev/null +++ b/client/README.md @@ -0,0 +1,69 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/client/bun.lock b/client/bun.lock new file mode 100644 index 0000000..8931051 --- /dev/null +++ b/client/bun.lock @@ -0,0 +1,645 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "cli", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^7.3.1", + "axios": "^1.11.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "zustand": "^5.0.7", + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + + "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], + + "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.2", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw=="], + + "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], + + "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], + + "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], + + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], + + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.3.1", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw=="], + + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], + + "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], + + "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], + + "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], + + "@emotion/styled": ["@emotion/styled@11.14.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", "react": ">=16.8.0" } }, "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw=="], + + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], + + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], + + "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], + + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], + + "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "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.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.33.0", "", {}, "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + + "@mui/core-downloads-tracker": ["@mui/core-downloads-tracker@7.3.1", "", {}, "sha512-+mIK1Z0BhOaQ0vCgOkT1mSrIpEHLo338h4/duuL4TBLXPvUMit732mnwJY3W40Avy30HdeSfwUAAGRkKmwRaEQ=="], + + "@mui/material": ["@mui/material@7.3.1", "", { "dependencies": { "@babel/runtime": "^7.28.2", "@mui/core-downloads-tracker": "^7.3.1", "@mui/system": "^7.3.1", "@mui/types": "^7.4.5", "@mui/utils": "^7.3.1", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^19.1.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@mui/material-pigment-css": "^7.3.1", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@mui/material-pigment-css", "@types/react"] }, "sha512-Xf6Shbo03YmcBedZMwSpEFOwpYDtU7tC+rhAHTrA9FHk0FpsDqiQ9jUa1j/9s3HLs7KWb5mDcGnlwdh9Q9KAag=="], + + "@mui/private-theming": ["@mui/private-theming@7.3.1", "", { "dependencies": { "@babel/runtime": "^7.28.2", "@mui/utils": "^7.3.1", "prop-types": "^15.8.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-WU3YLkKXii/x8ZEKnrLKsPwplCVE11yZxUvlaaZSIzCcI3x2OdFC8eMlNy74hVeUsYQvzzX1Es/k4ARPlFvpPQ=="], + + "@mui/styled-engine": ["@mui/styled-engine@7.3.1", "", { "dependencies": { "@babel/runtime": "^7.28.2", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled"] }, "sha512-Nqo6OHjvJpXJ1+9TekTE//+8RybgPQUKwns2Lh0sq+8rJOUSUKS3KALv4InSOdHhIM9Mdi8/L7LTF1/Ky6D6TQ=="], + + "@mui/system": ["@mui/system@7.3.1", "", { "dependencies": { "@babel/runtime": "^7.28.2", "@mui/private-theming": "^7.3.1", "@mui/styled-engine": "^7.3.1", "@mui/types": "^7.4.5", "@mui/utils": "^7.3.1", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@types/react"] }, "sha512-mIidecvcNVpNJMdPDmCeoSL5zshKBbYPcphjuh6ZMjhybhqhZ4mX6k9zmIWh6XOXcqRQMg5KrcjnO0QstrNj3w=="], + + "@mui/types": ["@mui/types@7.4.5", "", { "dependencies": { "@babel/runtime": "^7.28.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-ZPwlAOE3e8C0piCKbaabwrqZbW4QvWz0uapVPWya7fYj6PeDkl5sSJmomT7wjOcZGPB48G/a6Ubidqreptxz4g=="], + + "@mui/utils": ["@mui/utils@7.3.1", "", { "dependencies": { "@babel/runtime": "^7.28.2", "@mui/types": "^7.4.5", "@types/prop-types": "^15.7.15", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.1.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-/31y4wZqVWa0jzMnzo6JPjxwP6xXy4P3+iLbosFg/mJQowL1KIou0LC+lquWW60FKVbKz5ZUWBg2H3jausa0pw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.30", "", {}, "sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.2", "", { "os": "android", "cpu": "arm64" }, "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.46.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.46.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.46.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.46.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.46.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.46.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.46.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.46.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.2", "", { "os": "win32", "cpu": "x64" }, "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], + + "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], + + "@types/react": ["@types/react@19.1.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg=="], + + "@types/react-dom": ["@types/react-dom@19.1.7", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw=="], + + "@types/react-transition-group": ["@types/react-transition-group@4.4.12", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.39.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.39.1", "@typescript-eslint/type-utils": "8.39.1", "@typescript-eslint/utils": "8.39.1", "@typescript-eslint/visitor-keys": "8.39.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.39.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.39.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.39.1", "@typescript-eslint/types": "8.39.1", "@typescript-eslint/typescript-estree": "8.39.1", "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.39.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.39.1", "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.39.1", "", { "dependencies": { "@typescript-eslint/types": "8.39.1", "@typescript-eslint/visitor-keys": "8.39.1" } }, "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.39.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.39.1", "", { "dependencies": { "@typescript-eslint/types": "8.39.1", "@typescript-eslint/typescript-estree": "8.39.1", "@typescript-eslint/utils": "8.39.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.39.1", "", {}, "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.39.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.39.1", "@typescript-eslint/tsconfig-utils": "8.39.1", "@typescript-eslint/types": "8.39.1", "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.39.1", "@typescript-eslint/types": "8.39.1", "@typescript-eslint/typescript-estree": "8.39.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.39.1", "", { "dependencies": { "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@5.0.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.30", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.25.2", "", { "dependencies": { "caniuse-lite": "^1.0.30001733", "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001734", "", {}, "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.200", "", {}, "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.33.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.33.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "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.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "form-data": ["form-data@4.0.4", "", { "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" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + + "react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], + + "react-is": ["react-is@19.1.1", "", {}, "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.46.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", "@rollup/rollup-darwin-arm64": "4.46.2", "@rollup/rollup-darwin-x64": "4.46.2", "@rollup/rollup-freebsd-arm64": "4.46.2", "@rollup/rollup-freebsd-x64": "4.46.2", "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", "@rollup/rollup-linux-arm-musleabihf": "4.46.2", "@rollup/rollup-linux-arm64-gnu": "4.46.2", "@rollup/rollup-linux-arm64-musl": "4.46.2", "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", "@rollup/rollup-linux-ppc64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-musl": "4.46.2", "@rollup/rollup-linux-s390x-gnu": "4.46.2", "@rollup/rollup-linux-x64-gnu": "4.46.2", "@rollup/rollup-linux-x64-musl": "4.46.2", "@rollup/rollup-win32-arm64-msvc": "4.46.2", "@rollup/rollup-win32-ia32-msvc": "4.46.2", "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typescript-eslint": ["typescript-eslint@8.39.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.39.1", "@typescript-eslint/parser": "8.39.1", "@typescript-eslint/typescript-estree": "8.39.1", "@typescript-eslint/utils": "8.39.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "vite": ["vite@7.1.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zustand": ["zustand@5.0.7", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-Ot6uqHDW/O2VdYsKLLU8GQu8sCOM1LcoE8RwvLv9uuRT9s6SOHCKs0ZEOhxg+I1Ld+A1Q5lwx+UlKXXUoCZITg=="], + + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/client/eslint.config.js b/client/eslint.config.js new file mode 100644 index 0000000..d94e7de --- /dev/null +++ b/client/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 { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..65cff94 --- /dev/null +++ b/client/package.json @@ -0,0 +1,34 @@ +{ + "name": "cli", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^7.3.1", + "axios": "^1.11.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "zustand": "^5.0.7" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/client/public/android-chrome-192x192.png b/client/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c5aaaa76b427904569cdb4600dbac8715437c792 GIT binary patch literal 16139 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 literal 0 HcmV?d00001 diff --git a/client/public/android-chrome-512x512.png b/client/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..9ecb1725c21d307cd976fa6fd3e668afabad6304 GIT binary patch literal 40661 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 literal 0 HcmV?d00001 diff --git a/client/public/apple-touch-icon.png b/client/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4773681e31c333792c645a5bdc083da7df5e4a67 GIT binary patch literal 14708 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 literal 0 HcmV?d00001 diff --git a/client/public/favicon-16x16.png b/client/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bca88019c6486d5584585d6b39f0598e54b3c389 GIT binary patch literal 665 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 VvO|}mWBmXC002ovPDHLkV1f_gOLYJM literal 0 HcmV?d00001 diff --git a/client/public/favicon.ico b/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0230c06cf995f8cab065985b638aa1f6e4d19119 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/client/public/favicon_SETUP.md b/client/public/favicon_SETUP.md new file mode 100644 index 0000000..eed3bfd --- /dev/null +++ b/client/public/favicon_SETUP.md @@ -0,0 +1,38 @@ +# Favicon SETUP + +1. Go to [https://favicon.io](https://favicon.io) +2. Generate an icon pack +3. Drop all images in `/client/public/` +4. And configure these 2 files: + +### manifest.json: + +``` +"icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src":"android-chrome-192x192.png", + "sizes":"192x192", + "type":"image/png" + }, + { + "src":"android-chrome-512x512.png", + "sizes":"512x512", + "type":"image/png" + } +], +``` + +### index.html: + +``` + + + + + +``` diff --git a/client/public/index.html b/client/public/index.html new file mode 100644 index 0000000..1b06fb5 --- /dev/null +++ b/client/public/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + Web App + + + +

+ + diff --git a/client/public/manifest.json b/client/public/manifest.json new file mode 100644 index 0000000..55184d5 --- /dev/null +++ b/client/public/manifest.json @@ -0,0 +1,30 @@ +{ + "name": "Web Application", + "short_name": "Web App", + "description": "An awesome web application!", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff", + "developer": { + "name": "", + "url": "" + } +} diff --git a/client/public/robots.txt b/client/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/client/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/@types/index.ts b/client/src/@types/index.ts new file mode 100644 index 0000000..cc031ac --- /dev/null +++ b/client/src/@types/index.ts @@ -0,0 +1,10 @@ +export interface Account { + username: string + password: string + role: 'user' | 'admin' +} + +export interface FormData { + username: Account['username'] + password: Account['password'] +} diff --git a/client/src/App.css b/client/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/client/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..49c450a --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,43 @@ +import React, { Fragment } from 'react' +import { useAuth } from './contexts/AuthContext' +import AuthModal from './components/AuthModal' +import Header from './components/Header' +import logo from './assets/react.svg' +import './styles/ReactWelcome.css' + +const App = () => { + return ( +
+
+ + + +
+ ) +} + +const ReactWelcome = () => { + return ( + + logo +

+ Edit src/App.tsx and save to reload. +

+
+ Learn React + + + ) +} + +const LoggedInStatus = () => { + const { isLoggedIn, account } = useAuth() + + if (isLoggedIn && !!account) { + return

Hey, {account.username}! I'm happy to let you know: you are authenticated!

+ } + + return

Don't forget to start your backend server, and then authenticate yourself.

+} + +export default App diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg new file mode 100644 index 0000000..9dfc1c0 --- /dev/null +++ b/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/components/AuthModal.tsx b/client/src/components/AuthModal.tsx new file mode 100644 index 0000000..52f3a5c --- /dev/null +++ b/client/src/components/AuthModal.tsx @@ -0,0 +1,92 @@ +import React, { type ChangeEventHandler, Fragment, useState } from 'react' +import { useModalStore } from '../store/useModalStore' +import { useAuth } from '../contexts/AuthContext' +import { Dialog, DialogTitle, TextField, Button, CircularProgress } from '@mui/material' +import { type FormData } from '../@types' + +interface Props {} + +const AuthModal: React.FC = () => { + const { login, register } = useAuth() + const { currentModal, setCurrentModal } = useModalStore() + + const isRegisterMode = currentModal === 'REGISTER' + const isOpen = ['AUTH', 'LOGIN', 'REGISTER'].includes(currentModal) + const onClose = () => setCurrentModal('') + + const [formData, setFormData] = useState({ username: '', password: '' }) + const [loading, setLoading] = useState(false) + const [error, setError] = useState('') + + const handleChange: ChangeEventHandler = (e) => { + const { name, value } = e.target + setFormData((prev) => ({ ...prev, [name]: value })) + } + + const clickSubmit = async () => { + setLoading(true) + setError('') + + try { + isRegisterMode ? await register(formData) : await login(formData) + onClose() + } catch (error: any) { + setError(typeof error === 'string' ? error : JSON.stringify(error)) + } + + setLoading(false) + } + + const isSubmitButtonDisabled = !formData['username'] || !formData['password'] + + return ( + + {isRegisterMode ? Create a new account : Login to your account} + + + + + {error && {error}} + + {loading ? ( +
+ +
+ ) : isRegisterMode ? ( + + + + + ) : ( + + + + + )} +
+ ) +} + +export default AuthModal diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx new file mode 100644 index 0000000..9deee85 --- /dev/null +++ b/client/src/components/Header.tsx @@ -0,0 +1,70 @@ +import React, { Fragment, type MouseEventHandler, useState } from 'react' +import { useModalStore } from '../store/useModalStore' +import { useAuth } from '../contexts/AuthContext' +import OnlineIndicator from '../components/OnlineIndicator' +import { AppBar, IconButton, Avatar, Popover, List, ListSubheader, ListItemButton } from '@mui/material' + +interface Props {} + +const Header: React.FC = () => { + const { isLoggedIn, account, logout } = useAuth() + const { setCurrentModal } = useModalStore() + + const [anchorEl, setAnchorEl] = useState<(EventTarget & HTMLButtonElement) | null>(null) + const [popover, setPopover] = useState(false) + + const openPopover: MouseEventHandler = (e) => { + setPopover(true) + setAnchorEl(e.currentTarget) + } + + const closePopover = () => { + setPopover(false) + setAnchorEl(null) + } + + const clickLogin = () => { + setCurrentModal('LOGIN') + closePopover() + } + + const clickRegister = () => { + setCurrentModal('REGISTER') + closePopover() + } + + return ( + +

Web App

+ + + + + + + + + + Hello, {account?.username || 'Guest'} + + {isLoggedIn ? ( + Logout + ) : ( + + Login + Register + + )} + + +
+ ) +} + +export default Header diff --git a/client/src/components/OnlineIndicator.tsx b/client/src/components/OnlineIndicator.tsx new file mode 100644 index 0000000..a558382 --- /dev/null +++ b/client/src/components/OnlineIndicator.tsx @@ -0,0 +1,64 @@ +import React from 'react' +import { styled } from '@mui/material/styles' +import { Badge, Avatar } from '@mui/material' + +const StyledBadge = styled(Badge)(({ theme }) => ({ + '& .MuiBadge-badge': { + backgroundColor: 'black', + color: 'black', + boxShadow: `0 0 0 2px ${theme.palette.background.paper}`, + '&::after': { + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: '100%', + borderRadius: '50%', + animation: 'ripple 1.2s infinite ease-in-out', + border: '1px solid currentColor', + content: '""', + }, + }, + '@keyframes ripple': { + '0%': { + transform: 'scale(.8)', + opacity: 1, + }, + '100%': { + transform: 'scale(2.4)', + opacity: 0, + }, + }, +})) + +const OnlineBadge = styled(StyledBadge)({ + '& .MuiBadge-badge': { + backgroundColor: 'var(--online)', + color: 'var(--online)', + }, +}) + +const OfflineBadge = styled(StyledBadge)({ + '& .MuiBadge-badge': { + backgroundColor: 'var(--offline)', + color: 'var(--offline)', + }, +}) + +const OnlineIndicator = ({ online = false, children = }) => { + if (online) { + return ( + + {children} + + ) + } + + return ( + + {children} + + ) +} + +export default OnlineIndicator diff --git a/client/src/constants/index.ts b/client/src/constants/index.ts new file mode 100644 index 0000000..c42d7e6 --- /dev/null +++ b/client/src/constants/index.ts @@ -0,0 +1,4 @@ +// api url (where your server is hosted at) +const BACKEND_URL = import.meta.VITE_BACKEND_URL || 'http://localhost:8080' + +export { BACKEND_URL } diff --git a/client/src/contexts/AuthContext.tsx b/client/src/contexts/AuthContext.tsx new file mode 100644 index 0000000..feb8671 --- /dev/null +++ b/client/src/contexts/AuthContext.tsx @@ -0,0 +1,113 @@ +import React, { createContext, useContext, useState, useEffect, type PropsWithChildren, useMemo } from 'react' +import axios from '../utils/axios' +import { type FormData, type Account } from '@types' + +interface Context { + token: string | null + account: Account | null + isLoggedIn: boolean + register: (payload: FormData) => Promise + login: (payload: FormData) => Promise + logout: () => void +} + +const initContext: Context = { + token: null, + account: null, + isLoggedIn: false, + register: async () => {}, + login: async () => {}, + logout: () => {}, +} + +// init context +const AuthContext = createContext(initContext) +const { Provider } = AuthContext + +// export the consumer +export const useAuth = () => useContext(AuthContext) + +// export the provider +export const AuthProvider = ({ children }: PropsWithChildren) => { + const [token, setToken] = useState(localStorage.getItem('token') || initContext.token) + const [account, setAccount] = useState(initContext.account) + const [isLoggedIn, setIsLoggedIn] = useState(initContext.isLoggedIn) + + const register = (formData: FormData) => { + return new Promise((resolve, reject) => { + axios + .post('/auth/register', formData) + .then(({ data: { data: accountData, token: accessToken } }) => { + setAccount(accountData) + setToken(accessToken) + setIsLoggedIn(true) + resolve(true) + }) + .catch((error) => { + reject(error?.response?.data?.message || error.message) + }) + }) + } + + const login = (formData: FormData) => { + return new Promise((resolve, reject) => { + axios + .post('/auth/login', formData) + .then(({ data: { data: accountData, token: accessToken } }) => { + setAccount(accountData) + setToken(accessToken) + setIsLoggedIn(true) + resolve(true) + }) + .catch((error) => { + reject(error?.response?.data?.message || error.message) + }) + }) + } + + const logout = () => { + setIsLoggedIn(false) + setAccount(null) + setToken(null) + } + + const loginWithToken = async () => { + try { + const { + data: { data: accountData, token: accessToken }, + } = await axios.get('/auth/login', { + headers: { + authorization: `Bearer ${token}`, + }, + }) + + setAccount(accountData) + setToken(accessToken) + setIsLoggedIn(true) + } catch (error: any) { + console.error(error) + if (error?.response?.statusCode === 401) setToken(null) + } + } + + // This side effect keeps local storage updated with recent token value, + // making sure it can be re-used upon refresh or re-open browser + useEffect(() => { + if (token) { + localStorage.setItem('token', token) + } else { + localStorage.removeItem('token') + } + }, [token]) + + // This side effect runs only if we have a token, but no account or logged-in boolean. + // This "if" statement is "true" only when refreshed, or re-opened the browser, + // if true, it will then ask the backend for the account information (and will get them if the token hasn't expired) + useEffect(() => { + if (!isLoggedIn && !account && token) loginWithToken() + }, [isLoggedIn, account, token]) // eslint-disable-line react-hooks/exhaustive-deps + + const value = useMemo(() => ({ token, account, isLoggedIn, register, login, logout }), [token, account, isLoggedIn]) + + return {children} +} diff --git a/client/src/functions/get-query-payload.ts b/client/src/functions/get-query-payload.ts new file mode 100644 index 0000000..ceaa36f --- /dev/null +++ b/client/src/functions/get-query-payload.ts @@ -0,0 +1,19 @@ +const getQueryPayload = (queryStr?: string) => { + if (!queryStr) { + console.warn('query string is not defined') + return {} + } + + const queryObj: Record = {} + const queryArr = (queryStr[0] === '?' ? queryStr.substring(1, queryStr.length) : queryStr).split('&') + + queryArr.forEach((str) => { + const [key, val] = str.split('=') + + queryObj[key] = val + }) + + return queryObj +} + +export default getQueryPayload diff --git a/client/src/functions/get-token-payload.ts b/client/src/functions/get-token-payload.ts new file mode 100644 index 0000000..e031acc --- /dev/null +++ b/client/src/functions/get-token-payload.ts @@ -0,0 +1,13 @@ +const getTokenPayload = (token?: string) => { + if (!token) { + console.warn('token is not defined') + return {} + } + + const informativePart = token.split('.')[1] + const payload = JSON.parse(window.atob(informativePart)) + + return payload +} + +export default getTokenPayload diff --git a/client/src/hooks/useLocalStorage.ts b/client/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..40e8813 --- /dev/null +++ b/client/src/hooks/useLocalStorage.ts @@ -0,0 +1,42 @@ +import { useState, useEffect } from 'react' + +/* + +How to use this hook: +import useLocalStorage from './hooks/useLocalStorage'; + +function App() { + const [example, setExample] = useLocalStorage('example_key', { example: 'anything as default' }); + + return (); +}; + +*/ + +const getLsVal = (key: string, defaultValue: any) => { + const storedStr = localStorage.getItem(key) || '' + + if (!!storedStr) { + return JSON.parse(storedStr) + } else { + return defaultValue + } +} + +const setLsVal = (key: string, value: any) => { + if (value !== undefined && value !== null) { + const str = JSON.stringify(value) + + localStorage.setItem(key, str) + } +} + +const useLocalStorage = (key: string, defaultValue: any = null) => { + const [value, setValue] = useState(getLsVal(key, defaultValue)) + + useEffect(() => setLsVal(key, value), [key, value]) + + return [value, setValue] +} + +export default useLocalStorage diff --git a/client/src/hooks/useMediaQuery.Ts b/client/src/hooks/useMediaQuery.Ts new file mode 100644 index 0000000..89d1781 --- /dev/null +++ b/client/src/hooks/useMediaQuery.Ts @@ -0,0 +1,30 @@ +import { useState, useEffect } from 'react' + +/* + +How to use this hook: +import useMediaQuery from './hooks/useMediaQuery'; + +function App() { + const isMobile = useMediaQuery('(max-width: 768px)'); + + return (); +}; + +*/ + +const useMediaQuery = (query: string = '(max-width: 768px)') => { + const [matches, setMatches] = useState(window.matchMedia(query).matches) + + useEffect(() => { + const media = window.matchMedia(query) + const listener = () => setMatches(media.matches) + + media.addListener(listener) + return () => media.removeListener(listener) + }, [query]) + + return matches +} + +export default useMediaQuery diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..08a3ac9 --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/client/src/main.tsx b/client/src/main.tsx new file mode 100644 index 0000000..d905e07 --- /dev/null +++ b/client/src/main.tsx @@ -0,0 +1,18 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import CssBaseline from '@mui/material/CssBaseline' +import { AuthProvider } from './contexts/AuthContext' +import App from './App' +import './styles/index.css' + +const element = document.getElementById('root') as HTMLElement +const root = ReactDOM.createRoot(element) + +root.render( + + + + + + +) diff --git a/client/src/store/useModalStore.ts b/client/src/store/useModalStore.ts new file mode 100644 index 0000000..ab806d5 --- /dev/null +++ b/client/src/store/useModalStore.ts @@ -0,0 +1,11 @@ +import { create } from 'zustand' + +interface StoreState { + currentModal: string + setCurrentModal: (str: string) => void +} + +export const useModalStore = create((set) => ({ + currentModal: '', + setCurrentModal: (str) => set({ currentModal: str }), +})) diff --git a/client/src/styles/ReactWelcome.css b/client/src/styles/ReactWelcome.css new file mode 100644 index 0000000..0d69430 --- /dev/null +++ b/client/src/styles/ReactWelcome.css @@ -0,0 +1,23 @@ +.ReactWelcome-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .ReactWelcome-logo { + animation: ReactWelcome-logo-spin infinite 20s linear; + } +} + +.ReactWelcome-link { + color: #61dafb; +} + +@keyframes ReactWelcome-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/client/src/styles/index.css b/client/src/styles/index.css new file mode 100644 index 0000000..a740d5b --- /dev/null +++ b/client/src/styles/index.css @@ -0,0 +1,63 @@ +:root { + --online: #44b700; + --offline: #b74400; +} + +body { + margin: 0; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} + +.App { + width: 100vw; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; +} + +.header { + width: 100% !important; + padding: 0 1rem !important; + background-color: whitesmoke !important; + color: black !important; + + display: flex !important; + flex-direction: row !important; + align-items: center !important; + justify-content: space-between !important; +} + +.error { + margin: 0.5rem; + color: red; + text-align: center; +} + +/* + Extra Small Devices, Phones + @media only screen and (min-width: 480px) {} +*/ + +/* + Small Devices, Tablets + @media only screen and (min-width: 768px) {} +*/ + +/* + Medium Devices, Desktops + @media only screen and (min-width: 992px) {} +*/ + +/* + Large Devices, Wide Screens + @media only screen and (min-width: 1200px) {} +*/ diff --git a/client/src/utils/axios.ts b/client/src/utils/axios.ts new file mode 100644 index 0000000..507ffb0 --- /dev/null +++ b/client/src/utils/axios.ts @@ -0,0 +1,8 @@ +import Axios from 'axios' +import { BACKEND_URL } from '../constants' + +const axios = Axios.create({ + baseURL: BACKEND_URL, +}) + +export default axios diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json new file mode 100644 index 0000000..227a6c6 --- /dev/null +++ b/client/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..8083fb0 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "es5", // Specify ECMAScript target version + "lib": ["dom", "dom.iterable", "esnext"], // List of library files to be included in the compilation + "allowJs": true, // Allow JavaScript files to be compiled + "skipLibCheck": true, // Skip type checking of all declaration files + "esModuleInterop": true, // Disables namespace imports (import * as fs from "fs") and enables CJS/AMD/UMD style imports (import fs from "fs") + "allowSyntheticDefaultImports": true, // Allow default imports from modules with no default export + "strict": true, // Enable all strict type checking options + "forceConsistentCasingInFileNames": true, // Disallow inconsistently-cased references to the same file. + "module": "esnext", // Specify module code generation + "moduleResolution": "node", // Resolve modules using Node.js style + "isolatedModules": true, // Unconditionally emit imports for unresolved files + "resolveJsonModule": true, // Include modules imported with .json extension + "noEmit": true, // Do not emit output (meaning do not compile code, only perform type checking) + "jsx": "react", // Support JSX in .tsx files + "sourceMap": true, // Generate corrresponding .map file + "declaration": true, // Generate corresponding .d.ts file + "noUnusedLocals": true, // Report errors on unused locals + "noUnusedParameters": true, // Report errors on unused parameters + "incremental": true, // Enable incremental compilation by reading/writing information from prior compilations to a file on disk + "noFallthroughCasesInSwitch": true, // Report errors for fallthrough cases in switch statement + "baseUrl": "src" + }, + "include": ["src"], + "exclude": ["node_modules", "build"], + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..f85a399 --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/makefile b/makefile new file mode 100644 index 0000000..d70dad6 --- /dev/null +++ b/makefile @@ -0,0 +1,11 @@ +## +# Project Title +# +# @file +# @version 0.1 + +run: + bunx concurrently "cd client && bun run dev" "cd server && bun run dev" + + +# end diff --git a/package.json b/package.json new file mode 100644 index 0000000..75dd414 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "mern-application", + "version": "0.1.0", + "private": true, + "homepage": "/", + "author": "Ben Elferink (https://github.com/BenElferink)", + "repository": { + "type": "git", + "url": "https://github.com/BenElferink/mern-template.git" + }, + "bugs": { + "url": "https://github.com/BenElferink/mern-template/issues", + "email": "ben.elferink@icloud.com" + }, + "scripts": {} +} diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000..10158ba --- /dev/null +++ b/server/.env.example @@ -0,0 +1,3 @@ +PORT = "" +MONGO_URI = "" +JWT_SECRET = "" \ No newline at end of file diff --git a/server/bun.lock b/server/bun.lock new file mode 100644 index 0000000..eabfde3 --- /dev/null +++ b/server/bun.lock @@ -0,0 +1,428 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "server", + "dependencies": { + "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "joi": "^17.13.3", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.15.1", + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/jsonwebtoken": "^9.0.9", + "@types/node": "^22.13.12", + "typescript": "^5.8.2", + }, + }, + }, + "packages": { + "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], + + "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@1.0.11", "", { "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ=="], + + "@mongodb-js/saslprep": ["@mongodb-js/saslprep@1.2.2", "", { "dependencies": { "sparse-bitfield": "^3.0.3" } }, "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA=="], + + "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], + + "@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="], + + "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], + + "@types/bcrypt": ["@types/bcrypt@5.0.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ=="], + + "@types/body-parser": ["@types/body-parser@1.19.5", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + + "@types/express": ["@types/express@5.0.3", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.0.2", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg=="], + + "@types/http-errors": ["@types/http-errors@2.0.4", "", {}, "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="], + + "@types/jsonwebtoken": ["@types/jsonwebtoken@9.0.10", "", { "dependencies": { "@types/ms": "*", "@types/node": "*" } }, "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.17.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA=="], + + "@types/qs": ["@types/qs@6.9.17", "", {}, "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/send": ["@types/send@0.17.4", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA=="], + + "@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="], + + "@types/webidl-conversions": ["@types/webidl-conversions@7.0.3", "", {}, "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="], + + "@types/whatwg-url": ["@types/whatwg-url@11.0.5", "", { "dependencies": { "@types/webidl-conversions": "*" } }, "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ=="], + + "abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "aproba": ["aproba@2.0.0", "", {}, "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="], + + "are-we-there-yet": ["are-we-there-yet@2.0.0", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bcrypt": ["bcrypt@5.1.1", "", { "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", "node-addon-api": "^5.0.0" } }, "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww=="], + + "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "bson": ["bson@6.10.4", "", {}, "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], + + "call-bound": ["call-bound@1.0.2", "", { "dependencies": { "call-bind": "^1.0.8", "get-intrinsic": "^1.2.5" } }, "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg=="], + + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "color-support": ["color-support@1.1.3", "", { "bin": "bin.js" }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + + "dunder-proto": ["dunder-proto@1.0.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gauge": ["gauge@3.0.2", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", "object-assign": "^4.1.1", "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.2" } }, "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q=="], + + "get-intrinsic": ["get-intrinsic@1.2.6", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "dunder-proto": "^1.0.0", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.0.0" } }, "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], + + "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="], + + "jwa": ["jwa@1.4.1", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA=="], + + "jws": ["jws@3.2.2", "", { "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA=="], + + "kareem": ["kareem@2.6.3", "", {}, "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q=="], + + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], + + "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], + + "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], + + "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], + + "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "math-intrinsics": ["math-intrinsics@1.0.0", "", {}, "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "memory-pager": ["memory-pager@1.5.0", "", {}, "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "mime": ["mime@1.6.0", "", { "bin": "cli.js" }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": "bin/cmd.js" }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mongodb": ["mongodb@6.18.0", "", { "dependencies": { "@mongodb-js/saslprep": "^1.1.9", "bson": "^6.10.4", "mongodb-connection-string-url": "^3.0.0" }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", "snappy": "^7.2.2", "socks": "^2.7.1" }, "optionalPeers": ["@aws-sdk/credential-providers", "@mongodb-js/zstd", "gcp-metadata", "kerberos", "mongodb-client-encryption", "snappy", "socks"] }, "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ=="], + + "mongodb-connection-string-url": ["mongodb-connection-string-url@3.0.2", "", { "dependencies": { "@types/whatwg-url": "^11.0.2", "whatwg-url": "^14.1.0 || ^13.0.0" } }, "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA=="], + + "mongoose": ["mongoose@8.17.1", "", { "dependencies": { "bson": "^6.10.4", "kareem": "2.6.3", "mongodb": "~6.18.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", "sift": "17.1.3" } }, "sha512-aodS4cacux5caoxB5ErEwRmrafIUsVRJxHnvP7URnSUnTenr32j1qBVV+KjYxryyLSisQkxglAFF69TNLeZTLg=="], + + "mpath": ["mpath@0.9.0", "", {}, "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="], + + "mquery": ["mquery@5.0.0", "", { "dependencies": { "debug": "4.x" } }, "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "node-addon-api": ["node-addon-api@5.1.0", "", {}, "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": "bin/nopt.js" }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="], + + "npmlog": ["npmlog@5.0.1", "", { "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", "gauge": "^3.0.0", "set-blocking": "^2.0.0" } }, "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.3", "", {}, "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": "bin.js" }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "sift": ["sift@17.1.3", "", {}, "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sparse-bitfield": ["sparse-bitfield@3.0.3", "", { "dependencies": { "memory-pager": "^1.0.2" } }, "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "@types/bcrypt/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "@types/body-parser/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "@types/connect/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "@types/express-serve-static-core/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "@types/send/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "@types/serve-static/@types/node": ["@types/node@22.13.12", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A=="], + + "agent-base/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "https-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "make-dir/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "mongodb-connection-string-url/whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], + + "mongoose/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mquery/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "@types/bcrypt/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "@types/body-parser/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "@types/connect/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "@types/express-serve-static-core/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "@types/send/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "@types/serve-static/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "agent-base/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mongodb-connection-string-url/whatwg-url/tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], + + "mongodb-connection-string-url/whatwg-url/webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], + + "mquery/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + } +} diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..7df69bd --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2101 @@ +{ + "name": "server", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "server", + "version": "0.1.0", + "dependencies": { + "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "joi": "^17.13.3", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.15.1" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/jsonwebtoken": "^9.0.9", + "@types/node": "^22.13.12", + "typescript": "^5.8.2" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", + "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", + "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz", + "integrity": "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bson": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "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/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", + "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", + "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.3", + "kareem": "2.6.3", + "mongodb": "~6.16.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..ef2f9e5 --- /dev/null +++ b/server/package.json @@ -0,0 +1,29 @@ +{ + "name": "server", + "version": "0.1.0", + "private": true, + "type": "commonjs", + "main": "src/index.ts", + "scripts": { + "dev": "bunx tsx watch src/index.ts", + "build": "rm -rf dist && npx tsc", + "start": "node dist/index.js" + }, + "dependencies": { + "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.6.1", + "express": "^4.21.2", + "joi": "^17.13.3", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.17.1" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^22.17.1", + "typescript": "^5.9.2" + } +} diff --git a/server/src/@types/express.d.ts b/server/src/@types/express.d.ts new file mode 100644 index 0000000..43400b7 --- /dev/null +++ b/server/src/@types/express.d.ts @@ -0,0 +1,10 @@ +import 'express' +import jwt from 'jsonwebtoken' + +declare global { + namespace Express { + interface Request { + auth?: jwt.JwtPayload // { uid: string; role: string } + } + } +} diff --git a/server/src/@types/index.ts b/server/src/@types/index.ts new file mode 100644 index 0000000..5d19656 --- /dev/null +++ b/server/src/@types/index.ts @@ -0,0 +1,5 @@ +export interface Account { + username: string + password: string + role: 'user' | 'admin' +} diff --git a/server/src/constants/index.ts b/server/src/constants/index.ts new file mode 100644 index 0000000..f7cfaf1 --- /dev/null +++ b/server/src/constants/index.ts @@ -0,0 +1,11 @@ +const ORIGIN = '*' +const PORT = process.env.PORT || 8080 + +// For "MongoDB Atlas": edit MONGO_URI in -> .env file +// For "MongoDB Community Server": edit in -> MONGO_URI below +const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017/' +const MONGO_OPTIONS = {} + +const JWT_SECRET = process.env.JWT_SECRET || 'unsafe_secret' + +export { ORIGIN, PORT, MONGO_URI, MONGO_OPTIONS, JWT_SECRET } diff --git a/server/src/controllers/auth/login-with-token.ts b/server/src/controllers/auth/login-with-token.ts new file mode 100644 index 0000000..f48f3e4 --- /dev/null +++ b/server/src/controllers/auth/login-with-token.ts @@ -0,0 +1,32 @@ +import { type RequestHandler } from 'express' +import jwt from '../../utils/jwt' +import Account from '../../models/Account' + +const loginWithToken: RequestHandler = async (req, res, next) => { + try { + const { uid } = req.auth || {} + + // Get account from DB, password is not verified because we're already token-authorized at this point + const account = await Account.findOne({ _id: uid }).select('-password') + + if (!account) { + return next({ + statusCode: 400, + message: 'Bad credentials', + }) + } + + // Generate access token + const token = jwt.signToken({ uid: account._id, role: account.role }) + + res.status(200).json({ + message: 'Succesfully got account', + data: account, + token, + }) + } catch (error) { + next(error) + } +} + +export default loginWithToken diff --git a/server/src/controllers/auth/login.ts b/server/src/controllers/auth/login.ts new file mode 100644 index 0000000..db97176 --- /dev/null +++ b/server/src/controllers/auth/login.ts @@ -0,0 +1,59 @@ +import { type RequestHandler } from 'express' +import joi from '../../utils/joi' +import jwt from '../../utils/jwt' +import crypt from '../../utils/crypt' +import Account from '../../models/Account' + +const login: RequestHandler = async (req, res, next) => { + try { + const validationError = await joi.validate( + { + username: joi.instance.string().required(), + password: joi.instance.string().required(), + }, + req.body + ) + + if (validationError) { + return next(validationError) + } + + const { username, password } = req.body + + // Get account from DB, and verify existance + const account = await Account.findOne({ username }) + + if (!account) { + return next({ + statusCode: 400, + message: 'Bad credentials', + }) + } + + // Verify password hash + const passOk = crypt.validate(password, account.password) + + if (!passOk) { + return next({ + statusCode: 400, + message: 'Bad credentials', + }) + } + + // Generate access token + const token = jwt.signToken({ uid: account._id, role: account.role }) + + // Remove password from response data + const { password: _, ...accountData } = account.toObject() + + res.status(200).json({ + message: 'Succesfully logged-in', + data: accountData, + token, + }) + } catch (error) { + next(error) + } +} + +export default login diff --git a/server/src/controllers/auth/register.ts b/server/src/controllers/auth/register.ts new file mode 100644 index 0000000..b261535 --- /dev/null +++ b/server/src/controllers/auth/register.ts @@ -0,0 +1,55 @@ +import { type RequestHandler } from 'express' +import joi from '../../utils/joi' +import jwt from '../../utils/jwt' +import crypt from '../../utils/crypt' +import Account from '../../models/Account' + +const register: RequestHandler = async (req, res, next) => { + try { + const validationError = await joi.validate( + { + username: joi.instance.string().required(), + password: joi.instance.string().required(), + }, + req.body + ) + + if (validationError) { + return next(validationError) + } + + const { username, password } = req.body + // Verify account username as unique + const found = await Account.findOne({ username }) + + if (found) { + return next({ + statusCode: 400, + message: 'An account already exists with that "username"', + }) + } + + // Encrypt password + const hash = await crypt.hash(password) + + // Create account + const account = new Account({ username, password: hash }) + await account.save() + + // Generate access token + const token = jwt.signToken({ uid: account._id, role: account.role }) + + // Exclude password from response + const { password: _, ...data } = account.toObject() + + res.status(201).json({ + message: 'Succesfully registered', + data, + token, + }) + } catch (error) { + next(error) + } +} + +export default register diff --git a/server/src/index.ts b/server/src/index.ts new file mode 100644 index 0000000..181f6ec --- /dev/null +++ b/server/src/index.ts @@ -0,0 +1,28 @@ +import dotenv from 'dotenv' +dotenv.config() + +import app from './utils/app' // (server) +import mongo from './utils/mongo' // (database) +import { PORT } from './constants/index' +import authRoutes from './routes/auth' + +const bootstrap = async () => { + await mongo.connect() + + app.get('/', (req, res) => { + res.status(200).send('Hello, world!') + }) + + app.get('/healthz', (req, res) => { + res.status(204).end() + }) + + app.use('/auth', authRoutes) + // add rest of routes here... + + app.listen(PORT, () => { + console.log(`✅ Server is listening on port: ${PORT}`) + }) +} + +bootstrap() diff --git a/server/src/middlewares/check-bearer-token.ts b/server/src/middlewares/check-bearer-token.ts new file mode 100644 index 0000000..43f55ec --- /dev/null +++ b/server/src/middlewares/check-bearer-token.ts @@ -0,0 +1,35 @@ +import { type RequestHandler } from 'express' +import jwt from '../utils/jwt' + +const checkBearerToken: RequestHandler = (req, res, next) => { + try { + const token = req.headers.authorization?.split(' ')[1] + + if (!token) { + return next({ + statusCode: 400, + message: 'Token not provided', + }) + } + + const auth = jwt.verifyToken(token) + + if (!auth) { + return next({ + statusCode: 401, + message: 'Invalid token', + }) + } + + req.auth = typeof auth === 'string' ? JSON.parse(auth) : auth + + next() + } catch (error) { + next({ + statusCode: 401, + message: 'Invalid token', + }) + } +} + +export default checkBearerToken diff --git a/server/src/middlewares/error-handler.ts b/server/src/middlewares/error-handler.ts new file mode 100644 index 0000000..c3ccc44 --- /dev/null +++ b/server/src/middlewares/error-handler.ts @@ -0,0 +1,12 @@ +import { type NextFunction, type Request, type Response } from 'express' + +const errorHandler = (error: any, req: Request, res: Response, next: NextFunction) => { + const { statusCode = 500, message = 'Internal server error', ...rest } = error + + res.status(statusCode).json({ + message, + ...rest, + }) +} + +export default errorHandler diff --git a/server/src/models/Account.ts b/server/src/models/Account.ts new file mode 100644 index 0000000..7b4063d --- /dev/null +++ b/server/src/models/Account.ts @@ -0,0 +1,39 @@ +import { type Document, model, Schema } from 'mongoose' +import { type Account } from '../@types' + +interface I extends Document, Account {} + +const instance = new Schema( + { + /* + document ID is set by default via MongoDB - the next line is deprecated! + _id: mongoose.Schema.Types.ObjectId, + */ + + username: { + type: String, + required: true, + lowercase: true, + unique: true, + }, + password: { + type: String, + required: true, + }, + role: { + type: String, + required: true, + enum: ['user', 'admin'], + default: 'user', + }, + }, + { + timestamps: true, + } +) + +// NOTE! use a singular model name, mongoose automatically creates a collection like so: +// model: 'Account' === collection: 'accounts' +const modelName = 'Account' + +export default model(modelName, instance) diff --git a/server/src/routes/auth.ts b/server/src/routes/auth.ts new file mode 100644 index 0000000..04d3299 --- /dev/null +++ b/server/src/routes/auth.ts @@ -0,0 +1,20 @@ +import express from 'express' +import checkBearerToken from '../middlewares/check-bearer-token' +import errorHandler from '../middlewares/error-handler' +import register from '../controllers/auth/register' +import login from '../controllers/auth/login' +import loginWithToken from '../controllers/auth/login-with-token' + +// initialize router +const router = express.Router() + +// POST at route: http://localhost:8080/auth/register +router.post('/register', [], register, errorHandler) + +// POST at path: http://localhost:8080/auth/login +router.post('/login', [], login, errorHandler) + +// GET at path: http://localhost:8080/auth/account +router.get('/login', [checkBearerToken], loginWithToken, errorHandler) + +export default router diff --git a/server/src/utils/app.ts b/server/src/utils/app.ts new file mode 100644 index 0000000..160b8c4 --- /dev/null +++ b/server/src/utils/app.ts @@ -0,0 +1,13 @@ +import express from 'express' +import cors from 'cors' +import { ORIGIN } from '../constants/index' + +// initialize app +const app = express() + +// middlewares +app.use(cors({ origin: ORIGIN })) +app.use(express.json()) // body parser +app.use(express.urlencoded({ extended: false })) // url parser + +export default app diff --git a/server/src/utils/crypt.ts b/server/src/utils/crypt.ts new file mode 100644 index 0000000..edae944 --- /dev/null +++ b/server/src/utils/crypt.ts @@ -0,0 +1,22 @@ +import bcrypt from 'bcrypt' + +class Crypt { + instance: typeof bcrypt = bcrypt + + constructor() {} + + async hash(value: string) { + const salt = await this.instance.genSalt(10) + const hash = await this.instance.hash(value, salt) + + return hash + } + + async validate(value: string, hash: string) { + const isOk = await bcrypt.compare(value, hash) + + return isOk + } +} + +export default new Crypt() diff --git a/server/src/utils/joi.ts b/server/src/utils/joi.ts new file mode 100644 index 0000000..8ac38ec --- /dev/null +++ b/server/src/utils/joi.ts @@ -0,0 +1,22 @@ +import joi from 'joi' + +class Joi { + instance: typeof joi = joi + + constructor() {} + + async validate(schema: Record, body: Record) { + try { + await this.instance.object(schema).validateAsync(body) + } catch (error: any) { + console.log('❌ Joi validation error:', error.message) + + return { + statusCode: 400, + message: error.message, + } + } + } +} + +export default new Joi() diff --git a/server/src/utils/jwt.ts b/server/src/utils/jwt.ts new file mode 100644 index 0000000..8d323c9 --- /dev/null +++ b/server/src/utils/jwt.ts @@ -0,0 +1,25 @@ +import jsonwebtoken from 'jsonwebtoken' +import { JWT_SECRET } from '../constants/index' + +class JWT { + instance: typeof jsonwebtoken = jsonwebtoken + secret: string + + constructor() { + this.secret = JWT_SECRET + } + + signToken(payload: Record, expiresIn: jsonwebtoken.SignOptions['expiresIn'] = '12h') { + const token = this.instance.sign(payload, JWT_SECRET, { expiresIn }) + + return token + } + + verifyToken(token: string) { + const auth = this.instance.verify(token, JWT_SECRET) + + return auth + } +} + +export default new JWT() diff --git a/server/src/utils/mongo.ts b/server/src/utils/mongo.ts new file mode 100644 index 0000000..7da5af7 --- /dev/null +++ b/server/src/utils/mongo.ts @@ -0,0 +1,37 @@ +import mongoose from 'mongoose' +import { MONGO_URI, MONGO_OPTIONS } from '../constants/index' + +class Mongo { + instance: typeof mongoose = mongoose + mongoUri: string + mongoOptions: mongoose.ConnectOptions + isConnected: boolean + + constructor() { + this.mongoUri = MONGO_URI + this.mongoOptions = MONGO_OPTIONS + this.isConnected = false + } + + async connect() { + if (this.isConnected) return + + try { + console.log('⏳ Connecting to MongoDB') + + const db = await this.instance.connect(this.mongoUri, this.mongoOptions) + const connection = db.connection + + this.isConnected = connection.readyState === 1 + if (this.isConnected) console.log('✅ MongoDB connected') + + connection.on('connected', () => console.log('✅ MongoDB connected')) // re-connected + connection.on('disconnected', () => console.log('❌ MongoDB disconnected')) // disconnected + connection.on('error', (error) => console.log('❌ MongoDB connection error', error)) // listen for errors during the session + } catch (error: any) { + console.log('❌ MongoDB connection error:', error.message) + } + } +} + +export default new Mongo() diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..a4c4e53 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +}