From fefed588b445b40e43c2f81ffec4c00008419178 Mon Sep 17 00:00:00 2001 From: LBerardi Date: Fri, 31 Oct 2025 11:08:46 +0100 Subject: [PATCH] Abgabe --- .gitignore | 14 + README.md | 157 + backend/Dockerfile | 14 + backend/data/.gitkeep | 0 backend/jest.config.js | 11 + backend/package-lock.json | 6845 +++++++++++++++++++++++++++++++ backend/package.json | 35 + backend/src/database.ts | 133 + backend/src/server.ts | 105 + backend/src/simulate/events.ts | 23 + backend/src/test/server.test.ts | 90 + backend/src/types.ts | 25 + backend/src/validation.ts | 23 + backend/tsconfig.json | 18 + data/.gitkeep | 1 + docker-compose.yml | 25 + docs/ANLEITUNG.md | 115 + docs/ARCHITEKTUR.md | 141 + docs/aufgabe1-1.drawio.pdf | Bin 0 -> 32711 bytes docs/aufgabe1-architektur.md | 235 ++ docs/aufgabe1.2.drawio.pdf | Bin 0 -> 33088 bytes frontend/.gitignore | 5 + frontend/Dockerfile | 16 + frontend/index.html | 12 + frontend/nginx.conf | 20 + frontend/package-lock.json | 1663 ++++++++ frontend/package.json | 26 + frontend/src/App.tsx | 334 ++ frontend/src/OrdersList.tsx | 153 + frontend/src/main.tsx | 10 + frontend/tsconfig.json | 22 + frontend/tsconfig.node.json | 11 + frontend/vite.config.ts | 13 + package.json | 18 + 34 files changed, 10313 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 backend/Dockerfile create mode 100644 backend/data/.gitkeep create mode 100644 backend/jest.config.js create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/src/database.ts create mode 100644 backend/src/server.ts create mode 100644 backend/src/simulate/events.ts create mode 100644 backend/src/test/server.test.ts create mode 100644 backend/src/types.ts create mode 100644 backend/src/validation.ts create mode 100644 backend/tsconfig.json create mode 100644 data/.gitkeep create mode 100644 docker-compose.yml create mode 100644 docs/ANLEITUNG.md create mode 100644 docs/ARCHITEKTUR.md create mode 100644 docs/aufgabe1-1.drawio.pdf create mode 100644 docs/aufgabe1-architektur.md create mode 100644 docs/aufgabe1.2.drawio.pdf create mode 100644 frontend/.gitignore create mode 100644 frontend/Dockerfile create mode 100644 frontend/index.html create mode 100644 frontend/nginx.conf create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/OrdersList.tsx create mode 100644 frontend/src/main.tsx create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..492d274 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +node_modules/ +dist/ +*.log +.env +data/*.db +data/*.db-journal + +backend/node_modules +backend/dist +frontend/node_modules +frontend/dist +frontend/dist-ssr + +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..734fb3d --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +# Order Management System (OMS) + +Ein modernes Order Management System für konfigurierbare Produkte, entwickelt als White-Label-Lösung für On-Premise-Hosting. + +## Übersicht + +Dieses System wurde für eine Coding Challenge entwickelt und zeigt: + +- RESTful API mit Express.js und TypeScript +- Eingabevalidierung mit Zod +- SQLite3 Datenbank mit automatischer Initialisierung +- Event-Driven Architecture (simuliert für Demo) +- React Frontend mit Material UI +- Docker-Container für einfaches Deployment +- Unit-Tests mit Jest + +## Architektur + +Siehe: +- [ARCHITEKTUR.md](./ARCHITEKTUR.md) - Technische Übersicht mit Diagrammen +- [docs/aufgabe1-architektur.md](./docs/aufgabe1-architektur.md) - Ausführliche Antwort zu Aufgabe 1 mit Begründungen + +## Schnellstart + +### Voraussetzungen + +- Node.js 18+ +- npm +- Docker (optional) + +### Installation + +```bash +# Alle Dependencies installieren +npm run install:all + +# Datenbank-Ordner wird automatisch erstellt beim ersten Start +``` + +### Entwicklung + +```bash +# Terminal 1: Backend +npm run dev + +# Terminal 2: Frontend +npm run dev:frontend +``` + +- Backend: http://localhost:3990 +- Frontend: http://localhost:3980 + +### Mit Docker + +```bash +docker compose up +``` + +### Tests + +```bash +npm test +``` + + +## API Dokumentation + +### GET /orders + +Ruft alle Bestellungen ab. + +**Response (200):** + +```json +{ + "success": true, + "data": [...], + "count": 5 +} +``` + +### POST /orders + +Erstellt eine neue Bestellung. + +**Request:** + +```json +{ + "customerId": "CUST1", + "customerName": "Lui Denkwerk", + "customerEmail": "lui@test.com", + "items": [ + { + "productId": "TISCH1", + "quantity": 1, + "price": 29.99 + } + ], + "shippingAddress": { + "street": "yxcstraße 1", + "city": "Grevenbroich", + "postalCode": "41515", + "country": "DE" + } +} +``` + +**Response (201):** + +```json +{ + "success": true, + "data": { + "id": 1, + "orderNumber": "Order-1234567890-123", + "totalAmount": 299.99, + "status": "pending", + ... + } +} +``` + +## Features + +### Backend +- Express.js mit TypeScript +- Zod für Runtime-Validierung +- SQLite3 (zero-config, ideal für On-Premise) +- Event-System (simuliert, in Production würde ich RabbitMQ oder Kafka nutzen) +- Jest Tests + +### Frontend +- React 18 mit TypeScript +- Material UI 5 für schnelle UI-Entwicklung +- Vite als Build-Tool +- Client-Side Validierung +- Error-Handling +- Zwei Views: Bestellung erstellen + Bestellübersicht + +### Deployment +- Docker & Docker Compose +- Nginx als Reverse Proxy für Frontend +- Isolierte Container für Backend/Frontend + +## Technische Entscheidungen + +**SQLite statt PostgreSQL**: Für die Challenge ausreichend, leicht zu deployen, keine externe DB nötig. In Production würde ich auf PostgreSQL wechseln. + +**Event-Simulation**: Events werden mit Console-Logs simuliert. + +**Keine Auth**: Nicht Teil der Challenge. In Production JWT oder OAuth implementieren. + +**Material UI**: Schnelle UI-Entwicklung mit professionellem Look ohne viel CSS schreiben zu müssen. + +--- + diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..097d26f --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,14 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci --only=production + +COPY . . +RUN npm run build + +EXPOSE 3990 + +CMD ["npm", "start"] + diff --git a/backend/data/.gitkeep b/backend/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/jest.config.js b/backend/jest.config.js new file mode 100644 index 0000000..ef47e3e --- /dev/null +++ b/backend/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + roots: ['/src'], + testMatch: ['**/*.test.ts'], + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/**/*.test.ts', + ], +}; + diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..1e79ef5 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,6845 @@ +{ + "name": "oms-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oms-backend", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2", + "sqlite3": "^5.1.7", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.11", + "@types/node": "^20.10.7", + "@types/sqlite3": "^3.1.11", + "@types/supertest": "^6.0.2", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node-dev": "^2.0.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/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/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/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/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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/fs/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "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/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sqlite3": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.11.tgz", + "integrity": "sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "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/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "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/baseline-browser-mapping": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", + "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "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/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "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/cacache/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/cacache/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", + "optional": true + }, + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "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/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "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/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.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.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "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/electron-to-chromium": { + "version": "1.5.243", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", + "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-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/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "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==", + "devOptional": true, + "license": "ISC" + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "devOptional": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "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/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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==", + "devOptional": true, + "license": "MIT", + "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.", + "devOptional": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "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-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "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, + "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==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "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/make-fetch-happen/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/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", + "optional": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "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/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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/minipass/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" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.79.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.79.0.tgz", + "integrity": "sha512-Pr/5KdBQGG8TirdkS0qN3B+f3eo8zTOfZQWAxHoJqopMz2/uvRnG+S4fWu/6AZxKei2CP2p/psdQ5HFC2Ap5BA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "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/node-gyp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "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/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "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/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "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/rc/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/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "devOptional": true, + "license": "ISC" + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/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/superagent/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "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/tar/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" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "29.4.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", + "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "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/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/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/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.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/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "devOptional": true, + "license": "ISC", + "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/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "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/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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..2b3d432 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,35 @@ +{ + "name": "oms-backend", + "version": "1.0.0", + "description": "OMS Backend", + "main": "dist/server.js", + "scripts": { + "build": "tsc", + "start": "node dist/server.js", + "dev": "ts-node-dev --respawn --transpile-only src/server.ts", + "test": "jest", + "test:watch": "jest --watch" + }, + "keywords": [], + "author": "LBerardi", + "license": "ISC", + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "sqlite3": "^5.1.7", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/cors": "^2.8.17", + "@types/node": "^20.10.7", + "@types/jest": "^29.5.11", + "@types/sqlite3": "^3.1.11", + "typescript": "^5.3.3", + "ts-node-dev": "^2.0.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "supertest": "^6.3.3", + "@types/supertest": "^6.0.2" + } +} diff --git a/backend/src/database.ts b/backend/src/database.ts new file mode 100644 index 0000000..2d5179d --- /dev/null +++ b/backend/src/database.ts @@ -0,0 +1,133 @@ +import sqlite3 from 'sqlite3'; +import { Order } from './types'; +import * as fs from 'fs'; +import * as path from 'path'; + +const DB_DIR = './data'; +const DB_PATH = path.join(DB_DIR, 'orders.db'); + +// Verzeichnis erstellen falls nicht vorhanden +if (!fs.existsSync(DB_DIR)) { + fs.mkdirSync(DB_DIR, { recursive: true }); +} + +const db = new sqlite3.Database(DB_PATH, (err) => { + if (err) { + console.error('DB Fehler:', err); + } +}); + +export function initDatabase(): Promise { + return new Promise((resolve, reject) => { + db.run(` + CREATE TABLE IF NOT EXISTS orders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + orderNumber TEXT UNIQUE NOT NULL, + customerId TEXT NOT NULL, + customerName TEXT NOT NULL, + customerEmail TEXT NOT NULL, + items TEXT NOT NULL, + shippingAddress TEXT NOT NULL, + totalAmount REAL NOT NULL, + status TEXT DEFAULT 'pending', + createdAt TEXT DEFAULT CURRENT_TIMESTAMP + ) + `, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +export function createOrder(order: Order): Promise { + return new Promise((resolve, reject) => { + const query = ` + INSERT INTO orders (orderNumber, customerId, customerName, customerEmail, items, shippingAddress, totalAmount, status) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `; + + // Bestellnummer generieren + const orderNumber = `Order-${Date.now()}-${Math.floor(Math.random() * 1000)}`; + + db.run( + query, + [ + orderNumber, + order.customerId, + order.customerName, + order.customerEmail, + JSON.stringify(order.items), + JSON.stringify(order.shippingAddress), + order.totalAmount, + 'pending' + ], + function(err) { + if (err) { + reject(err); + } else { + resolve({ + ...order, + id: this.lastID, + orderNumber: orderNumber, + status: 'pending', + createdAt: new Date().toISOString() + }); + } + } + ); + }); +} + +export function getOrder(id: number): Promise { + return new Promise((resolve, reject) => { + db.get('SELECT * FROM orders WHERE id = ?', [id], (err, row: any) => { + if (err) { + reject(err); + } else if (!row) { + resolve(null); + } else { + resolve({ + id: row.id, + orderNumber: row.orderNumber, + customerId: row.customerId, + customerName: row.customerName, + customerEmail: row.customerEmail, + items: JSON.parse(row.items), + shippingAddress: JSON.parse(row.shippingAddress), + totalAmount: row.totalAmount, + status: row.status, + createdAt: row.createdAt + }); + } + }); + }); +} + +export function getAllOrders(): Promise { + return new Promise((resolve, reject) => { + db.all('SELECT * FROM orders ORDER BY createdAt DESC', [], (err, rows: any[]) => { + if (err) { + reject(err); + } else { + const orders = rows.map(row => ({ + id: row.id, + orderNumber: row.orderNumber, + customerId: row.customerId, + customerName: row.customerName, + customerEmail: row.customerEmail, + items: JSON.parse(row.items), + shippingAddress: JSON.parse(row.shippingAddress), + totalAmount: row.totalAmount, + status: row.status, + createdAt: row.createdAt + })); + resolve(orders); + } + }); + }); +} + +export { db }; diff --git a/backend/src/server.ts b/backend/src/server.ts new file mode 100644 index 0000000..74466e3 --- /dev/null +++ b/backend/src/server.ts @@ -0,0 +1,105 @@ +import express, { Request, Response, NextFunction } from 'express'; +import cors from 'cors'; +import path from 'path'; +import { orderSchema } from './validation'; +import { createOrder } from './database'; +import { emitOrderCreated } from './simulate/events'; +import { initDatabase } from './database'; + +const app = express(); +const PORT = process.env.PORT || 3990; + +app.use(cors()); +app.use(express.json()); + +// GET /orders - Alle Bestellungen abrufen +app.get('/orders', async (req: Request, res: Response) => { + try { + const { getAllOrders } = require('./database'); + const orders = await getAllOrders(); + + res.status(200).json({ + success: true, + data: orders, + count: orders.length + }); + } catch (error: any) { + console.error('Fehler beim Abrufen der Bestellungen:', error); + res.status(500).json({ + success: false, + error: 'Interner Serverfehler' + }); + } +}); + +// POST /orders - Erstellt eine neue Bestellung +app.post('/orders', async (req: Request, res: Response) => { + try { + const validatedData = orderSchema.parse(req.body); + + // Gesamtbetrag berechnen + const totalAmount = validatedData.items.reduce( + (sum, item) => sum + (item.price * item.quantity), + 0 + ); + + const order = await createOrder({ + ...validatedData, + totalAmount, + status: 'pending' + }); + + // Events auslösen + emitOrderCreated(order); + + res.status(201).json({ + success: true, + data: order, + message: 'Bestellung erfolgreich erstellt' + }); + + } catch (error: any) { + if (error.name === 'ZodError') { + return res.status(400).json({ + success: false, + error: 'Validierungsfehler', + details: error.errors + }); + } + + console.error('Fehler beim Erstellen der Bestellung:', error); + res.status(500).json({ + success: false, + error: 'Interner Serverfehler' + }); + } +}); + +app.use((err: Error, req: Request, res: Response, next: NextFunction) => { + console.error(err.stack); + res.status(500).json({ + success: false, + error: 'Etwas ist schiefgelaufen!' + }); +}); + +// Datenbank initialisieren und Server starten +async function startServer() { + try { + await initDatabase(); + + app.listen(PORT, () => { + console.log(`Server läuft auf http://localhost:${PORT}`); + }); + } catch (err) { + console.error('DB Init fehlgeschlagen:', err); + process.exit(1); + } +} + +// Server nur starten, wenn nicht im Test-Modus +if (process.env.NODE_ENV !== 'test') { + startServer(); +} + +export default app; diff --git a/backend/src/simulate/events.ts b/backend/src/simulate/events.ts new file mode 100644 index 0000000..8ed13f2 --- /dev/null +++ b/backend/src/simulate/events.ts @@ -0,0 +1,23 @@ +import { Order } from '../types'; + +// Event system simulation +export function emitOrderCreated(order: Order): void { + console.log('Event: Order Created', order.orderNumber); + + // Simulate different system + simulateShipping(order); + simulateWarehouse(order); + simulateEmail(order); +} + +function simulateShipping(order: Order): void { + console.log(`Shipping: New order ${order.id}`); +} + +function simulateWarehouse(order: Order): void { + console.log(`Warehouse: Prepare items for order ${order.id}`); +} + +function simulateEmail(order: Order): void { + console.log(`Email: Sending confirmation to ${order.customerEmail}`); +} diff --git a/backend/src/test/server.test.ts b/backend/src/test/server.test.ts new file mode 100644 index 0000000..795eaa6 --- /dev/null +++ b/backend/src/test/server.test.ts @@ -0,0 +1,90 @@ +import request from 'supertest'; +import app from '../server'; +import { initDatabase } from '../database'; + +beforeAll(async () => { + await initDatabase(); +}); + +describe('POST /orders', () => { + it('should create a new order', async () => { + const orderData = { + customerId: 'CUST1', + customerName: 'Lui Denkwerk', + customerEmail: 'lui@test.com', + items: [ + { + productId: 'TEST1', + quantity: 2, + price: 29.99 + } + ], + shippingAddress: { + street: 'teststraße 123', + city: 'Grevenbroich', + postalCode: '41515', + country: 'DE' + } + }; + + const response = await request(app) + .post('/orders') + .send(orderData) + .expect(201); + + expect(response.body.success).toBe(true); + expect(response.body.data).toHaveProperty('id'); + expect(response.body.data.totalAmount).toBe(59.98); + }); + + it('should reject invalid email', async () => { + const invalidData = { + customerId: 'CUST1', + customerName: 'Lui Denkwerk', + customerEmail: 'nomailstring', + items: [{ productId: 'TEST1', quantity: 1, price: 29.99 }], + shippingAddress: { + street: 'teststraße 123', + city: 'Grevenbroich', + postalCode: '41515', + country: 'DE' + } + }; + + const response = await request(app) + .post('/orders') + .send(invalidData) + .expect(400); + + expect(response.body.success).toBe(false); + }); + + it('should require all fields', async () => { + const response = await request(app) + .post('/orders') + .send({}) + .expect(400); + + expect(response.body.success).toBe(false); + }); + + it('should reject negative quantity', async () => { + const invalidData = { + customerId: 'CUST1', + customerName: 'Lui Denkwerk', + customerEmail: 'lui@test.com', + items: [{ productId: 'NOTISCH1', quantity: -1, price: 29.99 }], + shippingAddress: { + street: 'teststraße 123', + city: 'Grevenbroich', + postalCode: '41515', + country: 'DE' + } + }; + + await request(app) + .post('/orders') + .send(invalidData) + .expect(400); + }); +}); diff --git a/backend/src/types.ts b/backend/src/types.ts new file mode 100644 index 0000000..ae6f8c1 --- /dev/null +++ b/backend/src/types.ts @@ -0,0 +1,25 @@ +export interface OrderItem { + productId: string; + quantity: number; + price: number; +} + +export interface ShippingAddress { + street: string; + city: string; + postalCode: string; + country: string; +} + +export interface Order { + id?: number; + orderNumber?: string; + customerId: string; + customerName: string; + customerEmail: string; + items: OrderItem[]; + shippingAddress: ShippingAddress; + totalAmount: number; + status?: string; + createdAt?: string; +} diff --git a/backend/src/validation.ts b/backend/src/validation.ts new file mode 100644 index 0000000..9f1119c --- /dev/null +++ b/backend/src/validation.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; + +// Validation schemas mit Zod +export const orderSchema = z.object({ + customerId: z.string().min(1, 'Kunden-ID ist erforderlich'), + customerName: z.string().min(2, 'Name zu kurz'), + customerEmail: z.string().email('Ungültige E-Mail'), + items: z.array( + z.object({ + productId: z.string().min(1), + quantity: z.number().int().positive(), + price: z.number().positive(), + }) + ).min(1, 'Mindestens ein Artikel erforderlich'), + shippingAddress: z.object({ + street: z.string().min(1), + city: z.string().min(1), + postalCode: z.string().min(1), + country: z.string().min(2), + }), +}); + +export type OrderInput = z.infer; diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..5071b25 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "moduleResolution": "node" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts"] +} + diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..7a42340 --- /dev/null +++ b/data/.gitkeep @@ -0,0 +1 @@ +# SQLite database will be created here diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..fde0f40 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,25 @@ +version: '3.8' + +services: + backend: + build: + context: ./backend + dockerfile: Dockerfile + ports: + - "3990:3990" + volumes: + - ./data:/app/data + environment: + - NODE_ENV=production + - PORT=3990 + restart: unless-stopped + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + ports: + - "3980:80" + depends_on: + - backend + restart: unless-stopped diff --git a/docs/ANLEITUNG.md b/docs/ANLEITUNG.md new file mode 100644 index 0000000..cb8b73a --- /dev/null +++ b/docs/ANLEITUNG.md @@ -0,0 +1,115 @@ +# Setup Anleitung + +Quick Start Guide für das OMS + +## Voraussetzungen + +- Node.js 18+ +- npm +- Docker (optional) + +## Installation + +### Variante 1: Docker (empfohlen) + +```bash +docker compose up +``` + +Das war's! +- Backend läuft auf http://localhost:3990 +- Frontend läuft auf http://localhost:3980 + +### Variante 2: Lokal + +```bash +# Dependencies installieren +npm run install:all + +# In zwei separaten Terminals: +npm run dev # Backend (Terminal 1) +npm run dev:frontend # Frontend (Terminal 2) +``` + +## API Testen + +### Mit Browser +1. Frontend öffnen: http://localhost:3980 +2. Formular ausfüllen +3. Bestellung abschicken + +### Mit curl +```bash +curl -X POST http://localhost:3990/orders \ + -H "Content-Type: application/json" \ + -d '{ + "customerId": "DW001", + "customerName": "Lui Denkwerk", + "customerEmail": "lui@test.de", + "items": [{ + "productId": "TISCH1", + "quantity": 1, + "price": 200.80 + }], + "shippingAddress": { + "street": "Hauptstr. 1", + "city": "Grevenbroich", + "postalCode": "41515", + "country": "DE" + } + }' +``` + +## Tests ausführen + +```bash +npm test +``` + +## Production Build + +```bash +npm run build +npm start +``` + +## Troubleshooting + +### Port schon belegt +Backend läuft auf Port 3990 +Frontend auf 3980 + +Ändern in: +- `backend/src/server.ts` -> PORT Konstante +- `frontend/vite.config.ts` -> proxy config + +### DB Fehler +Die SQLite DB wird automatisch unter `./data/orders.db` erstellt. +Falls Probleme: `rm -rf data/` und neu starten + +### Docker Probleme +```bash +docker compose down +docker compose build --no-cache +docker compose up +``` + +## Wichtige Hinweise + +- SQLite DB wird beim ersten Start automatisch angelegt +- Events werden in der Console geloggt (Simulation) +- Backend Port ist 3990 +- Frontend Proxy leitet `/orders` requests an Backend weiter +- In Production PostgreSQL statt SQLite verwenden + +## Nächste Schritte + +Für Production: +1. PostgreSQL Setup +2. Environment Variables (`.env`) +3. JWT Auth implementieren +4. Message Queue für Events +5. Monitoring Setup +6. CI/CD Pipeline + +--- \ No newline at end of file diff --git a/docs/ARCHITEKTUR.md b/docs/ARCHITEKTUR.md new file mode 100644 index 0000000..55f03ec --- /dev/null +++ b/docs/ARCHITEKTUR.md @@ -0,0 +1,141 @@ +# Architektur-Übersicht + +Order Management System - Systemdesign und Entscheidungen + +## Komponenten + +### 1. API Layer (Backend) +- **Framework**: Express.js mit TypeScript +- **Port**: 3990 +- **Validierung**: Zod für Runtime-Checks +- **API-Endpunkte**: + - `POST /orders` - Neue Bestellung erstellen + - `GET /health` - Health Check + +### 2. Datenhaltung +- **Datenbank**: SQLite3 +- **Pfad**: `./data/orders.db` +- **Schema**: +```sql +CREATE TABLE orders ( + id INTEGER PRIMARY KEY, + orderNumber TEXT UNIQUE, + customerId TEXT, + customerName TEXT, + customerEmail TEXT, + items TEXT, -- JSON to Convert + shippingAddress TEXT, -- JSON to Convert + totalAmount REAL, + status TEXT, + createdAt TEXT +); +``` + +**Warum SQLite?** +- Zero-config, einfach zu deployen +- Keine externe DB nötig für On-Premise +- Für Production würde ich auf PostgreSQL wechseln + +### 3. Event-System +Simuliert mit Console-Logs. Events werden an folgende Systeme geschickt: +- Versand-Service +- Lager-System +- E-Mail-Service + +### 4. Frontend +- **Framework**: React 18 + TypeScript +- **UI Library**: Material UI 5 +- **Build**: Vite + + +## Deployment-Strategie + +### Docker Compose +Zwei Container: +1. **Backend** (Node.js) +2. **Frontend** (Nginx) + + + +### On-Premise Deployment +1. `docker compose up` auf Kundenserver +2. SQLite DB im Volume gemounted +3. Kein externes Setup nötig + +### Skalierung (für später) +- **Horizontal**: Mehrere Backend-Instanzen mit Load Balancer +- **DB**: PostgreSQL +- **Cache**: Redis für Sessions/Performance + +## Sicherheit + +### Aktuell implementiert: +- Input-Validierung mit Zod +- CORS aktiviert +- SQL Injection durch Prepared Statements verhindert + +### Für Production: +- [ ] JWT Authentication +- [ ] Rate Limiting (express-rate-limit) +- [ ] API Keys für Service-to-Service (X-API-Key) + +## Monitoring & Logging + +### Aktuell: +- Console Logs +- Error Stack Traces + +## Fehlerhandling + +### API-Level +```typescript +try { + // validation + // business logic +} catch (error) { + if (error.name === 'ZodError') { + return 400 // Bad Request + } + return 500 // Internal Error +} +``` + +### DB-Level +- Promises mit try/catch +- Graceful degradation +- Transaction Support (für später) + +### Frontend +- Axios error handling +- User feedback mit Material UI Alerts +- Form validation + +## Design-Entscheidungen + +### TypeScript +**Pro**: Type Safety, Enteprise Version von Javascript :P +**Contra**: Etwas mehr Setup + +### SQLite vs PostgreSQL +**Gewählt**: SQLite für einfaches Setup +**Grund**: Challenge-Kontext, On-Premise ohne Komplexität +**Migration**: In Production auf PostgreSQL umstellen + +### Material UI vs Custom CSS +**Gewählt**: Material UI +**Grund**: Schnelle Entwicklung, professionelles Aussehen + +### Event-Simulation +**Aktuell**: Console Logs +**Grund**: ausreichend für aufgabe + + +## Testing + +### Backend +```bash +npm test +``` +- Unit Tests mit Jest +- Integration Tests mit Supertest +- Mocked DB für schnelle Tests diff --git a/docs/aufgabe1-1.drawio.pdf b/docs/aufgabe1-1.drawio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b70b21f2948e950c3693095ec1c8acb03da06863 GIT binary patch literal 32711 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/docs/aufgabe1-architektur.md b/docs/aufgabe1-architektur.md new file mode 100644 index 0000000..8ebb5ec --- /dev/null +++ b/docs/aufgabe1-architektur.md @@ -0,0 +1,235 @@ +# Aufgabe 1 - Architekturentwurf + +## Überblick + +Ich hab mich für eine relativ klassische Architektur entschieden. Nichts fancy, aber sollte funktionieren. Der Gedanke war ein System zu bauen das: +- Beim Kunden einfach deployed werden kann (wer hat schon Lust auf kompliziertes Setup) +- Nicht overengineered ist (hab nur 4-6 Stunden) +- Aber trotzdem solid genug aussieht um damit zu arbeiten + +## 1. Komponenten + +### API Layer +**Was:** Express.js Backend mit TypeScript +**Warum Express?** Ehrlich gesagt weil ich's gut kenne. Hätte auch NestJS nehmen können aber das wäre für die Zeit zu viel gewesen. Express ist straightforward, es gibt Lösungen für alles auf StackOverflow, und ich kann schnell produktiv sein. + +**Port:** 3990 + +Die API ist simpel: +- `POST /orders` - Hauptfunktion +- `GET /orders` - Hab ich als Bonus dazugemacht weil man ja die Orders auch sehen will + +### Datenbank +**Was:** SQLite3 +**Warum?** Ok, das war eine bewusste Entscheidung. +- Keine DB-Installation nötig +- Eine Datei, fertig +- Backup ist ein simple file copy + + +**Schema:** +Relativ simpel gehalten. Order hat die basics, Items und Address hab ich als JSON gespeichert. Ich weiß, manche Leute mögen kein JSON in der DB, aber für sowas ist's meiner Meinung nach ok - wir machen keine komplexen Joins darauf und es bleibt flexibel. + +### Event-System +**Was:** Console Logs (Simulation) +**Warum so basic?** Weil ich zeigen wollte dass ich verstehe wie's funktionieren sollte, ohne jetzt ne ganze Message Queue aufzusetzen. In einem echten Projekt würde ich wahrscheinlich RabbitMQ nehmen (hab damit schon gearbeitet) oder wenn's viel Traffic ist Kafka, aber das ist dann halt ein anderes Level. + +Das Prinzip ist klar: Order wird erstellt → Event wird gefeuert → andere Services können reagieren. Momentan logge ich nur: +- "Shipping System: neue Order" +- "Warehouse: Artikel vorbereiten" +- "Email: Bestätigung schicken" + +Reicht glaub ich um die Idee rüberzubringen. + +### Validierung +**Was:** Zod +**Warum?** Hab's in einem Tutorial gesehen und fand's gut. Du kriegst Runtime-Validation und die TypeScript-Types automatisch. Besser als alles manuell zu checken. Die Syntax ist auch relativ clean. + +### Frontend +**Was:** React + Material UI + Vite +**Warum dieser Stack?** +- React weil ich's kann und's standard ist +- Material UI weil ich nicht alles selbst stylen wollte - in 30 min hab ich damit ein ok aussehendes UI +- Vite weil's schneller startet als Create React App und ich nicht ewig auf den dev server warten will + +Nicht die perfekte Wahl für jedes Projekt aber für die Challenge vollkommen ok. + +### Authentifizierung +**Was:** Nicht implementiert +**Warum?** Stand nicht in den Requirements und hätte echt Zeit gefressen. Wenn ich's machen müsste würde ich wahrscheinlich JWT nehmen, hab damit in anderen Projekten schon gearbeitet. Access token + refresh token pattern, standard halt. + +## 2. Datenfluss beim Erstellen einer Bestellung + +So läuft's ab (hoffe ich hab nichts vergessen): + +``` +1. User füllt Form aus + - React validiert schonmal das Basics (ist Email format ok, etc.) + +2. Submit → POST /orders ans Backend + - CORS ist allowed (hab ich configured) + +3. Backend: Zod Validation + - Checkt alle Felder + - Items array nicht leer? + - Prices sind numbers? + - etc. + - Wenn was fehlt → 400 zurück + +4. Business Logic + - Ich rechne den total amount aus (reduce über items) + - Generiere eine Order Number (hab einfach timestamp + random number genommen) + - Status = 'pending' + +5. Database Insert + - SQLite INSERT + - Items/Address werden zu JSON gestringified + - Wenn das fehlschlägt → 500 error + +6. Events triggern + - Console.logs für die verschiedenen Services + - In echt würden hier Messages in Queues gehen + +7. Response + - 201 Created + - Komplettes Order Object zurück + - Frontend zeigt Success Message + +8. Frontend reagiert + - Form wird resettet + - Success Alert erscheint + - (Optional könnte man zu Orders List redirecten) +``` + +Dauert normalerweise unter 100ms weil alles lokal ist. + +## 3. Deployment-Strategie + +### Docker +Ich hab Docker Compose genommen weil: +- Ich's kenne und schnell damit bin +- Funktioniert überall gleich (Mac, Linux, Windows) +- Kunde muss nur `docker compose up` machen +- Keine Abhängigkeits-Konflikte + +**Setup:** +2 Container - Backend und Frontend. Backend ist Node, Frontend wird mit nginx ausgeliefert. Hab multi-stage build verwendet um die Images kleiner zu halten. + +### On-Premise beim Kunden +Da's beim Kunden on-premise laufen soll hab ich's simpel gehalten: + +**Easy way:** +```bash +git clone +docker compose up -d +# done +``` + +Der Kunde braucht nur Docker installiert zu haben. + +**Wenn's professional sein soll:** +- Images in private Registry +- Kunde zieht nur die Images (kein source code) +- .env file für Config +- Backup-Script für die DB + +### CI/CD +Hab ich nicht implementiert (war ja nicht gefordert) aber wenn ich's machen würde: +- GitHub Actions (hab damit schon gearbeitet), workflow (gitea) +- Tests laufen lassen +- Images bauen +- Zu Registry pushen +- Optional auto-deploy zu staging + +## 4. Skalierbarkeit, Sicherheit, Monitoring & Fehlerhandling + +### Skalierbarkeit + +**Aktueller Stand:** Einzelne Instanz, sollte für kleinere Kunden ok sein + +**Wenn's größer wird:** + +Ehrlich gesagt hab ich da keine super viel Erfahrung mit high-scale Systems, aber was ich mir vorstellen würde: + +1. **Mehr Backend-Instanzen** + - Load Balancer davor (nginx kann das) + - SQLite wird dann zum Problem, also PostgreSQL + - Connection pooling nicht vergessen + +2. **Database Optimization** + - Indexes auf die richtigen Felder (orderNumber, customerId) + - Vielleicht Read Replicas wenn's viele GET requests gibt + - Oder gleich managed DB nehmen (weniger Stress) + +3. **Caching** (wenn nötig) + - Redis für häufige Queries + - Aber erstmal messen ob's wirklich gebraucht wird + +Ich würde ehrlich gesagt erstmal abwarten wo die Bottlenecks sind bevor ich zu viel optimiere. Premature optimization und so. + +### Sicherheit + +**Was drin ist:** +- Input Validation mit Zod +- SQL Injection kann nicht passieren (prepared statements) +- CORS ist an (aber nicht restricted - müsste man noch machen) + +Ich weiß dass da noch viel fehlt, aber für einen Prototyp sollte es ok sein. In einem echten Projekt würde man da mehr Zeit reinstecken. + +### Monitoring + +**Aktuell:** Console logs, super basic + +Viel mehr kann ich dazu ehrlich gesagt nicht sagen weil ich's nicht in Production betreut hab. Aber das wären so die basics die Sinn machen würden. + +### Fehlerhandling + +**Mein Approach:** + +Ich hab versucht die Errors sinnvoll zu kategorisieren: + +```typescript +try { + // business logic +} catch (error) { + if (error.name === 'ZodError') { + // User hat Müll geschickt + return 400 + } + // Irgendwas ist bei uns kaputt + console.error(error) + return 500 +} +``` + +**Was ich beachtet hab:** +- 400 = User-Fehler (falsche inputs) +- 500 = Server-Fehler (unser Problem) +- Nie stack traces an den User schicken (security) +- Alles loggen für debugging + +**Frontend Error Handling:** +- Try/catch um API calls +- User-freundliche Messages ("Bestellung konnte nicht erstellt werden" statt "500 Internal Server Error") +- Form bleibt gefüllt wenn's fehlschlägt (user muss nicht alles nochmal eingeben) + + +## Zusammenfassung & Ehrliche Einschätzung + +**Was ich anders machen würde mit mehr Zeit:** +- PostgreSQL von Anfang an (Migration ist nervig) +- Echte Message Queue für Events +- Auth System +- Mehr Tests (hab nur die wichtigsten) +- Admin Dashboard wäre cool + +**Nächste Schritte wenn's weitergeht:** +1. PostgreSQL Migration (wichtigste) +2. Message Queue (RabbitMQ maybe) +3. Auth hinzufügen (JWT) +4. Mehr Error handling +5. Production Monitoring setup + +Ich denke für eine Challenge ist das ein ok Ergebnis. Nicht perfekt, aber funktioniert und ist ein guter Ausgangspunkt. + +--- diff --git a/docs/aufgabe1.2.drawio.pdf b/docs/aufgabe1.2.drawio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a3dba84b9bad8e5ce1d4a3ee213feabea27499f GIT binary patch literal 33088 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 literal 0 HcmV?d00001 diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..c1570f5 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +dist-ssr +*.local +.env diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..809946d --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,16 @@ +FROM node:20 as build + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] + diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..539a33f --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Order Management System + + +
+ + + diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..401f841 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /orders { + proxy_pass http://backend:3990; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..778a6ab --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1663 @@ +{ + "name": "oms-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oms-frontend", + "version": "1.0.0", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.3", + "axios": "^1.6.5", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.48", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.3.3", + "vite": "^5.0.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.18.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.18.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.18.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "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.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.26", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.1", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.21", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.243", + "dev": true, + "license": "ISC" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "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", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "19.2.0", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "dev": true, + "license": "MIT", + "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/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..8c6450e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,26 @@ +{ + "name": "oms-frontend", + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@mui/material": "^5.15.3", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "axios": "^1.6.5" + }, + "devDependencies": { + "@types/react": "^18.2.48", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.3.3", + "vite": "^5.0.11" + } +} + diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..e5a3c89 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,334 @@ +import { useState } from 'react'; +import { + Container, + Paper, + Typography, + TextField, + Button, + Box, + Alert, + Card, + CardContent, + Grid, + MenuItem, + AppBar, + Toolbar, +} from '@mui/material'; +import axios from 'axios'; +import OrdersList from './OrdersList'; + +// Festes Produkt für die Challenge +const PRODUCT = { + id: 'DESK001', + name: 'Premium-Schreibtisch', + description: 'Höhenverstellbarer Schreibtisch mit Massivholzplatte', + price: 299.99, +}; + +interface FormData { + customerId: string; + customerName: string; + customerEmail: string; + quantity: number; + street: string; + city: string; + postalCode: string; + country: string; +} + +function App() { + const [view, setView] = useState<'form' | 'orders'>('form'); + const [formData, setFormData] = useState({ + customerId: '', + customerName: '', + customerEmail: '', + quantity: 1, + street: '', + city: '', + postalCode: '', + country: 'DE', + }); + + const [errors, setErrors] = useState>({}); + const [success, setSuccess] = useState(null); + const [loading, setLoading] = useState(false); + + const handleChange = (field: keyof FormData) => ( + e: React.ChangeEvent + ) => { + setFormData({ ...formData, [field]: e.target.value }); + setErrors({ ...errors, [field]: '' }); + }; + + const validate = (): boolean => { + const newErrors: Record = {}; + + if (!formData.customerId) newErrors.customerId = 'Pflichtfeld'; + if (!formData.customerName || formData.customerName.length < 2) { + newErrors.customerName = 'Mindestens 2 Zeichen'; + } + if (!formData.customerEmail || !formData.customerEmail.includes('@')) { + newErrors.customerEmail = 'Ungültige E-Mail'; + } + if (formData.quantity < 1) { + newErrors.quantity = 'Mindestens 1'; + } + if (!formData.street) newErrors.street = 'Pflichtfeld'; + if (!formData.city) newErrors.city = 'Pflichtfeld'; + if (!formData.postalCode) newErrors.postalCode = 'Pflichtfeld'; + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setSuccess(null); + + if (!validate()) return; + + setLoading(true); + + try { + const orderData = { + customerId: formData.customerId, + customerName: formData.customerName, + customerEmail: formData.customerEmail, + items: [ + { + productId: PRODUCT.id, + quantity: formData.quantity, + price: PRODUCT.price, + }, + ], + shippingAddress: { + street: formData.street, + city: formData.city, + postalCode: formData.postalCode, + country: formData.country, + }, + }; + + const response = await axios.post('/orders', orderData); + + setSuccess(`Bestellung erstellt! Nr: ${response.data.data.orderNumber}`); + + // Form reset + setFormData({ + customerId: '', + customerName: '', + customerEmail: '', + quantity: 1, + street: '', + city: '', + postalCode: '', + country: 'DE', + }); + } catch (error: any) { + if (error.response?.data?.details) { + const apiErrors: Record = {}; + error.response.data.details.forEach((err: any) => { + const field = err.path?.[0]; + if (field) apiErrors[field] = err.message; + }); + setErrors(apiErrors); + } else { + setErrors({ general: 'Fehler beim Erstellen der Bestellung' }); + } + } finally { + setLoading(false); + } + }; + + const total = PRODUCT.price * formData.quantity; + + if (view === 'orders') { + return setView('form')} />; + } + + return ( + <> + + + + Order Management System + + + + + + + + + Neue Bestellung erstellen + + + Füllen Sie das Formular aus, um eine Bestellung aufzugeben + + + {success && ( + + {success} + + )} + + {errors.general && ( + + {errors.general} + + )} + +
+ {/* Kundendaten */} + + Kundendaten + + + + + + + + + + + + + + + {/* Produkt */} + + Produkt + + + + + {PRODUCT.name} + + {PRODUCT.description} + + + € {PRODUCT.price.toFixed(2)} + + + + + + + + + Gesamt: € {total.toFixed(2)} + + + + {/* Lieferadresse */} + + Lieferadresse + + + + + + + + + + + + + + + Deutschland + Österreich + Schweiz + Italien + + + + + + + + +
+
+ + ); +} + +export default App; diff --git a/frontend/src/OrdersList.tsx b/frontend/src/OrdersList.tsx new file mode 100644 index 0000000..ac84922 --- /dev/null +++ b/frontend/src/OrdersList.tsx @@ -0,0 +1,153 @@ +import { useState, useEffect } from 'react'; +import { + Container, + Paper, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Chip, + Box, + Button, + Alert, +} from '@mui/material'; +import axios from 'axios'; + +interface Order { + id: number; + orderNumber: string; + customerId: string; + customerName: string; + customerEmail: string; + totalAmount: number; + status: string; + createdAt: string; +} + +interface OrdersListProps { + onBack: () => void; +} + +function OrdersList({ onBack }: OrdersListProps) { + const [orders, setOrders] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + loadOrders(); + }, []); + + const loadOrders = async () => { + try { + setLoading(true); + const response = await axios.get('/orders'); + setOrders(response.data.data || []); + } catch (err) { + setError('Fehler beim Laden der Bestellungen'); + console.error(err); + } finally { + setLoading(false); + } + }; + + const getStatusColor = (status: string) => { + switch (status.toLowerCase()) { + case 'pending': + return 'warning'; + case 'completed': + return 'success'; + case 'cancelled': + return 'error'; + default: + return 'default'; + } + }; + + if (loading) { + return ( + + Lädt... + + ); + } + + return ( + + + + Bestellübersicht + + + + + {error && ( + + {error} + + )} + + {orders.length === 0 ? ( + + + Noch keine Bestellungen vorhanden + + + ) : ( + + + + + Bestellnummer + Kunde + E-Mail + Betrag + Status + Datum + + + + {orders.map((order) => ( + + + + {order.orderNumber} + + + {order.customerName} + {order.customerEmail} + + € {order.totalAmount.toFixed(2)} + + + + + + {new Date(order.createdAt).toLocaleDateString('de-DE')} + + + ))} + +
+
+ )} + + + + Gesamt: {orders.length} Bestellung{orders.length !== 1 ? 'en' : ''} + + +
+ ); +} + +export default OrdersList; + diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..9b446b0 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..7844ad4 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} + diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..e428d50 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} + diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..019d5f7 --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + server: { + port: 3980, + proxy: { + '/orders': 'http://localhost:3990' + } + } +}) + diff --git a/package.json b/package.json new file mode 100644 index 0000000..840d14d --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "aufgabe-29102025-main", + "version": "1.0.0", + "description": "", + "private": true, + "scripts": { + "install:all": "cd backend && npm install && cd ../frontend && npm install", + "dev": "cd backend && npm run dev", + "dev:frontend": "cd frontend && npm run dev", + "build": "cd backend && npm run build && cd ../frontend && npm run build", + "start": "cd backend && npm start", + "test": "cd backend && npm test", + "test:watch": "cd backend && npm run test:watch" + }, + "keywords": [], + "author": "", + "license": "ISC" +}