From 2cc2cbb7a3618074e2cbbad9e117e5aeb5dfa1c7 Mon Sep 17 00:00:00 2001 From: anibilag Date: Thu, 28 Aug 2025 23:04:25 +0300 Subject: [PATCH] first commit --- .bolt/config.json | 3 + .bolt/prompt | 5 + .gitignore | 25 + Dockerfile.frontend | 24 + README.md | 106 + components.json | 17 + docker-compose.yml | 28 + eslint.config.js | 28 + index.html | 13 + package-lock.json | 5076 +++++++++++++++++++++++++++ package.json | 45 + postcss.config.js | 6 + server/Dockerfile | 21 + server/cashback.db | Bin 0 -> 151552 bytes server/database.js | 73 + server/index.js | 29 + server/package-lock.json | 2651 ++++++++++++++ server/package.json | 18 + server/routes/cards.js | 101 + server/routes/cashback.js | 93 + server/routes/categories.js | 99 + server/routes/monthly-categories.js | 99 + server/routes/transactions.js | 162 + src/App.tsx | 25 + src/components/Layout.tsx | 91 + src/components/ui/badge.tsx | 36 + src/components/ui/button.tsx | 56 + src/components/ui/card.tsx | 76 + src/components/ui/dialog.tsx | 120 + src/components/ui/input.tsx | 25 + src/components/ui/label.tsx | 24 + src/components/ui/select.tsx | 158 + src/components/ui/tabs.tsx | 53 + src/index.css | 66 + src/lib/api.ts | 78 + src/lib/utils.ts | 24 + src/main.tsx | 10 + src/pages/Cards.tsx | 310 ++ src/pages/Categories.tsx | 198 ++ src/pages/Dashboard.tsx | 279 ++ src/pages/Monthly.tsx | 306 ++ src/pages/Transactions.tsx | 328 ++ src/types/index.ts | 51 + src/vite-env.d.ts | 1 + tailwind.config.js | 77 + tsconfig.app.json | 24 + tsconfig.json | 7 + tsconfig.node.json | 24 + vite.config.ts | 26 + 49 files changed, 11195 insertions(+) create mode 100644 .bolt/config.json create mode 100644 .bolt/prompt create mode 100644 .gitignore create mode 100644 Dockerfile.frontend create mode 100644 README.md create mode 100644 components.json create mode 100644 docker-compose.yml create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 server/Dockerfile create mode 100644 server/cashback.db create mode 100644 server/database.js create mode 100644 server/index.js create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/routes/cards.js create mode 100644 server/routes/cashback.js create mode 100644 server/routes/categories.js create mode 100644 server/routes/monthly-categories.js create mode 100644 server/routes/transactions.js create mode 100644 src/App.tsx create mode 100644 src/components/Layout.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/index.css create mode 100644 src/lib/api.ts create mode 100644 src/lib/utils.ts create mode 100644 src/main.tsx create mode 100644 src/pages/Cards.tsx create mode 100644 src/pages/Categories.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Monthly.tsx create mode 100644 src/pages/Transactions.tsx create mode 100644 src/types/index.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.bolt/config.json b/.bolt/config.json new file mode 100644 index 0000000..6b6787d --- /dev/null +++ b/.bolt/config.json @@ -0,0 +1,3 @@ +{ + "template": "bolt-vite-react-ts" +} diff --git a/.bolt/prompt b/.bolt/prompt new file mode 100644 index 0000000..ce91b43 --- /dev/null +++ b/.bolt/prompt @@ -0,0 +1,5 @@ +For all designs I ask you to make, have them be beautiful, not cookie cutter. Make webpages that are fully featured and worthy for production. + +By default, this template supports JSX syntax with Tailwind CSS classes, React hooks, and Lucide React for icons. Do not install other packages for UI themes, icons, etc unless absolutely necessary or I request them. + +Use icons from lucide-react for logos. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ceb59f --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# 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? +.env diff --git a/Dockerfile.frontend b/Dockerfile.frontend new file mode 100644 index 0000000..9b138f2 --- /dev/null +++ b/Dockerfile.frontend @@ -0,0 +1,24 @@ +FROM node:18-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm ci --only=production + +# Copy source code +COPY . . + +# Build the application +RUN npm run build + +# Install a simple HTTP server for serving static content +RUN npm install -g serve + +# Expose port +EXPOSE 3000 + +# Serve the built application +CMD ["serve", "-s", "dist", "-l", "3000"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c164450 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# Cashback Tracker + +A comprehensive web application for tracking debit card cashback rewards. Built with React + TypeScript frontend, Node.js + Express + SQLite backend, and deployed with Docker Compose. + +## Features + +- **Card Management**: Add, edit, and delete debit cards with details +- **Category Management**: Manage cashback categories (groceries, gas, etc.) +- **Monthly Category Assignment**: Assign categories to cards with specific cashback percentages each month +- **Transaction Tracking**: Record purchases and automatically calculate cashback +- **Dashboard**: View current month's cashback summary with filtering options +- **Responsive Design**: Works seamlessly on desktop and mobile devices + +## Tech Stack + +- **Frontend**: React 18, TypeScript, TailwindCSS, Shadcn/UI, React Router +- **Backend**: Node.js, Express.js, SQLite3 +- **Deployment**: Docker & Docker Compose + +## Quick Start + +### Using Docker Compose (Recommended) + +1. Clone the repository +2. Run the application: + +```bash +docker-compose up --build +``` + +3. Access the application: + - Frontend: http://localhost:3000 + - Backend API: http://localhost:3001 + +### Development Setup + +#### Frontend +```bash +npm install +npm run dev +``` + +#### Backend +```bash +cd server +npm install +npm run dev +``` + +## Database Schema + +- **cards**: Store debit card information +- **categories**: Cashback categories (groceries, gas, etc.) +- **monthly_categories**: Monthly assignment of categories to cards with percentages +- **transactions**: Purchase records with automatic cashback calculation + +## API Endpoints + +- `GET /api/cards` - Get all cards +- `POST /api/cards` - Create new card +- `GET /api/categories` - Get all categories +- `POST /api/categories` - Create new category +- `GET /api/monthly-categories/:year/:month` - Get monthly assignments +- `POST /api/monthly-categories` - Create monthly assignment +- `GET /api/transactions/:year/:month` - Get transactions by month +- `POST /api/transactions` - Create transaction (auto-calculates cashback) +- `GET /api/cashback/:year/:month` - Get cashback summary with filtering + +## Usage + +1. **Setup Cards**: Add your debit cards with bank information +2. **Create Categories**: Define cashback categories (groceries, gas, dining, etc.) +3. **Monthly Assignment**: Each month, assign categories to cards with their cashback percentages +4. **Track Transactions**: Add purchases to automatically calculate and track cashback +5. **Monitor Dashboard**: View monthly summaries and filter by card or category + +## Docker Commands + +```bash +# Build and run +docker-compose up --build + +# Run in background +docker-compose up -d + +# View logs +docker-compose logs -f + +# Stop services +docker-compose down + +# Remove volumes (reset database) +docker-compose down -v +``` + +## Contributing + +1. Fork the repository +2. Create a feature branch +3. Commit your changes +4. Push to the branch +5. Create a Pull Request + +## License + +MIT License - see LICENSE file for details \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..915f859 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "src/components", + "utils": "src/lib/utils" + } +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8308ff2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.8' + +services: + frontend: + build: + context: . + dockerfile: Dockerfile.frontend + ports: + - "3000:3000" + depends_on: + - backend + environment: + - VITE_API_URL=http://backend:3001 + + backend: + build: + context: ./server + dockerfile: Dockerfile + ports: + - "3001:3001" + volumes: + - sqlite_data:/app/data + environment: + - NODE_ENV=production + - DATABASE_PATH=/app/data/cashback.db + +volumes: + sqlite_data: \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..82c2e20 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,28 @@ +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'; + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + } +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..48ebdc0 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Complete Cashback Tracking Application + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..18a7cce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5076 @@ +{ + "name": "vite-react-typescript-starter", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vite-react-typescript-starter", + "version": "0.0.0", + "dependencies": { + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.8.2", + "tailwind-merge": "^3.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.1", + "@types/node": "^24.3.0", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.18", + "eslint": "^9.9.1", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.11", + "globals": "^15.9.0", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "typescript": "^5.5.3", + "typescript-eslint": "^8.3.0", + "vite": "^5.4.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", + "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", + "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", + "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", + "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", + "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", + "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.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": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", + "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", + "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.33", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", + "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.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", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0-rc-fb9a90fa48-20240614", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", + "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", + "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", + "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.2.tgz", + "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", + "license": "MIT", + "dependencies": { + "react-router": "7.8.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz", + "integrity": "sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.8.1", + "@typescript-eslint/parser": "8.8.1", + "@typescript-eslint/utils": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "node_modules/vite": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f82814d --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "vite-react-typescript-starter", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.8.2", + "tailwind-merge": "^3.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.1", + "@types/node": "^24.3.0", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.18", + "eslint": "^9.9.1", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.11", + "globals": "^15.9.0", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "typescript": "^5.5.3", + "typescript-eslint": "^8.3.0", + "vite": "^5.4.2" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..91bfdbc --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,21 @@ +FROM node:18-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm ci --only=production + +# Copy source code +COPY . . + +# Create directory for database +RUN mkdir -p /app/data + +# Expose port +EXPOSE 3001 + +# Start the server +CMD ["npm", "start"] \ No newline at end of file diff --git a/server/cashback.db b/server/cashback.db new file mode 100644 index 0000000000000000000000000000000000000000..2070f2df4c046870b9c5c3cd99f0f83acf8c358d GIT binary patch literal 151552 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 P&;FY_{`YYFFHQd+i( { + if (err) { + console.error('Error opening database:', err); + } else { + console.log('Connected to SQLite database'); + } +}); + +// Initialize tables +db.serialize(() => { + // Cards table + db.run(` + CREATE TABLE IF NOT EXISTS cards ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + bank TEXT NOT NULL, + description TEXT, + image_url TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ) + `); + + // Categories table + db.run(` + CREATE TABLE IF NOT EXISTS categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + description TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ) + `); + + // Monthly categories table + db.run(` + CREATE TABLE IF NOT EXISTS monthly_categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + card_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + month INTEGER NOT NULL, + year INTEGER NOT NULL, + cashback_percent REAL NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (card_id) REFERENCES cards (id) ON DELETE CASCADE, + FOREIGN KEY (category_id) REFERENCES categories (id) ON DELETE CASCADE, + UNIQUE(card_id, category_id, month, year) + ) + `); + + // Transactions table + db.run(` + CREATE TABLE IF NOT EXISTS transactions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + card_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + amount REAL NOT NULL, + cashback_amount REAL NOT NULL, + date DATE NOT NULL, + description TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (card_id) REFERENCES cards (id) ON DELETE CASCADE, + FOREIGN KEY (category_id) REFERENCES categories (id) ON DELETE CASCADE + ) + `); +}); + +module.exports = db; \ No newline at end of file diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..28dfc52 --- /dev/null +++ b/server/index.js @@ -0,0 +1,29 @@ +const express = require('express'); +const cors = require('cors'); +const path = require('path'); + +const app = express(); +const PORT = process.env.PORT || 3001; + +// Middleware +app.use(cors()); +app.use(express.json()); + +// Routes +app.use('/api/cards', require('./routes/cards')); +app.use('/api/categories', require('./routes/categories')); +app.use('/api/monthly-categories', require('./routes/monthly-categories')); +app.use('/api/transactions', require('./routes/transactions')); +app.use('/api/cashback', require('./routes/cashback')); + +// Health check +app.get('/api/health', (req, res) => { + res.json({ status: 'OK', timestamp: new Date().toISOString() }); +}); + +// Start server +app.listen(PORT, '0.0.0.0', () => { + console.log(`Server running on port ${PORT}`); +}); + +module.exports = app; \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..c89caf2 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2651 @@ +{ + "name": "cashback-tracker-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cashback-tracker-server", + "version": "1.0.0", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2", + "sqlite3": "^5.1.6" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "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", + "optional": true + }, + "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", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "optional": true, + "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", + "optional": true + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.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.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "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", + "optional": true, + "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==", + "devOptional": true, + "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", + "optional": true + }, + "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/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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", + "optional": true + }, + "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.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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", + "optional": true + }, + "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/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT", + "optional": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=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/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "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.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC", + "optional": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "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", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC", + "optional": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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", + "optional": true + }, + "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-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "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/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-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", + "optional": true + }, + "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", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "optional": true, + "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", + "optional": true + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true + }, + "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", + "optional": true, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC", + "optional": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/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/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "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/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/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "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/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "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-abi": { + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "license": "MIT", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.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.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "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/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "optional": true, + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "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", + "optional": true, + "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.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "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", + "optional": true + }, + "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/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", + "optional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-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", + "optional": true + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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", + "optional": true, + "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", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/tar-fs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/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/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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", + "optional": true, + "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..8b6bb13 --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "name": "cashback-tracker-server", + "version": "1.0.0", + "description": "Backend server for cashback tracker", + "main": "index.js", + "scripts": { + "start": "node index.js", + "dev": "nodemon index.js" + }, + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "sqlite3": "^5.1.6" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } +} \ No newline at end of file diff --git a/server/routes/cards.js b/server/routes/cards.js new file mode 100644 index 0000000..86b25b7 --- /dev/null +++ b/server/routes/cards.js @@ -0,0 +1,101 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../database'); + +// Get all cards +router.get('/', (req, res) => { + db.all('SELECT * FROM cards ORDER BY created_at DESC', (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(rows); + } + }); +}); + +// Get card by ID +router.get('/:id', (req, res) => { + const { id } = req.params; + db.get('SELECT * FROM cards WHERE id = ?', [id], (err, row) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (!row) { + res.status(404).json({ error: 'Card not found' }); + } else { + res.json(row); + } + }); +}); + +// Create new card +router.post('/', (req, res) => { + const { name, bank, description, image_url } = req.body; + + if (!name || !bank) { + return res.status(400).json({ error: 'Name and bank are required' }); + } + + db.run( + 'INSERT INTO cards (name, bank, description, image_url) VALUES (?, ?, ?, ?)', + [name, bank, description, image_url], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.status(201).json({ + id: this.lastID, + name, + bank, + description, + image_url + }); + } + } + ); +}); + +// Update card +router.put('/:id', (req, res) => { + const { id } = req.params; + const { name, bank, description, image_url } = req.body; + + if (!name || !bank) { + return res.status(400).json({ error: 'Name and bank are required' }); + } + + db.run( + 'UPDATE cards SET name = ?, bank = ?, description = ?, image_url = ? WHERE id = ?', + [name, bank, description, image_url, id], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Card not found' }); + } else { + res.json({ id: parseInt(id), name, bank, description, image_url }); + } + } + ); +}); + +// Delete card +router.delete('/:id', (req, res) => { + const { id } = req.params; + + db.run('DELETE FROM cards WHERE id = ?', [id], function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Card not found' }); + } else { + res.json({ message: 'Card deleted successfully' }); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/cashback.js b/server/routes/cashback.js new file mode 100644 index 0000000..5d2adbc --- /dev/null +++ b/server/routes/cashback.js @@ -0,0 +1,93 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../database'); + +// Get cashback summary by month/year with optional filters +router.get('/:year/:month', (req, res) => { + const { year, month } = req.params; + const { card_id, category_id } = req.query; + + let query = ` + SELECT + c.id as card_id, + c.name as card_name, + c.bank, + cat.id as category_id, + cat.name as category_name, + mc.cashback_percent, + COALESCE(SUM(t.amount), 0) as total_spent, + COALESCE(SUM(t.cashback_amount), 0) as total_cashback, + COUNT(t.id) as transaction_count + FROM monthly_categories mc + JOIN cards c ON mc.card_id = c.id + JOIN categories cat ON mc.category_id = cat.id + LEFT JOIN transactions t ON t.card_id = mc.card_id + AND t.category_id = mc.category_id + AND strftime('%Y', t.date) = ? + AND strftime('%m', t.date) = ? + WHERE mc.year = ? AND mc.month = ? + `; + + const queryParams = [year, month.toString().padStart(2, '0'), year, month]; + + // Add filters + if (card_id) { + query += ' AND c.id = ?'; + queryParams.push(card_id); + } + + if (category_id) { + query += ' AND cat.id = ?'; + queryParams.push(category_id); + } + + query += ' GROUP BY c.id, cat.id ORDER BY c.name, cat.name'; + + db.all(query, queryParams, (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + // Calculate totals + const totalSpent = rows.reduce((sum, row) => sum + row.total_spent, 0); + const totalCashback = rows.reduce((sum, row) => sum + row.total_cashback, 0); + const totalTransactions = rows.reduce((sum, row) => sum + row.transaction_count, 0); + + res.json({ + summary: { + total_spent: totalSpent, + total_cashback: totalCashback, + total_transactions: totalTransactions, + average_cashback_rate: totalSpent > 0 ? (totalCashback / totalSpent) * 100 : 0 + }, + details: rows + }); + } + }); +}); + +// Get overall cashback statistics +router.get('/stats/overview', (req, res) => { + const query = ` + SELECT + COUNT(DISTINCT c.id) as total_cards, + COUNT(DISTINCT cat.id) as total_categories, + COALESCE(SUM(t.amount), 0) as lifetime_spent, + COALESCE(SUM(t.cashback_amount), 0) as lifetime_cashback, + COUNT(t.id) as lifetime_transactions + FROM cards c + CROSS JOIN categories cat + LEFT JOIN transactions t ON 1=1 + `; + + db.get(query, (err, row) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(row); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/categories.js b/server/routes/categories.js new file mode 100644 index 0000000..a2f23eb --- /dev/null +++ b/server/routes/categories.js @@ -0,0 +1,99 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../database'); + +// Get all categories +router.get('/', (req, res) => { + db.all('SELECT * FROM categories ORDER BY name', (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(rows); + } + }); +}); + +// Get category by ID +router.get('/:id', (req, res) => { + const { id } = req.params; + db.get('SELECT * FROM categories WHERE id = ?', [id], (err, row) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (!row) { + res.status(404).json({ error: 'Category not found' }); + } else { + res.json(row); + } + }); +}); + +// Create new category +router.post('/', (req, res) => { + const { name, description } = req.body; + + if (!name) { + return res.status(400).json({ error: 'Name is required' }); + } + + db.run( + 'INSERT INTO categories (name, description) VALUES (?, ?)', + [name, description], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.status(201).json({ + id: this.lastID, + name, + description + }); + } + } + ); +}); + +// Update category +router.put('/:id', (req, res) => { + const { id } = req.params; + const { name, description } = req.body; + + if (!name) { + return res.status(400).json({ error: 'Name is required' }); + } + + db.run( + 'UPDATE categories SET name = ?, description = ? WHERE id = ?', + [name, description, id], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Category not found' }); + } else { + res.json({ id: parseInt(id), name, description }); + } + } + ); +}); + +// Delete category +router.delete('/:id', (req, res) => { + const { id } = req.params; + + db.run('DELETE FROM categories WHERE id = ?', [id], function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Category not found' }); + } else { + res.json({ message: 'Category deleted successfully' }); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/monthly-categories.js b/server/routes/monthly-categories.js new file mode 100644 index 0000000..afc418b --- /dev/null +++ b/server/routes/monthly-categories.js @@ -0,0 +1,99 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../database'); + +// Get monthly categories by year and month +router.get('/:year/:month', (req, res) => { + const { year, month } = req.params; + + const query = ` + SELECT mc.*, c.name as card_name, c.bank, cat.name as category_name + FROM monthly_categories mc + JOIN cards c ON mc.card_id = c.id + JOIN categories cat ON mc.category_id = cat.id + WHERE mc.year = ? AND mc.month = ? + ORDER BY c.name, cat.name + `; + + db.all(query, [year, month], (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(rows); + } + }); +}); + +// Create monthly category assignment +router.post('/', (req, res) => { + const { card_id, category_id, month, year, cashback_percent } = req.body; + + if (!card_id || !category_id || !month || !year || cashback_percent === undefined) { + return res.status(400).json({ error: 'All fields are required' }); + } + + db.run( + `INSERT OR REPLACE INTO monthly_categories + (card_id, category_id, month, year, cashback_percent) + VALUES (?, ?, ?, ?, ?)`, + [card_id, category_id, month, year, cashback_percent], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.status(201).json({ + id: this.lastID, + card_id, + category_id, + month, + year, + cashback_percent + }); + } + } + ); +}); + +// Delete monthly category assignment +router.delete('/:id', (req, res) => { + const { id } = req.params; + + db.run('DELETE FROM monthly_categories WHERE id = ?', [id], function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Assignment not found' }); + } else { + res.json({ message: 'Assignment deleted successfully' }); + } + }); +}); + +// Get available categories for a card in a specific month/year +router.get('/available/:card_id/:year/:month', (req, res) => { + const { card_id, year, month } = req.params; + + const query = ` + SELECT c.* FROM categories c + WHERE c.id NOT IN ( + SELECT mc.category_id + FROM monthly_categories mc + WHERE mc.card_id = ? AND mc.year = ? AND mc.month = ? + ) + ORDER BY c.name + `; + + db.all(query, [card_id, year, month], (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(rows); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/transactions.js b/server/routes/transactions.js new file mode 100644 index 0000000..0ff0dd4 --- /dev/null +++ b/server/routes/transactions.js @@ -0,0 +1,162 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../database'); + +// Get transactions by month/year +router.get('/:year/:month', (req, res) => { + const { year, month } = req.params; + + const query = ` + SELECT t.*, c.name as card_name, c.bank, cat.name as category_name + FROM transactions t + JOIN cards c ON t.card_id = c.id + JOIN categories cat ON t.category_id = cat.id + WHERE strftime('%Y', t.date) = ? AND strftime('%m', t.date) = ? + ORDER BY t.date DESC, t.created_at DESC + `; + + // Pad month with zero if needed + const paddedMonth = month.toString().padStart(2, '0'); + + db.all(query, [year, paddedMonth], (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.json(rows); + } + }); +}); + +// Create transaction +router.post('/', (req, res) => { + const { card_id, category_id, amount, date, description } = req.body; + + if (!card_id || !category_id || !amount || !date) { + return res.status(400).json({ error: 'Card, category, amount, and date are required' }); + } + + // First, get the cashback percentage for this card/category combination + const transactionDate = new Date(date); + const month = transactionDate.getMonth() + 1; + const year = transactionDate.getFullYear(); + + const getCashbackQuery = ` + SELECT cashback_percent + FROM monthly_categories + WHERE card_id = ? AND category_id = ? AND month = ? AND year = ? + `; + + db.get(getCashbackQuery, [card_id, category_id, month, year], (err, row) => { + if (err) { + console.error(err); + return res.status(500).json({ error: 'Database error' }); + } + + if (!row) { + return res.status(400).json({ + error: 'No cashback percentage found for this card/category combination in the specified month' + }); + } + + const cashback_amount = (amount * row.cashback_percent) / 100; + + db.run( + 'INSERT INTO transactions (card_id, category_id, amount, cashback_amount, date, description) VALUES (?, ?, ?, ?, ?, ?)', + [card_id, category_id, amount, cashback_amount, date, description], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else { + res.status(201).json({ + id: this.lastID, + card_id, + category_id, + amount, + cashback_amount, + date, + description + }); + } + } + ); + }); +}); + +// Update transaction +router.put('/:id', (req, res) => { + const { id } = req.params; + const { card_id, category_id, amount, date, description } = req.body; + + if (!card_id || !category_id || !amount || !date) { + return res.status(400).json({ error: 'Card, category, amount, and date are required' }); + } + + // Recalculate cashback amount + const transactionDate = new Date(date); + const month = transactionDate.getMonth() + 1; + const year = transactionDate.getFullYear(); + + const getCashbackQuery = ` + SELECT cashback_percent + FROM monthly_categories + WHERE card_id = ? AND category_id = ? AND month = ? AND year = ? + `; + + db.get(getCashbackQuery, [card_id, category_id, month, year], (err, row) => { + if (err) { + console.error(err); + return res.status(500).json({ error: 'Database error' }); + } + + if (!row) { + return res.status(400).json({ + error: 'No cashback percentage found for this card/category combination in the specified month' + }); + } + + const cashback_amount = (amount * row.cashback_percent) / 100; + + db.run( + 'UPDATE transactions SET card_id = ?, category_id = ?, amount = ?, cashback_amount = ?, date = ?, description = ? WHERE id = ?', + [card_id, category_id, amount, cashback_amount, date, description, id], + function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Transaction not found' }); + } else { + res.json({ + id: parseInt(id), + card_id, + category_id, + amount, + cashback_amount, + date, + description + }); + } + } + ); + }); +}); + +// Delete transaction +router.delete('/:id', (req, res) => { + const { id } = req.params; + + db.run('DELETE FROM transactions WHERE id = ?', [id], function(err) { + if (err) { + console.error(err); + res.status(500).json({ error: 'Database error' }); + } else if (this.changes === 0) { + res.status(404).json({ error: 'Transaction not found' }); + } else { + res.json({ message: 'Transaction deleted successfully' }); + } + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..0e03351 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,25 @@ +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import { Layout } from '@/components/Layout'; +import { Dashboard } from '@/pages/Dashboard'; +import { Cards } from '@/pages/Cards'; +import { Categories } from '@/pages/Categories'; +import { Monthly } from '@/pages/Monthly'; +import { Transactions } from '@/pages/Transactions'; + +function App() { + return ( + + + + } /> + } /> + } /> + } /> + } /> + + + + ); +} + +export default App; \ No newline at end of file diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx new file mode 100644 index 0000000..95b071d --- /dev/null +++ b/src/components/Layout.tsx @@ -0,0 +1,91 @@ +import { Link, useLocation } from 'react-router-dom'; +import { CreditCard, Tag, Calendar, BarChart3, Receipt } from 'lucide-react'; +import { cn } from '@/lib/utils'; + +const navigation = [ + { name: 'Dashboard', href: '/', icon: BarChart3 }, + { name: 'Cards', href: '/cards', icon: CreditCard }, + { name: 'Categories', href: '/categories', icon: Tag }, + { name: 'Monthly Setup', href: '/monthly', icon: Calendar }, + { name: 'Transactions', href: '/transactions', icon: Receipt }, +]; + +export function Layout({ children }: { children: React.ReactNode }) { + const location = useLocation(); + + return ( +
+
+ {/* Sidebar */} +
+
+
+
+ + CashTracker +
+ +
+
+
+ + {/* Main content */} +
+
+
+
+ {children} +
+
+
+
+
+ + {/* Mobile bottom navigation */} +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..9c20844 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } \ No newline at end of file diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..eb3a7cb --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } \ No newline at end of file diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..7500a1c --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } \ No newline at end of file diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx new file mode 100644 index 0000000..9e81a62 --- /dev/null +++ b/src/components/ui/dialog.tsx @@ -0,0 +1,120 @@ +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} \ No newline at end of file diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..a33a607 --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } \ No newline at end of file diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx new file mode 100644 index 0000000..a7cafcd --- /dev/null +++ b/src/components/ui/label.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } \ No newline at end of file diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..1af135c --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,158 @@ +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} \ No newline at end of file diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..125b4bb --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,53 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..46d5134 --- /dev/null +++ b/src/index.css @@ -0,0 +1,66 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 221.2 83.2% 53.3%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96%; + --secondary-foreground: 222.2 84% 4.9%; + --muted: 210 40% 96%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96%; + --accent-foreground: 222.2 84% 4.9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 221.2 83.2% 53.3%; + --radius: 0.75rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 217.2 91.2% 59.8%; + --primary-foreground: 222.2 84% 4.9%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 224.3 76.3% 94.1%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} + +/* Mobile bottom navigation spacing */ +@media (max-width: 768px) { + .mobile-safe { + padding-bottom: 5rem; + } +} \ No newline at end of file diff --git a/src/lib/api.ts b/src/lib/api.ts new file mode 100644 index 0000000..72a69d9 --- /dev/null +++ b/src/lib/api.ts @@ -0,0 +1,78 @@ +import { Card, Category, MonthlyCategory, Transaction } from '../types'; + + +const API_BASE = import.meta.env.VITE_API_URL ? `${import.meta.env.VITE_API_URL}/api` : '/api'; + +async function fetchAPI(endpoint: string, options: RequestInit = {}) { + const response = await fetch(`${API_BASE}${endpoint}`, { + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + + if (!response.ok) { + throw new Error(`API Error: ${response.statusText}`); + } + + return response.json(); +} + +// Cards API +export const cardsAPI = { + getAll: () => fetchAPI('/cards'), + getById: (id: number) => fetchAPI(`/cards/${id}`), + create: (card: Omit) => + fetchAPI('/cards', { method: 'POST', body: JSON.stringify(card) }), + update: (id: number, card: Partial) => + fetchAPI(`/cards/${id}`, { method: 'PUT', body: JSON.stringify(card) }), + delete: (id: number) => fetchAPI(`/cards/${id}`, { method: 'DELETE' }), +}; + +// Categories API +export const categoriesAPI = { + getAll: () => fetchAPI('/categories'), + getById: (id: number) => fetchAPI(`/categories/${id}`), + create: (category: Omit) => + fetchAPI('/categories', { method: 'POST', body: JSON.stringify(category) }), + update: (id: number, category: Partial) => + fetchAPI(`/categories/${id}`, { method: 'PUT', body: JSON.stringify(category) }), + delete: (id: number) => fetchAPI(`/categories/${id}`, { method: 'DELETE' }), +}; + +// Monthly Categories API +export const monthlyCategoriesAPI = { + getByMonth: (year: number, month: number) => + fetchAPI(`/monthly-categories/${year}/${month}`), + create: (monthlyCategory: Omit) => + fetchAPI('/monthly-categories', { method: 'POST', body: JSON.stringify(monthlyCategory) }), + update: (id: number, monthlyCategory: Partial) => + fetchAPI(`/monthly-categories/${id}`, { method: 'PUT', body: JSON.stringify(monthlyCategory) }), + delete: (id: number) => fetchAPI(`/monthly-categories/${id}`, { method: 'DELETE' }), +}; + +// Transactions API +export const transactionsAPI = { + getAll: () => fetchAPI('/transactions'), + getByMonth: (year: number, month: number) => + fetchAPI(`/transactions/${year}/${month}`), + create: (transaction: Omit) => + fetchAPI('/transactions', { method: 'POST', body: JSON.stringify(transaction) }), + update: (id: number, transaction: Partial) => + fetchAPI(`/transactions/${id}`, { method: 'PUT', body: JSON.stringify(transaction) }), + delete: (id: number) => fetchAPI(`/transactions/${id}`, { method: 'DELETE' }), +}; + +// Cashback Summary API +export const cashbackAPI = { + getSummary: (year: number, month: number, cardId?: number, categoryId?: number) => { + const params = new URLSearchParams(); + if (cardId) params.append('cardId', cardId.toString()); + if (categoryId) params.append('categoryId', categoryId.toString()); + + const queryString = params.toString(); + return fetchAPI(`/cashback/${year}/${month}${queryString ? `?${queryString}` : ''}`); + }, +}; + diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..5510f07 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,24 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + +export function formatCurrency(amount: number): string { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + }).format(amount) +} + +export function getCurrentMonth(): string { + const now = new Date() + return `${now.getFullYear()}-${(now.getMonth() + 1).toString().padStart(2, '0')}` +} + +export function formatMonth(monthYear: string): string { + const [year, month] = monthYear.split('-') + const date = new Date(parseInt(year), parseInt(month) - 1) + return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }) +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..ea9e363 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +createRoot(document.getElementById('root')!).render( + + + +); diff --git a/src/pages/Cards.tsx b/src/pages/Cards.tsx new file mode 100644 index 0000000..dec52dd --- /dev/null +++ b/src/pages/Cards.tsx @@ -0,0 +1,310 @@ +import { useState, useEffect } from 'react'; +import { Plus, Edit, Trash2, CreditCard, Upload, X } from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '../components/ui/dialog'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { cardsAPI } from '../lib/api'; +import type { Card as CardType } from '../types'; + +export function Cards() { + const [cards, setCards] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [editingCard, setEditingCard] = useState(null); + const [selectedImage, setSelectedImage] = useState(null); + const [imagePreview, setImagePreview] = useState(null); + const [formData, setFormData] = useState({ + name: '', + bank: '', + description: '', + image_url: '' + }); + + const fetchCards = async () => { + setIsLoading(true); + try { + const data = await cardsAPI.getAll(); + setCards(data); + } catch (error) { + console.error('Failed to fetch cards:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchCards(); + }, []); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + let imageUrl = formData.image_url; + + // If a new image was selected, convert to base64 + if (selectedImage) { + const reader = new FileReader(); + imageUrl = await new Promise((resolve) => { + reader.onload = () => resolve(reader.result as string); + reader.readAsDataURL(selectedImage); + }); + } + + const cardData = { ...formData, image_url: imageUrl }; + + if (editingCard) { + await cardsAPI.update(editingCard.id, cardData); + } else { + await cardsAPI.create(cardData); + } + await fetchCards(); + handleCloseDialog(); + } catch (error) { + console.error('Failed to save card:', error); + } + }; + + const handleDelete = async (id: number) => { + if (confirm('Are you sure you want to delete this card?')) { + try { + await cardsAPI.delete(id); + await fetchCards(); + } catch (error) { + console.error('Failed to delete card:', error); + } + } + }; + + const handleOpenDialog = (card?: CardType) => { + if (card) { + setEditingCard(card); + setFormData({ + name: card.name, + bank: card.bank, + description: card.description, + image_url: card.image_url || '' + }); + setImagePreview(card.image_url || null); + } else { + setEditingCard(null); + setFormData({ name: '', bank: '', description: '', image_url: '' }); + setImagePreview(null); + } + setSelectedImage(null); + setIsDialogOpen(true); + }; + + const handleCloseDialog = () => { + setIsDialogOpen(false); + setEditingCard(null); + setFormData({ name: '', bank: '', description: '', image_url: '' }); + setSelectedImage(null); + setImagePreview(null); + }; + + const handleImageSelect = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (file) { + if (file.size > 5 * 1024 * 1024) { // 5MB limit + alert('Image size must be less than 5MB'); + return; + } + + setSelectedImage(file); + const reader = new FileReader(); + reader.onload = () => { + setImagePreview(reader.result as string); + }; + reader.readAsDataURL(file); + } + }; + + const removeImage = () => { + setSelectedImage(null); + setImagePreview(null); + setFormData({ ...formData, image_url: '' }); + }; + + if (isLoading) { + return ( +
+
+
+
+ {[1, 2, 3].map((i) => ( +
+ ))} +
+
+
+ ); + } + + return ( +
+
+

Cards

+ + + + + + + {editingCard ? 'Edit Card' : 'Add New Card'} + +
+
+ +
+ {imagePreview ? ( +
+ Card preview + +
+ ) : ( +
+ +

Upload card image

+ + +
+ )} +

+ Recommended: 320x200px, max 5MB (JPG, PNG, WebP) +

+
+
+
+ + setFormData({ ...formData, name: e.target.value })} + placeholder="e.g., Chase Freedom" + required + /> +
+
+ + setFormData({ ...formData, bank: e.target.value })} + placeholder="e.g., Chase Bank" + required + /> +
+
+ + setFormData({ ...formData, description: e.target.value })} + placeholder="Optional description" + /> +
+
+ + +
+
+
+
+
+ + {cards.length > 0 ? ( +
+ {cards.map((card) => ( + + {card.image_url && ( +
+ {`${card.name} +
+ )} + + + + {card.name} + +

{card.bank}

+
+ +

{card.description || 'No description'}

+
+ + +
+
+
+ ))} +
+ ) : ( + + + +

No cards yet

+

+ Add your first debit card to start tracking cashback rewards. +

+ +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/pages/Categories.tsx b/src/pages/Categories.tsx new file mode 100644 index 0000000..8ad5471 --- /dev/null +++ b/src/pages/Categories.tsx @@ -0,0 +1,198 @@ +import { useState, useEffect } from 'react'; +import { Plus, Edit, Trash2, Tag } from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '../components/ui/dialog'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { categoriesAPI } from '../lib/api'; +import type { Category } from '../types'; + +export function Categories() { + const [categories, setCategories] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [editingCategory, setEditingCategory] = useState(null); + const [formData, setFormData] = useState({ + name: '', + description: '' + }); + + const fetchCategories = async () => { + setIsLoading(true); + try { + const data = await categoriesAPI.getAll(); + setCategories(data); + } catch (error) { + console.error('Failed to fetch categories:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchCategories(); + }, []); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + if (editingCategory) { + await categoriesAPI.update(editingCategory.id, formData); + } else { + await categoriesAPI.create(formData); + } + await fetchCategories(); + handleCloseDialog(); + } catch (error) { + console.error('Failed to save category:', error); + } + }; + + const handleDelete = async (id: number) => { + if (confirm('Are you sure you want to delete this category?')) { + try { + await categoriesAPI.delete(id); + await fetchCategories(); + } catch (error) { + console.error('Failed to delete category:', error); + } + } + }; + + const handleOpenDialog = (category?: Category) => { + if (category) { + setEditingCategory(category); + setFormData({ + name: category.name, + description: category.description + }); + } else { + setEditingCategory(null); + setFormData({ name: '', description: '' }); + } + setIsDialogOpen(true); + }; + + const handleCloseDialog = () => { + setIsDialogOpen(false); + setEditingCategory(null); + setFormData({ name: '', description: '' }); + }; + + if (isLoading) { + return ( +
+
+
+
+ {[1, 2, 3].map((i) => ( +
+ ))} +
+
+
+ ); + } + + return ( +
+
+

Categories

+ + + + + + + {editingCategory ? 'Edit Category' : 'Add New Category'} + +
+
+ + setFormData({ ...formData, name: e.target.value })} + placeholder="e.g., Groceries" + required + /> +
+
+ + setFormData({ ...formData, description: e.target.value })} + placeholder="Optional description" + /> +
+
+ + +
+
+
+
+
+ + {categories.length > 0 ? ( +
+ {categories.map((category) => ( + + + + + {category.name} + + + +

{category.description || 'No description'}

+
+ + +
+
+
+ ))} +
+ ) : ( + + + +

No categories yet

+

+ Add cashback categories to organize your spending and rewards. +

+ +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx new file mode 100644 index 0000000..0708a3f --- /dev/null +++ b/src/pages/Dashboard.tsx @@ -0,0 +1,279 @@ +import { useState, useEffect } from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../components/ui/select'; +import { Badge } from '../components/ui/badge'; +import { CreditCard, TrendingUp, DollarSign, Percent } from 'lucide-react'; +import { formatCurrency, getCurrentMonth, formatMonth } from '../lib/utils'; +import { cashbackAPI, cardsAPI, categoriesAPI } from '../lib/api'; +import type { CashbackSummary, Card as CardType, Category } from '../types'; + +export function Dashboard() { + const [summary, setSummary] = useState(null); + const [cards, setCards] = useState([]); + const [categories, setCategories] = useState([]); + const [selectedCard, setSelectedCard] = useState('all'); + const [selectedCategory, setSelectedCategory] = useState('all'); + const [isLoading, setIsLoading] = useState(true); + + const currentMonth = getCurrentMonth(); + const [year, month] = currentMonth.split('-').map(Number); + + const fetchData = async () => { + setIsLoading(true); + try { + const [summaryData, cardsData, categoriesData] = await Promise.all([ + cashbackAPI.getSummary( + year, + month, + selectedCard !== 'all' ? Number(selectedCard) : undefined, + selectedCategory !== 'all' ? Number(selectedCategory) : undefined + ), + cardsAPI.getAll(), + categoriesAPI.getAll(), + ]); + + setSummary(summaryData); + setCards(cardsData); + setCategories(categoriesData); + } catch (error) { + console.error('Failed to fetch dashboard data:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchData(); + }, [selectedCard, selectedCategory, year, month]); + + if (isLoading) { + return ( +
+
+
+
+ {[1, 2, 3].map((i) => ( +
+ ))} +
+
+
+ ); + } + + return ( +
+
+

+ Cashback Dashboard - {formatMonth(currentMonth)} +

+
+ + {/* Filters */} +
+ + + +
+ + {/* Summary Cards */} +
+ + + Total Cashback + + + +
+ {formatCurrency(summary?.total_cashback || 0)} +
+
+
+ + + + Total Spent + + + +
+ {formatCurrency(summary?.total_spent || 0)} +
+
+
+ + + + Avg. Cashback Rate + + + +
+ {summary?.total_spent ? + ((summary.total_cashback / summary.total_spent) * 100).toFixed(2) + '%' : + '0%' + } +
+
+
+
+ + {/* Card Breakdown */} + {summary?.card_summaries && summary.card_summaries.length > 0 ? ( +
+ {/* Category Cashback Summary */} +
+

Cashback by Category

+ + +
+ {(() => { + // Aggregate cashback by category across all cards + const categoryTotals = new Map(); + + summary.card_summaries.forEach(({ categories }) => { + categories.forEach(({ category, cashback_amount, spent_amount, cashback_percent }) => { + const existing = categoryTotals.get(category.id) || { + category, + total_cashback: 0, + total_spent: 0, + avg_cashback_percent: 0, + card_count: 0 + }; + + existing.total_cashback += cashback_amount; + existing.total_spent += spent_amount; + existing.avg_cashback_percent += cashback_percent; + existing.card_count += 1; + + categoryTotals.set(category.id, existing); + }); + }); + + // Convert to array and sort by cashback amount + const sortedCategories = Array.from(categoryTotals.values()) + .map(cat => ({ + ...cat, + avg_cashback_percent: cat.avg_cashback_percent / cat.card_count + })) + .sort((a, b) => b.total_cashback - a.total_cashback); + + return sortedCategories.map(({ category, total_cashback, total_spent, avg_cashback_percent }) => ( +
+
+
+ + {category.name.charAt(0).toUpperCase()} + +
+
+

{category.name}

+

+ {avg_cashback_percent.toFixed(1)}% avg cashback rate +

+
+
+
+

+ {formatCurrency(total_cashback)} +

+

+ from {formatCurrency(total_spent)} +

+
+
+ )); + })()} +
+
+
+
+ + {/* Card Breakdown */} +
+

Cashback by Card

+
+ {summary.card_summaries.map(({ card, total_cashback, total_spent, categories }) => ( + + +
+
+ + + {card.name} + +

{card.bank}

+
+
+

+ {formatCurrency(total_cashback)} +

+

+ of {formatCurrency(total_spent)} +

+
+
+
+ + {categories.map(({ category, cashback_percent, cashback_amount, spent_amount }) => ( +
+
+

{category.name}

+ + {cashback_percent}% cashback + +
+
+

+ {formatCurrency(cashback_amount)} +

+

+ {formatCurrency(spent_amount)} +

+
+
+ ))} +
+
+ ))} +
+
+
+ ) : ( + + + +

No cashback data available

+

+ Set up your cards and categories, then add some transactions to see your cashback summary. +

+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/pages/Monthly.tsx b/src/pages/Monthly.tsx new file mode 100644 index 0000000..b272d96 --- /dev/null +++ b/src/pages/Monthly.tsx @@ -0,0 +1,306 @@ +import { useState, useEffect } from 'react'; +import { Plus, Edit, Trash2, Calendar, CreditCard, Tag } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Badge } from '@/components/ui/badge'; +import { monthlyCategoriesAPI, cardsAPI, categoriesAPI } from '@/lib/api'; +import { getCurrentMonth, formatMonth } from '@/lib/utils'; +import type { MonthlyCategory, Card as CardType, Category } from '@/types'; + +function getNextMonth(): string { + const now = new Date(); + const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1); + return `${nextMonth.getFullYear()}-${(nextMonth.getMonth() + 1).toString().padStart(2, '0')}`; +} +export function Monthly() { + const [monthlyCategories, setMonthlyCategories] = useState([]); + const [cards, setCards] = useState([]); + const [categories, setCategories] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [editingMonthlyCategory, setEditingMonthlyCategory] = useState(null); + const [selectedMonth, setSelectedMonth] = useState(getNextMonth()); + const [formData, setFormData] = useState({ + card_id: '', + category_id: '', + cashback_percent: '' + }); + + const [year, month] = selectedMonth.split('-').map(Number); + + const fetchData = async () => { + setIsLoading(true); + try { + const [monthlyData, cardsData, categoriesData] = await Promise.all([ + monthlyCategoriesAPI.getByMonth(year, month), + cardsAPI.getAll(), + categoriesAPI.getAll(), + ]); + + setMonthlyCategories(monthlyData); + setCards(cardsData); + setCategories(categoriesData); + } catch (error) { + console.error('Failed to fetch data:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchData(); + }, [selectedMonth]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const data = { + card_id: Number(formData.card_id), + category_id: Number(formData.category_id), + month, + year, + cashback_percent: Number(formData.cashback_percent) + }; + + if (editingMonthlyCategory) { + await monthlyCategoriesAPI.update(editingMonthlyCategory.id, data); + } else { + await monthlyCategoriesAPI.create(data); + } + await fetchData(); + handleCloseDialog(); + } catch (error) { + console.error('Failed to save monthly category:', error); + } + }; + + const handleDelete = async (id: number) => { + if (confirm('Are you sure you want to delete this monthly category assignment?')) { + try { + await monthlyCategoriesAPI.delete(id); + await fetchData(); + } catch (error) { + console.error('Failed to delete monthly category:', error); + } + } + }; + + const handleOpenDialog = (monthlyCategory?: MonthlyCategory) => { + if (monthlyCategory) { + setEditingMonthlyCategory(monthlyCategory); + setFormData({ + card_id: monthlyCategory.card_id.toString(), + category_id: monthlyCategory.category_id.toString(), + cashback_percent: monthlyCategory.cashback_percent.toString() + }); + } else { + setEditingMonthlyCategory(null); + setFormData({ card_id: '', category_id: '', cashback_percent: '' }); + } + setIsDialogOpen(true); + }; + + const handleCloseDialog = () => { + setIsDialogOpen(false); + setEditingMonthlyCategory(null); + setFormData({ card_id: '', category_id: '', cashback_percent: '' }); + }; + + if (isLoading) { + return ( +
+
+
+
+ {[1, 2].map((i) => ( +
+ ))} +
+
+
+ ); + } + + const groupedByCard = monthlyCategories.reduce((acc, mc) => { + const cardId = mc.card_id; + if (!acc[cardId]) { + acc[cardId] = []; + } + acc[cardId].push(mc); + return acc; + }, {} as Record); + + return ( +
+
+

Monthly Category Setup

+
+ setSelectedMonth(e.target.value)} + className="w-auto" + /> + + + + + + + + {editingMonthlyCategory ? 'Edit Assignment' : 'Assign Category to Card'} + + +
+
+ + +
+
+ + +
+
+ + setFormData({ ...formData, cashback_percent: e.target.value })} + placeholder="e.g., 5.00" + required + /> +
+
+ + +
+
+
+
+
+
+ + + + + + Cashback Valid for {formatMonth(selectedMonth)} + +

+ Set up cashback categories that will be active during {formatMonth(selectedMonth)}. + Categories are typically assigned at the end of the current month for the following month. +

+
+
+ + {Object.keys(groupedByCard).length > 0 ? ( +
+ {Object.entries(groupedByCard).map(([cardId, assignments]) => { + const card = cards.find(c => c.id === Number(cardId)); + if (!card) return null; + + return ( + + + + + {card.name} + +

{card.bank}

+
+ + {assignments.map((assignment) => { + const category = categories.find(c => c.id === assignment.category_id); + if (!category) return null; + + return ( +
+
+ +
+

{category.name}

+ + {assignment.cashback_percent}% cashback + +
+
+
+ + +
+
+ ); + })} +
+
+ ); + })} +
+ ) : ( + + + +

No category assignments valid for {formatMonth(selectedMonth)}

+

+ Assign cashback categories to your cards that will be valid during {formatMonth(selectedMonth)} to start tracking rewards. +

+ +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/pages/Transactions.tsx b/src/pages/Transactions.tsx new file mode 100644 index 0000000..3ee375c --- /dev/null +++ b/src/pages/Transactions.tsx @@ -0,0 +1,328 @@ +import { useState, useEffect } from 'react'; +import { Plus, Edit, Trash2, Receipt, CreditCard, Tag } from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '../components/ui/dialog'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../components/ui/select'; +import { Badge } from '../components/ui/badge'; +import { transactionsAPI, cardsAPI, categoriesAPI } from '../lib/api'; +import { formatCurrency, getCurrentMonth, formatMonth } from '../lib/utils'; +import type { Transaction, Card as CardType, Category } from '../types'; + +export function Transactions() { + const [transactions, setTransactions] = useState([]); + const [cards, setCards] = useState([]); + const [categories, setCategories] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [editingTransaction, setEditingTransaction] = useState(null); + const [selectedMonth, setSelectedMonth] = useState(getCurrentMonth()); + const [formData, setFormData] = useState({ + card_id: '', + category_id: '', + date: '', + amount: '' + }); + + const [year, month] = selectedMonth.split('-').map(Number); + + const fetchData = async () => { + setIsLoading(true); + try { + const [transactionsData, cardsData, categoriesData] = await Promise.all([ + transactionsAPI.getByMonth(year, month), + cardsAPI.getAll(), + categoriesAPI.getAll(), + ]); + + setTransactions(transactionsData); + setCards(cardsData); + setCategories(categoriesData); + } catch (error) { + console.error('Failed to fetch data:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchData(); + }, [selectedMonth]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const data = { + card_id: Number(formData.card_id), + category_id: Number(formData.category_id), + date: formData.date, + amount: Number(formData.amount) + }; + + if (editingTransaction) { + await transactionsAPI.update(editingTransaction.id, data); + } else { + await transactionsAPI.create(data); + } + await fetchData(); + handleCloseDialog(); + } catch (error) { + console.error('Failed to save transaction:', error); + } + }; + + const handleDelete = async (id: number) => { + if (confirm('Are you sure you want to delete this transaction?')) { + try { + await transactionsAPI.delete(id); + await fetchData(); + } catch (error) { + console.error('Failed to delete transaction:', error); + } + } + }; + + const handleOpenDialog = (transaction?: Transaction) => { + if (transaction) { + setEditingTransaction(transaction); + setFormData({ + card_id: transaction.card_id.toString(), + category_id: transaction.category_id.toString(), + date: transaction.date, + amount: transaction.amount.toString() + }); + } else { + setEditingTransaction(null); + setFormData({ + card_id: '', + category_id: '', + date: new Date().toISOString().split('T')[0], + amount: '' + }); + } + setIsDialogOpen(true); + }; + + const handleCloseDialog = () => { + setIsDialogOpen(false); + setEditingTransaction(null); + setFormData({ card_id: '', category_id: '', date: '', amount: '' }); + }; + + if (isLoading) { + return ( +
+
+
+
+ {[1, 2, 3].map((i) => ( +
+ ))} +
+
+
+ ); + } + + const totalSpent = transactions.reduce((sum, t) => sum + t.amount, 0); + const totalCashback = transactions.reduce((sum, t) => sum + t.cashback_amount, 0); + + return ( +
+
+

Transactions

+
+ setSelectedMonth(e.target.value)} + className="w-auto" + /> + + + + + + + + {editingTransaction ? 'Edit Transaction' : 'Add New Transaction'} + + +
+
+ + +
+
+ + +
+
+ + setFormData({ ...formData, date: e.target.value })} + required + /> +
+
+ + setFormData({ ...formData, amount: e.target.value })} + placeholder="e.g., 25.99" + required + /> +
+
+ + +
+
+
+
+
+
+ + {/* Summary Cards */} +
+ + + Total Spent + + +
{formatCurrency(totalSpent)}
+

{formatMonth(selectedMonth)}

+
+
+ + + + Total Cashback + + +
{formatCurrency(totalCashback)}
+

{formatMonth(selectedMonth)}

+
+
+ + + + Transactions + + +
{transactions.length}
+

{formatMonth(selectedMonth)}

+
+
+
+ + {/* Transactions List */} + {transactions.length > 0 ? ( + + + Transaction History - {formatMonth(selectedMonth)} + + +
+ {transactions.map((transaction) => ( +
+
+ +
+
+ + {transaction.card?.name} + + {transaction.category?.name} +
+

+ {new Date(transaction.date).toLocaleDateString()} +

+
+
+
+
+

{formatCurrency(transaction.amount)}

+ + +{formatCurrency(transaction.cashback_amount)} cashback + +
+
+ + +
+
+
+ ))} +
+
+
+ ) : ( + + + +

No transactions for {formatMonth(selectedMonth)}

+

+ Add your first transaction to start tracking cashback earnings. +

+ +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..e1400d1 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,51 @@ +export interface Card { + id: number; + name: string; + bank: string; + description: string; + image_url?: string; +} + +export interface Category { + id: number; + name: string; + description: string; +} + +export interface MonthlyCategory { + id: number; + card_id: number; + category_id: number; + month: number; + year: number; + cashback_percent: number; + card?: Card; + category?: Category; +} + +export interface Transaction { + id: number; + card_id: number; + category_id: number; + date: string; + amount: number; + cashback_amount: number; + card?: Card; + category?: Category; +} + +export interface CashbackSummary { + total_cashback: number; + total_spent: number; + card_summaries: { + card: Card; + total_cashback: number; + total_spent: number; + categories: { + category: Category; + cashback_percent: number; + cashback_amount: number; + spent_amount: number; + }[]; + }[]; +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..9c07acd --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,77 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ["class"], + content: [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + './index.html' + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..f0a2350 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..48dbd45 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "types": ["node"] + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..685ea57 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + proxy: { + '/api': { + target: 'http://localhost:3001', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + 'lucide-react/dist/esm/icons/fingerprint.js': '/src/stub-empty.js', + }, + }, + optimizeDeps: { + exclude: ['lucide-react'], + }, +}); \ No newline at end of file