diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..96b8bdf1 Binary files /dev/null and b/.DS_Store differ diff --git a/.cypress-cucumber-preprocessorrc.json b/.cypress-cucumber-preprocessorrc.json new file mode 100644 index 00000000..0ba642cc --- /dev/null +++ b/.cypress-cucumber-preprocessorrc.json @@ -0,0 +1,8 @@ +{ + "stepDefinitions": [ + "cypress/e2e/stepDefinitions/**/*.js" + ], + "messages": { + "enabled": false + } +} diff --git a/.gitignore b/.gitignore index 44e53725..7536c9e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,60 @@ +# Dependencies node_modules/ +package-lock.json + +# Build outputs server/dist/ client/build/ -# Cucumber test reports +# TypeScript +*.tsbuildinfo + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Environment +.env +.env.local + +# Test files +test-*.csv +test-*.xlsx +test-*.js + +# Cypress +cypress/videos/ +cypress/screenshots/ +cypress/downloads/ + +# Cucumber test reports (client-side) client/reports/ cucumber-report.* -# jest coverage directory +# Jest coverage directory coverage/ -# multer folder -tmp_data/ \ No newline at end of file +# Multer temporary folder +tmp_data/ + +# Notes +notes/ + +# Extra (local documentation files) +commit_log.txt +demo.csv +diff_log.txt +FEATURE_SUMMARY.md diff --git a/CYPRESS_SETUP.md b/CYPRESS_SETUP.md new file mode 100644 index 00000000..d16b7098 --- /dev/null +++ b/CYPRESS_SETUP.md @@ -0,0 +1,107 @@ +# Cypress + Cucumber Setup Guide + +## Installation Steps + +### 1. Install Dependencies + +Run the following command from the project root: + +```bash +npm install +``` + +This will install Cypress 15.7.0 and the Cucumber preprocessor along with all required dependencies. + +### 2. Verify Installation + +Check that Cypress was installed successfully: + +```bash +npx cypress --version +``` + +You should see output similar to: +``` +Cypress package version: 15.7.0 +Cypress binary version: 15.7.0 +``` + +### 3. Project Structure + +The following structure has been created: + +``` +cypress/ +├── e2e/ +│ ├── features/ # Gherkin .feature files go here +│ │ └── placeholder.feature +│ └── stepDefinitions/ # Step definition .js files go here +│ └── placeholder.js +├── fixtures/ # Test data files (CSV, JSON, etc.) +├── support/ +│ ├── commands.js # Custom Cypress commands +│ └── e2e.js # Global configuration +└── README.md + +Root files: +├── cypress.config.js # Main Cypress configuration +└── .cypress-cucumber-preprocessorrc.json # Cucumber preprocessor config +``` + +### 4. Running Tests + +Make sure both server and client are running before executing tests: + +**Terminal 1 - Start Server:** +```bash +cd server +npm run dev +``` + +**Terminal 2 - Start Client:** +```bash +cd client +npm start +``` + +**Terminal 3 - Run Cypress Tests:** + +Interactive mode (Test Runner UI): +```bash +npm run cypress:open +``` + +Headless mode (CI/CD): +```bash +npm run cypress:run +``` + +### 5. Next Steps + +The structure is now ready. You can: +- Add actual `.feature` files in `cypress/e2e/features/` +- Implement step definitions in `cypress/e2e/stepDefinitions/` +- Add test fixtures (upload files, etc.) in `cypress/fixtures/` + +### Configuration Details + +**cypress.config.js:** +- Base URL: `http://localhost:3004` (React client) +- Spec pattern: `cypress/e2e/features/**/*.feature` +- Cucumber preprocessor integration with Browserify + +**.cypress-cucumber-preprocessorrc.json:** +- Step definitions path: `cypress/e2e/stepDefinitions/**/*.js` +- Uses require() syntax as per Cucumber preprocessor standards + +**Custom Commands (cypress/support/commands.js):** +- `cy.cleanupTestData()` - Delete test data via API +- `cy.createTestClass()` - Create a class via API +- `cy.createTestStudent()` - Create a student via API + +### Important Notes + +1. **Syntax:** Always use `const { Given, When, Then } = require("@badeball/cypress-cucumber-preprocessor");` +2. **Language:** Code in English, with explanatory comments +3. **Self-contained tests:** Create and cleanup data within each test +4. **API endpoints:** Server runs on port 3001, Client on port 3004 diff --git a/README.md b/README.md index 17caa633..a5fad1d6 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,57 @@ The server provides a REST API: The application uses ports 3005 and 3004 to avoid conflicts with other applications that might be using ports 3000-3003. +## Running Cucumber Tests + +### Method 1: Using the Test Runner Script (Recommended) + +```bash +# From the client directory +./run-cucumber-tests.sh +``` + +This script will: +- Check if both server and client are running +- Run all Cucumber tests +- Generate HTML and JSON reports + +### Method 2: Manual Execution + +```bash +# From the client directory +npm run test -- --watchAll +``` + +### Details + +Testing with cucumber is further detailed in the /client/CUCUMBER_TESTING.md file. + +## Running Cypress Tests + +### Option 1: Interactive Mode (Cypress Test Runner) + +Open the Cypress Test Runner UI: +```bash +npx cypress run open +``` + +1. Select "E2E Testing" +2. Choose your browser +3. Click on `classComparison.feature` +4. Watch the test run in real-time + +### Option 2: Headless Mode (CI/CD) + +Run all tests in headless mode: +```bash +npx cypress run +``` + +Or run a specific feature, e.g.: +```bash +npx cypress run --spec "cypress/e2e/features/classComparison.feature" +``` + ## License ISC \ No newline at end of file diff --git a/client/CUCUMBER_TESTING.md b/client/CUCUMBER_TESTING.md index 2c6b4854..f6b824cb 100644 --- a/client/CUCUMBER_TESTING.md +++ b/client/CUCUMBER_TESTING.md @@ -27,14 +27,7 @@ This script will: ```bash # From the client directory -npm run test:cucumber -``` - -### Method 3: Watch Mode (for development) - -```bash -# From the client directory -npm run test:cucumber:watch +npm run test -- --watchAll ``` ## 🧪 Test Structure diff --git a/client/cucumber.js b/client/cucumber.js index d4ecbe35..b7aae692 100644 --- a/client/cucumber.js +++ b/client/cucumber.js @@ -1,7 +1,7 @@ module.exports = { default: { + requireModule: ['ts-node/register'], require: [ - 'ts-node/register', 'src/step-definitions/**/*.ts' ], format: [ @@ -12,7 +12,6 @@ module.exports = { formatOptions: { snippetInterface: 'async-await' }, - paths: ['src/features/**/*.feature'], - requireModule: ['ts-node/register'] + paths: ['src/features/**/*.feature'] } }; \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 7089679f..fae24a8c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -10,7 +10,9 @@ "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.30.2", + "react-scripts": "5.0.1", + "recharts": "^3.5.1" }, "devDependencies": { "@cucumber/cucumber": "^12.2.0", @@ -21,6 +23,7 @@ "@types/puppeteer": "^5.4.7", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "cross-env": "^10.1.0", "expect": "^27.5.1", "jest-cucumber": "^4.5.0", "puppeteer": "^24.30.0", @@ -2915,6 +2918,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -3508,6 +3518,51 @@ "node": ">=18" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.1.tgz", + "integrity": "sha512-HjhlEREguAyBTGNzRlGNiDHGQ2EjLSPWwdhhpoEqHYy8hWak3Dp6/fU72OfqVsiMb8S6rbfPsWUF24fxpilrVA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.0.1.tgz", + "integrity": "sha512-naDCyggtcBWANtIrjQEajhhBEuL9b0Zg4zmlWK2CzS6xCWSE39/vvf4LqnMjUAWHBhot4m9MHCM/Z+mfWhUkiA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz", + "integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3606,6 +3661,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -4088,6 +4155,69 @@ "@types/node": "*" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "8.56.12", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", @@ -4457,7 +4587,7 @@ "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/puppeteer": { @@ -4492,7 +4622,7 @@ "version": "18.3.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -4592,6 +4722,12 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", @@ -6581,6 +6717,15 @@ "node": ">=12" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6920,6 +7065,24 @@ "devOptional": true, "license": "MIT" }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7323,9 +7486,130 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -7430,6 +7714,12 @@ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8111,6 +8401,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", + "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -10472,6 +10772,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/ip-address": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", @@ -15296,7 +15605,32 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "license": "MIT", + "peer": true + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } }, "node_modules/react-refresh": { "version": "0.11.0", @@ -15308,6 +15642,38 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.30.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz", + "integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz", + "integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.1", + "react-router": "6.30.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -16490,6 +16856,52 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.5.1.tgz", + "integrity": "sha512-+v+HJojK7gnEgG6h+b2u7k8HH7FhyFUzAc4+cPrsjL4Otdgqr/ecXzAnHciqlzV1ko064eNcsdzrYOM78kankA==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/recharts/node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -16516,6 +16928,22 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT", + "peer": true + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", @@ -16706,6 +17134,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -18802,6 +19236,12 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -19345,6 +19785,15 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-arity": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", @@ -19424,6 +19873,28 @@ "node": ">= 0.8" } }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/client/package.json b/client/package.json index c6d61325..d5a5206a 100644 --- a/client/package.json +++ b/client/package.json @@ -5,7 +5,9 @@ "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.30.2", + "react-scripts": "5.0.1", + "recharts": "^3.5.1" }, "devDependencies": { "@cucumber/cucumber": "^12.2.0", @@ -16,6 +18,7 @@ "@types/puppeteer": "^5.4.7", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "cross-env": "^10.1.0", "expect": "^27.5.1", "jest-cucumber": "^4.5.0", "puppeteer": "^24.30.0", @@ -23,11 +26,11 @@ "typescript": "^4.9.5" }, "scripts": { - "start": "PORT=3004 react-scripts start", + "start": "cross-env PORT=3004 react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "test:cucumber": "npx cucumber-js --config cucumber.js", - "test:cucumber:watch": "npx cucumber-js --config cucumber.js --watch", + "test:cucumber": "TS_NODE_PROJECT=tsconfig.test.json npx cucumber-js --config cucumber.js", + "test:cucumber:watch": "TS_NODE_PROJECT=tsconfig.test.json npx cucumber-js --config cucumber.js --watch", "eject": "react-scripts eject" }, "eslintConfig": { diff --git a/client/run-cucumber-tests.sh b/client/run-cucumber-tests.sh index a704d264..4b83642b 100755 --- a/client/run-cucumber-tests.sh +++ b/client/run-cucumber-tests.sh @@ -44,7 +44,7 @@ echo "🚀 Running Cucumber tests..." echo "" # Run the tests -npm run test:cucumber +npm run test -- --watchAll echo "" echo "📊 Test reports generated in the 'reports' directory" diff --git a/client/src/App.css b/client/src/App.css index 8cabd26f..1410c11e 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -754,21 +754,13 @@ tbody tr:last-child td { /* Update enroll button in table */ .enroll-btn { - background-color: #3b82f6; + background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); color: white; - border: none; - padding: 0.5rem 0.75rem; - border-radius: 4px; - cursor: pointer; - font-size: 0.875rem; - font-weight: 500; - margin-left: 0.5rem; - transition: background-color 0.2s; - min-width: auto; } .enroll-btn:hover { - background-color: #2563eb; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3); } /* Evaluations Table */ @@ -1192,4 +1184,1213 @@ tbody tr:last-child td { .evaluation-select option[value="MANA"] { background-color: #fecaca; color: #991b1b; -} \ No newline at end of file +} + +/* Actions Grid - 2x2 Button Layout */ +.actions-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.5rem; + width: 100%; +} + +.actions-grid button { + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + border: none; + border-radius: 6px; + cursor: pointer; + font-weight: 500; + transition: all 0.2s ease; + min-width: 0; + width: 100%; + text-align: center; + white-space: nowrap; +} + +/* Report Button */ +.report-btn { + background: linear-gradient(135deg, #f6ab3b 0%, #ffa620 100%); + color: white; +} + +.report-btn:hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3); +} + +/* Report Modal */ +.report-modal { + background-color: white; + border-radius: 12px; + width: 90%; + max-width: 1000px; + max-height: 90vh; + overflow: hidden; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + display: flex; + flex-direction: column; +} + +.report-modal-content { + padding: 1.5rem; + overflow-y: auto; + flex: 1; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.loading-report { + text-align: center; + padding: 3rem; + color: #6b7280; +} + +.no-report-data { + text-align: center; + padding: 3rem; + color: #6b7280; +} + +/* Report Statistics Grid - Two Columns */ +.report-stats-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1.5rem; + margin-bottom: 1rem; +} + +.report-stat-card { + background-color: #f8fafc; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 1.5rem; +} + +.report-stat-card h4 { + margin: 0 0 1rem 0; + color: #374151; + font-size: 1.1rem; + font-weight: 600; + border-bottom: 2px solid #667eea; + padding-bottom: 0.5rem; +} + +.stat-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem 0; + border-bottom: 1px solid #e5e7eb; +} + +.stat-item:last-child { + border-bottom: none; +} + +.stat-label { + font-weight: 500; + color: #6b7280; + font-size: 0.95rem; +} + +.stat-value { + font-weight: 700; + color: #111827; + font-size: 1.5rem; +} + +.stat-value.approved { + color: #10b981; +} + +.stat-value.not-approved { + color: #ef4444; +} + +/* Evaluation Performance Section */ +.evaluation-performance { + background-color: #f8fafc; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 1.5rem; +} + +.evaluation-performance h4 { + margin: 0 0 1rem 0; + color: #374151; + font-size: 1.1rem; + font-weight: 600; + border-bottom: 2px solid #667eea; + padding-bottom: 0.5rem; +} + +.no-evaluations { + text-align: center; + padding: 2rem; + color: #6b7280; + font-style: italic; +} + +.performance-table { + width: 100%; + border-collapse: collapse; + margin-top: 0.5rem; + background-color: white; +} + +.performance-table th, +.performance-table td { + border: 1px solid #e5e7eb; + padding: 0.75rem; + text-align: center; +} + +.performance-table th { + background-color: #667eea; + color: white; + font-weight: 600; + font-size: 0.9rem; +} + +.performance-table th:first-child { + text-align: left; +} + +.performance-table td:first-child { + text-align: left; + font-weight: 600; + color: #374151; +} + +.performance-table tbody tr:hover { + background-color: #f9fafb; +} + +.performance-table .grade-ma { + background-color: #d1fae5; + color: #065f46; + font-weight: 600; +} + +.performance-table .grade-mpa { + background-color: #fef3c7; + color: #92400e; + font-weight: 600; +} + +.performance-table .grade-mana { + background-color: #fecaca; + color: #991b1b; + font-weight: 600; +} + +/* Report Footer */ +.report-footer { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid #e5e7eb; +} + +.report-timestamp { + text-align: center; + color: #6b7280; + font-size: 0.875rem; + font-style: italic; + margin: 0; +} + +/* Student Results Section */ +.students-results { + background-color: #f8fafc; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 1.5rem; + margin-top: 1.5rem; +} + +.students-results h4 { + margin: 0 0 1rem 0; + color: #374151; + font-size: 1.1rem; + font-weight: 600; + border-bottom: 2px solid #667eea; + padding-bottom: 0.5rem; +} + +.students-table { + width: 100%; + border-collapse: collapse; + margin-top: 0.5rem; + background-color: white; +} + +.students-table th, +.students-table td { + border: 1px solid #e5e7eb; + padding: 0.75rem; + text-align: center; +} + +.students-table th { + background-color: #667eea; + color: white; + font-weight: 600; + font-size: 0.9rem; +} + +.students-table th:first-child { + text-align: left; +} + +.students-table td:first-child { + text-align: left; + font-weight: 600; + color: #374151; +} + +.students-table tbody tr:hover { + background-color: #f9fafb; +} + +/* Student Status Colors */ +.status-approved { + background-color: #d1fae5; + color: #065f46; + font-weight: 600; +} + +.status-approved-final { + background-color: #dbeafe; + color: #1e40af; + font-weight: 600; +} + +.status-failed { + background-color: #fecaca; + color: #991b1b; + font-weight: 600; +} + +.status-failed-by-absence { + background-color: #fed7aa; + color: #9a3412; + font-weight: 600; +} + +.status-pending { + background-color: #fef3c7; + color: #92400e; + font-weight: 600; +} + +/* Report Actions */ +.report-actions { + display: flex; + justify-content: flex-end; + gap: 1rem; + padding: 1.5rem; + border-top: 1px solid #e5e7eb; +} + +/* Responsive Design for Report */ +@media (max-width: 768px) { + .report-stats-grid { + grid-template-columns: 1fr; + } + + .actions-grid { + grid-template-columns: 1fr; + max-width: none; + } + + .performance-table { + font-size: 0.8rem; + } + + .performance-table th, + .performance-table td { + padding: 0.5rem 0.25rem; + } + + .students-table { + font-size: 0.8rem; + } + + .students-table th, + .students-table td { + padding: 0.5rem 0.25rem; + } + + .stat-value { + font-size: 1.25rem; + } +} + +/* Class Comparison Styles */ +.checkbox-col { + width: 50px; + text-align: center; +} + +.checkbox-col input[type="checkbox"] { + cursor: pointer; + width: 18px; + height: 18px; +} + +/* Comparison Controls */ +.comparison-controls { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + background-color: #f9fafb; + border-top: 1px solid #e5e7eb; + border-bottom: 1px solid #e5e7eb; + gap: 1rem; +} + +.selection-info { + margin: 0; + color: #6b7280; + font-weight: 500; + font-size: 0.95rem; +} + +/* select-first-btn removed */ + +.compare-btn { + padding: 0.75rem 1.5rem; + background-color: #3b82f6; + color: white; + border: none; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + font-size: 0.95rem; + white-space: nowrap; +} + +.compare-btn:hover:not(:disabled) { + background-color: #2563eb; + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3); +} + +.compare-btn:disabled { + background-color: #d1d5db; + color: #6b7280; + cursor: not-allowed; +} + +/* Comparison Modal */ +.comparison-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1001; + overflow-y: auto; +} + +.comparison-modal { + background-color: white; + border-radius: 12px; + width: 90%; + max-width: 1200px; + max-height: 90vh; + overflow: hidden; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + display: flex; + flex-direction: column; + margin: auto; +} + +.comparison-modal-header { + padding: 1.5rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + display: flex; + justify-content: space-between; + align-items: center; +} + +.comparison-modal-header h3 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; +} + +.comparison-modal-content { + padding: 1.5rem; + overflow-y: auto; + flex: 1; +} + +.comparison-error { + background-color: #fee; + color: #c53030; + border: 1px solid #fc8181; + border-radius: 8px; + padding: 1rem; + margin-bottom: 1.5rem; +} + +.comparison-reports-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 1.5rem; +} + +.comparison-report-card { + background: white; + border: 2px solid #e5e7eb; + border-radius: 12px; + overflow: hidden; + transition: all 0.3s; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); +} + +.comparison-report-card:hover { + border-color: #3b82f6; + box-shadow: 0 12px 24px rgba(59, 130, 246, 0.15); +} + +.report-card-header { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + padding: 1rem; + border-bottom: 2px solid #e5e7eb; +} + +.report-card-header h4 { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; +} + +.report-card-meta { + margin: 0; + font-size: 0.9rem; + opacity: 0.9; +} + +.report-card-content { + padding: 1rem; + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.metric-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + border-radius: 6px; + background-color: #f9fafb; + transition: background-color 0.2s; +} + +.metric-row:hover { + background-color: #f3f4f6; +} + +.metric-row.approved { + background-color: #d1fae5; +} + +.metric-row.failed { + background-color: #fee; +} + +.metric-label { + font-weight: 600; + color: #4a5568; + font-size: 0.9rem; +} + +.metric-value { + font-weight: 700; + font-size: 1.1rem; + color: #2d3748; +} + +.metric-row.approved .metric-value { + color: #059669; +} + +.metric-row.failed .metric-value { + color: #dc2626; +} + +/* Comparison Actions */ +.comparison-actions { + display: flex; + justify-content: flex-end; + gap: 1rem; + padding: 1.5rem; + border-top: 1px solid #e5e7eb; + background-color: #f9fafb; +} + +/* Comparison Error Modal */ +.comparison-error-modal { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: white; + border-radius: 12px; + padding: 2rem; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + z-index: 1002; + max-width: 400px; + border: 1px solid #e5e7eb; +} + +.error-content { + text-align: center; +} + +.error-content h4 { + color: #dc2626; + margin-bottom: 1rem; + font-size: 1.2rem; +} + +.error-content p { + color: #6b7280; + margin-bottom: 1.5rem; + line-height: 1.5; +} + +.ok-btn { + padding: 0.75rem 1.5rem; + background-color: #3b82f6; + color: white; + border: none; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.ok-btn:hover { + background-color: #2563eb; +} + +/* Responsive Design for Comparison */ +@media (max-width: 768px) { + .comparison-reports-container { + grid-template-columns: 1fr; + } + + .comparison-controls { + flex-direction: column; + align-items: stretch; + } + + .compare-btn { + width: 100%; + } + + .comparison-modal { + width: 95%; + max-height: 85vh; + } +} + +/* Comparison View Selector */ +.comparison-view-selector { + display: flex; + gap: 1rem; + padding: 1rem 1.5rem; + background-color: #f3f4f6; + border-bottom: 1px solid #e5e7eb; + justify-content: center; +} + +.view-btn { + padding: 0.75rem 1.5rem; + border: 2px solid #d1d5db; + background-color: white; + color: #4a5568; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + font-size: 0.95rem; +} + +.view-btn:hover { + border-color: #3b82f6; + color: #3b82f6; +} + +.view-btn.active { + background-color: #3b82f6; + color: white; + border-color: #3b82f6; +} + +/* Comparison Charts Container */ +.comparison-charts-container { + padding: 1.5rem; +} + +.chart-selector { + display: flex; + gap: 0.75rem; + margin-bottom: 2rem; + flex-wrap: wrap; + justify-content: center; +} + +.chart-btn { + padding: 0.6rem 1.2rem; + border: 2px solid #e5e7eb; + background-color: white; + color: #4a5568; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + font-size: 0.9rem; +} + +.chart-btn:hover { + border-color: #8b5cf6; + color: #8b5cf6; +} + +.chart-btn.active { + background-color: #8b5cf6; + color: white; + border-color: #8b5cf6; +} + +.chart-wrapper { + background-color: white; + border-radius: 8px; + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.chart-wrapper h4 { + font-size: 1.1rem; + color: #2d3748; + margin-bottom: 1rem; + text-align: center; +} + +/* Recharts Customization */ +.recharts-wrapper { + width: 100%; +} + +.recharts-surface { + overflow: visible; +} + +.recharts-tooltip { + background-color: white !important; + border: 1px solid #d1d5db !important; + border-radius: 6px !important; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1) !important; +} + +.recharts-tooltip-wrapper { + outline: none; +} + +.recharts-legend { + padding-top: 1rem; +} + +.recharts-legend-item { + color: #4a5568; +} + +.recharts-bar { + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.05)); +} + +.recharts-cartesian-axis-tick-value { + font-size: 12px; + color: #6b7280; +} + +/* Chart Info Box */ +.chart-info { + background-color: #eff6ff; + border-left: 4px solid #3b82f6; + padding: 1rem; + border-radius: 4px; + margin-top: 1rem; +} + +.chart-info p { + color: #1e40af; + font-size: 0.9rem; + margin: 0; +} + +/* Responsive Charts */ +@media (max-width: 768px) { + .comparison-view-selector { + flex-direction: column; + } + + .view-btn { + width: 100%; + } + + .chart-selector { + flex-direction: column; + } + + .chart-btn { + width: 100%; + } + + .chart-wrapper { + padding: 1rem; + } + + .recharts-cartesian-axis-tick-value { + font-size: 10px; + } +} + +/* Comparison add/remove/export button styling */ +.comparison-add-controls { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.comparison-add-controls select { + padding: 0.5rem 0.75rem; + border: 1px solid #d1d5db; + border-radius: 6px; + background: white; + color: #374151; +} + +.add-class-btn { + padding: 0.5rem 0.75rem; + background: #10b981; + color: white; + border: none; + border-radius: 6px; + cursor: pointer; + font-weight: 600; +} + +.add-class-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.export-btn { + padding: 0.45rem 0.8rem; + background: #3b82f6; + color: white; + border: none; + border-radius: 6px; + cursor: pointer; + font-weight: 600; + margin-right: 0.5rem; +} + +.remove-class-btn { + padding: 0.25rem 0.5rem; + background: #ef4444; + color: white; + border: none; + border-radius: 6px; + cursor: pointer; + font-weight: 600; + float: right; +} + +.comparison-header-actions { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + flex-wrap: wrap; + gap: 10px; +} + +.section-header h4 { + font-size: 1.1rem; + color: #333; + margin: 0; +} + +.filter-group { + display: flex; + align-items: center; + gap: 12px; + background-color: #f8f9fa; + padding: 8px 12px; + border-radius: 8px; + border: 1px solid #eee; +} + +.filter-control { + display: flex; + align-items: center; + gap: 8px; +} + +.filter-control label { + font-size: 0.85rem; + color: #555; + font-weight: 500; + white-space: nowrap; +} + +.filter-select { + padding: 6px 10px; + border: 1px solid #ddd; + border-radius: 6px; + font-size: 0.9rem; + background-color: white; + cursor: pointer; + outline: none; +} + +.filter-select:focus { + border-color: #4a90e2; +} + +.filter-input-x { + width: 70px; + padding: 6px 8px; + border: 1px solid #ddd; + border-radius: 6px; + font-size: 0.9rem; + text-align: center; +} + +.avg-indicator { + font-size: 0.8rem; + color: #666; + font-style: italic; + background-color: #e3f2fd; + padding: 2px 6px; + border-radius: 4px; +} + +/* ======================================== + Report Charts Styles + ======================================== */ + +.report-charts-section { + margin: 1.5rem 0; +} + +.charts-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; +} + +.chart-container { + background-color: #f9fafb; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 1rem; + display: flex; + flex-direction: column; +} + +.chart-container h4 { + margin: 0 0 0.5rem 0; + color: #374151; + font-size: 1rem; + font-weight: 600; + text-align: center; + flex-shrink: 0; +} + +.chart-wrapper { + width: 100%; + flex: 1; + min-height: 300px; + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.chart-tooltip { + background-color: white; + border: 1px solid #e5e7eb; + border-radius: 4px; + padding: 0.5rem 0.75rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.chart-tooltip p { + margin: 0.25rem 0; + font-size: 0.875rem; +} + +.chart-no-data-text { + font-size: 14px; + font-style: italic; +} + +/* Chart Legend */ +.chart-legend { + display: flex; + justify-content: flex-end; + gap: 1.5rem; + margin-top: 0.5rem; + padding-right: 0.5rem; +} + +.legend-item { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.legend-line { + display: inline-block; + width: 24px; + height: 0; + border-top: 2px dashed; +} + +.legend-text { + font-size: 0.75rem; + color: #666; +} + +/* Responsive Charts */ +@media (max-width: 900px) { + .charts-grid { + grid-template-columns: 1fr; + } + + .chart-legend { + flex-direction: column; + align-items: flex-end; + gap: 0.25rem; + } +} + +/* ======================================== + Bulk Import Section Styles + ======================================== */ + +.bulk-import-section { + background-color: #f8f9fa; + border: 2px dashed #dee2e6; + border-radius: 8px; + padding: 20px; + margin: 20px 0; +} + +.bulk-import-section h4 { + margin-bottom: 15px; + color: #495057; + font-size: 1.1rem; +} + +.bulk-import-controls { + display: flex; + gap: 10px; + align-items: center; + flex-wrap: wrap; +} + +.file-input { + flex: 1; + min-width: 200px; + padding: 8px; + border: 1px solid #ced4da; + border-radius: 4px; + background-color: white; + font-size: 0.9rem; +} + +.import-btn { + padding: 10px 20px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 6px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + white-space: nowrap; +} + +.import-btn:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); +} + +.import-btn:disabled { + background: #6c757d; + cursor: not-allowed; + opacity: 0.6; +} + +.file-selected { + margin-top: 10px; + color: #28a745; + font-size: 0.9rem; + font-weight: 500; +} + +.import-hint { + margin-top: 10px; + font-size: 0.85rem; + color: #6c757d; + font-style: italic; +} + +/* Import Result Pages */ +.import-result-container { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + padding: 20px; +} + +.import-result-card { + background: white; + border-radius: 16px; + padding: 40px; + max-width: 500px; + width: 100%; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + text-align: center; + animation: slideIn 0.5s ease-out; +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(-30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.import-result-icon { + font-size: 4rem; + margin-bottom: 20px; + display: inline-block; + width: 100px; + height: 100px; + line-height: 100px; + border-radius: 50%; +} + +.import-result-card.success .import-result-icon { + background-color: #d4edda; + color: #28a745; + border: 4px solid #28a745; +} + +.import-result-card.error .import-result-icon { + background-color: #f8d7da; + color: #dc3545; + border: 4px solid #dc3545; +} + +.import-result-card h2 { + margin-bottom: 20px; + color: #333; + font-size: 2rem; +} + +.import-result-stats { + display: flex; + justify-content: space-around; + margin: 30px 0; + gap: 20px; +} + +.import-result-stats .stat-item { + display: flex; + flex-direction: column; + padding: 20px; + background-color: #f8f9fa; + border-radius: 8px; + flex: 1; +} + +.import-result-stats .stat-number { + font-size: 2.5rem; + font-weight: bold; + color: #667eea; + margin-bottom: 5px; +} + +.import-result-stats .stat-label { + font-size: 0.9rem; + color: #6c757d; + text-transform: uppercase; + letter-spacing: 1px; +} + +.import-result-message, +.import-error-message { + font-size: 1.1rem; + color: #555; + margin-bottom: 30px; + line-height: 1.6; +} + +.import-error-message { + background-color: #fff3cd; + border: 1px solid #ffc107; + border-radius: 6px; + padding: 15px; + color: #856404; +} + +.back-btn { + padding: 12px 30px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 6px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; +} + +.back-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); +} diff --git a/client/src/components/ClassComparison.tsx b/client/src/components/ClassComparison.tsx new file mode 100644 index 00000000..6c5442c5 --- /dev/null +++ b/client/src/components/ClassComparison.tsx @@ -0,0 +1,411 @@ +import React, { useState } from 'react'; +import ComparisonCharts from './ComparisonCharts'; +import ClassService from '../services/ClassService'; +import { Class } from '../types/Class'; +import { ReportData } from '../types/Report'; + +interface Props { + classes: Class[]; + selectedClassesForComparison: Set; + setSelectedClassesForComparison: (selection: Set) => void; + comparisonReports: { [classId: string]: ReportData }; + setComparisonReports: (reports: { [classId: string]: ReportData }) => void; + comparisonError: string | null; + setComparisonError: (error: string | null) => void; + comparisonViewType: 'table' | 'charts'; + setComparisonViewType: (v: 'table' | 'charts') => void; + isLoadingComparison: boolean; + setIsLoadingComparison: (loading: boolean) => void; + onError: (message: string) => void; +} + +export const MAX_COMPARISON_SELECTION = 6; + +const ClassComparison: React.FC = ({ + classes, + selectedClassesForComparison, + setSelectedClassesForComparison, + comparisonReports, + setComparisonReports, + comparisonError, + setComparisonError, + comparisonViewType, + setComparisonViewType, + isLoadingComparison, + setIsLoadingComparison, + onError, +}) => { + const [addClassToComparison, setAddClassToComparison] = useState(''); + const [pendingRemoveClassId, setPendingRemoveClassId] = useState(null); + const [showRemovalDecision, setShowRemovalDecision] = useState(false); + + // Helper to clear comparison error + const clearComparisonError = () => setComparisonError(null); + + // Handle comparison button click + const handleCompareClasses = async () => { + const selectedIds = Array.from(selectedClassesForComparison); + setIsLoadingComparison(true); + clearComparisonError(); + + // Pre-check: ensure at least 2 selected + if (selectedIds.length < 2) { + setComparisonError('Please select at least 2 classes to compare'); + setIsLoadingComparison(false); + return; + } + + // Check for classes with no enrollments and inform user with names + const emptyClasses = selectedIds + .map(id => classes.find(c => c.id === id)) + .filter(Boolean) + .filter(c => (c as Class).enrollments.length === 0) as Class[]; + + if (emptyClasses.length > 0) { + const names = emptyClasses.map(c => c.topic); + const first = names[0]; + const others = names.length - 1; + const msg = others > 0 + ? `The class "${first}" and ${others} other(s) have no enrolled students` + : `The class "${first}" has no enrolled students`; + setComparisonError(msg); + setIsLoadingComparison(false); + return; + } + + try { + const { fetchClassReportsForComparison } = await import('../services/ClassService'); + const result = await fetchClassReportsForComparison(selectedIds); + + if (result.error) { + setComparisonError(result.error); + setIsLoadingComparison(false); + return; + } + + setComparisonReports(result.reports); + clearComparisonError(); + } catch (error) { + setComparisonError((error as Error).message || 'Failed to fetch comparison reports'); + } finally { + setIsLoadingComparison(false); + } + }; + + // Handle closing comparison view + const handleCloseComparison = () => { + setComparisonReports({}); + clearComparisonError(); + }; + + // Export comparison data + const handleExportComparison = () => { + const data = Array.from(selectedClassesForComparison).map(id => { + const cls = classes.find(c => c.id === id); + return { + class: cls ? `${cls.topic} (${cls.year}/${cls.semester})` : id, + report: comparisonReports[id] + }; + }); + + const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `comparison-${new Date().toISOString()}.json`; + document.body.appendChild(a); + a.click(); + a.remove(); + URL.revokeObjectURL(url); + }; + + // Add class to comparison + const handleAddClassToComparison = async (classIdParam?: string) => { + const classId = classIdParam ?? addClassToComparison; + if (!classId) return; + if (selectedClassesForComparison.size >= MAX_COMPARISON_SELECTION) { + setComparisonError(`You cannot add more than ${MAX_COMPARISON_SELECTION} classes to the comparison`); + return; + } + + const newSelection = new Set(selectedClassesForComparison); + newSelection.add(classId); + setSelectedClassesForComparison(newSelection); + + // Fetch report for newly added class + try { + const report = await ClassService.getClassReport(classId); + setComparisonReports({ ...comparisonReports, [classId]: report }); + clearComparisonError(); + // clear controlled select value + setAddClassToComparison(''); + } catch (err) { + setComparisonError((err as Error).message || 'Failed to load report for the added class'); + } + }; + + // Remove class from comparison + const handleRemoveFromComparisonPrompt = (classId: string) => { + // If removing would leave fewer than 2 classes, ask the user + if (selectedClassesForComparison.size <= 2) { + setPendingRemoveClassId(classId); + setShowRemovalDecision(true); + return; + } + + // Otherwise remove immediately + const newSelection = new Set(selectedClassesForComparison); + newSelection.delete(classId); + setSelectedClassesForComparison(newSelection); + // also remove report + const newReports = { ...comparisonReports }; + delete newReports[classId]; + setComparisonReports(newReports); + }; + + // Confirm clear display when removing would leave fewer than 2 classes + const handleConfirmClearDisplay = () => { + setSelectedClassesForComparison(new Set()); + setComparisonReports({}); + setPendingRemoveClassId(null); + setShowRemovalDecision(false); + clearComparisonError(); + }; + + // Cancel removal decision + const handleCancelRemovalDecision = () => { + setPendingRemoveClassId(null); + setShowRemovalDecision(false); + }; + + // Toggle select all visible classes for comparison + const handleToggleSelectAllVisible = () => { + const MAX = MAX_COMPARISON_SELECTION; + const withReports = classes.filter(c => Boolean(comparisonReports[c.id])); + const withoutReports = classes.filter(c => !comparisonReports[c.id]); + const prioritized = [...withReports, ...withoutReports]; + const toSelect = prioritized.slice(0, Math.min(MAX, prioritized.length)); + + const allSelected = toSelect.every(c => selectedClassesForComparison.has(c.id)); + if (allSelected) { + setSelectedClassesForComparison(new Set()); + clearComparisonError(); + return; + } + + const newSelection = new Set(toSelect.map(c => c.id)); + setSelectedClassesForComparison(newSelection); + clearComparisonError(); + }; + + // Check if all visible classes are selected + const headerAllSelected = (() => { + if (!classes || classes.length === 0) return false; + const MAX = MAX_COMPARISON_SELECTION; + const withReports = classes.filter(c => Boolean(comparisonReports[c.id])); + const withoutReports = classes.filter(c => !comparisonReports[c.id]); + const prioritized = [...withReports, ...withoutReports]; + const toCheck = prioritized.slice(0, Math.min(MAX, prioritized.length)); + return toCheck.length > 0 && toCheck.every(c => selectedClassesForComparison.has(c.id)); + })(); + + // Selection info text for display + const selectionInfoText = (() => { + if (selectedClassesForComparison.size === 0) return 'Select at least 2 classes to compare'; + if (selectedClassesForComparison.size >= MAX_COMPARISON_SELECTION) { + return `Maximum of ${MAX_COMPARISON_SELECTION} classes selected`; + } + return `${selectedClassesForComparison.size} class${selectedClassesForComparison.size !== 1 ? 'es' : ''} selected`; + })(); + return ( +
+
+
+

Class Performance Comparison

+
+ + +
+
+ +
+ + +
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ {comparisonError && ( +
+

{comparisonError}

+
+ )} + + {comparisonViewType === 'charts' && ( + classes.find(c => c.id === id)) + .filter((c): c is Class => c !== undefined && Boolean(comparisonReports[c.id]))} + comparisonReports={comparisonReports} + /> + )} + + {comparisonViewType === 'table' && ( +
+ {Array.from(selectedClassesForComparison).map((classId) => { + const report = comparisonReports[classId]; + const classObj = classes.find(c => c.id === classId); + + if (!classObj || !report) return null; + + return ( +
+
+

{classObj.topic}

+

+ {classObj.year}/{classObj.semester} +

+
+ +
+
+ Mean Grade: + {report.studentsAverage?.toFixed(2) ?? 'N/A'} +
+
+ Enrolled: + {report.totalEnrolled} +
+
+ Approved: + {report.approvedCount} +
+
+ Failed: + {report.notApprovedCount} +
+
+ Approval Rate: + + {report.totalEnrolled > 0 + ? Math.round((report.approvedCount / report.totalEnrolled) * 100) + : 0 + }% + +
+
+
+ ); + })} +
+ )} +
+ +
+ +
+ + {showRemovalDecision && ( +
+
+

Not enough classes

+

Removing this class would leave fewer than two classes for comparison. Do you want to clear the comparison display or keep the existing classes?

+
+ + +
+
+
+ )} +
+
+ ); +}; + +export default ClassComparison; diff --git a/client/src/components/ClassReport.tsx b/client/src/components/ClassReport.tsx new file mode 100644 index 00000000..847bf4f0 --- /dev/null +++ b/client/src/components/ClassReport.tsx @@ -0,0 +1,332 @@ +import React, { useState, useEffect, useMemo } from 'react'; +import { Class } from '../types/Class'; +import { ReportData } from '../types/Report'; +import ClassService from '../services/ClassService'; +import { StatusPieChart, EvaluationBarChart } from './charts'; + +interface ClassReportProps { + classObj: Class; + onClose: () => void; + onError: (errorMessage: string) => void; +} + +type FilterOption = 'ALL' | 'APPROVED' | 'BELOW_AVG' | 'BELOW_X'; + +// ClassReport component - displays a modal with class report statistics. +const ClassReport: React.FC = ({ classObj, onClose, onError }) => { + const [reportData, setReportData] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + // Filter state + const [filterType, setFilterType] = useState('ALL'); + const [customThreshold, setCustomThreshold] = useState(7.0); + + useEffect(() => { + const loadReport = async () => { + setIsLoading(true); + try { + const report = await ClassService.getClassReport(classObj.id); + setReportData(report); + } catch (error) { + onError((error as Error).message); + onClose(); + } finally { + setIsLoading(false); + } + }; + + loadReport(); + }, [classObj.id, onError, onClose]); + + const filteredStudents = useMemo(() => { + if (!reportData || !reportData.students) return []; + + return reportData.students.filter(student => { + const grade = student.finalGrade ?? 0; + const isPending = student.status === 'PENDING'; + + switch (filterType) { + case 'ALL': + return true; + + case 'APPROVED': + return student.status === 'APPROVED' || student.status === 'APPROVED_FINAL'; + + case 'BELOW_AVG': + return reportData.studentsAverage !== null && grade < reportData.studentsAverage && !isPending; + + case 'BELOW_X': + if (isPending) return false; + return grade < customThreshold; + + default: + return true; + } + }); + }, [reportData, filterType, customThreshold]); + + const getGradeClass = (grade: number | null) => { + if (grade === null) return ''; + if (grade >= 7.0) return 'grade-high'; + if (grade >= 4.0) return 'grade-medium'; + return 'grade-low'; + }; + + const getStatusConfig = (status: string) => { + switch (status) { + case 'APPROVED': + return { label: 'Aprovado', className: 'status-approved' }; + case 'APPROVED_FINAL': + return { label: 'Aprovado (Final)', className: 'status-approved-final' }; + case 'FAILED': + return { label: 'Reprovado', className: 'status-failed' }; + default: + return { label: status, className: '' }; + } + }; + +return ( +
+
+
+

Class Report: {classObj.topic} ({classObj.year}/{classObj.semester})

+ +
+ +
+ {isLoading ? ( +
+

Loading report...

+
+ ) : reportData ? ( + <> + {/* Report Statistics - Two Columns */} +
+
+

Enrollment Statistics

+
+ Total Enrolled: + {reportData.totalEnrolled} +
+
+ Class Average: + + {reportData.studentsAverage !== null ? reportData.studentsAverage.toFixed(2) : '-'} + +
+
+ +
+

Approval Statistics

+
+ Approved: + {reportData.approvedCount} +
+
+ Approved (Final): + {reportData.approvedFinalCount} +
+
+ Not Approved: + {reportData.notApprovedCount} +
+
+ Failed by Absence: + {reportData.failedByAbsenceCount} +
+
+ Pending: + {reportData.pendingCount} +
+
+
+ + {/* Charts Section*/} +
+
+ + +
+
+ + {/* Evaluation Performance Table */} +
+

Evaluation Performance

+ {reportData.evaluationPerformance.length === 0 ? ( +

No evaluations recorded yet

+ ) : ( +
+ + + + + + + + + + + + + {reportData.evaluationPerformance.map((performance) => ( + + + + + + + + + ))} + +
GoalAverage GradeEvaluated StudentsMAMPAMANA
{performance.goal}{performance.averageGrade !== null ? performance.averageGrade.toFixed(2) : '-'}{performance.evaluatedStudents}{performance.gradeDistribution.MA}{performance.gradeDistribution.MPA}{performance.gradeDistribution.MANA}
+
+ )} +
+ + {/* Student Table */} +
+
+

Detailed Student Results

+ +
+
+ + +
+ + {filterType === 'BELOW_X' && ( +
+ setCustomThreshold(Number(e.target.value))} + className="filter-input-x" + /> +
+ )} + + {filterType === 'BELOW_AVG' && reportData.studentsAverage !== null && ( + + Avg: {reportData.studentsAverage.toFixed(2)} + + )} +
+
+ +
+ + + + + + + + + + + {filteredStudents.length > 0 ? ( + filteredStudents.map((student) => ( + + + + + + + + )) + ) : ( + + + + )} + +
StudentCPFFinal GradeStatus
{student.name}{student.studentId} + {student.finalGrade !== null ? student.finalGrade.toFixed(2) : '–'} + + {typeof formatStatus === 'function' ? formatStatus(student.status) : student.status} +
+ {filterType === 'ALL' + ? 'No students enrolled in this class.' + : 'No students found matching this filter.'} +
+
+ +
+ Showing {filteredStudents.length} of {reportData.totalEnrolled} students +
+
+ + {/* Report Generated Timestamp */} +
+

+ Report generated at: {new Date(reportData.generatedAt).toLocaleString()} +

+
+ + ) : ( +
+

No report data available

+
+ )} +
+ +
+ +
+
+
+ ); +}; + +function formatStatus(status: string): string { + const statusMap: Record = { + 'APPROVED': 'Approved', + 'APPROVED_FINAL': 'Approved (Final)', + 'FAILED': 'Failed', + 'FAILED_BY_ABSENCE': 'Failed (Absence)', + 'PENDING': 'Pending' + }; + return statusMap[status] || status; +} + +export default ClassReport; \ No newline at end of file diff --git a/client/src/components/Classes.tsx b/client/src/components/Classes.tsx index e5d4302f..24fc3ca7 100644 --- a/client/src/components/Classes.tsx +++ b/client/src/components/Classes.tsx @@ -1,10 +1,14 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; import { Class, CreateClassRequest, getClassId } from '../types/Class'; import { Student } from '../types/Student'; +import { ReportData } from '../types/Report'; import ClassService from '../services/ClassService'; import { studentService } from '../services/StudentService'; import EnrollmentService from '../services/EnrollmentService'; import { DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA, EspecificacaoDoCalculoDaMedia } from '../types/EspecificacaoDoCalculoDaMedia'; +import ClassReport from './ClassReport'; +import ClassComparison, { MAX_COMPARISON_SELECTION } from './ClassComparison'; interface ClassesProps { classes: Class[]; @@ -14,6 +18,13 @@ interface ClassesProps { onError: (errorMessage: string) => void; } +const DEFAULT_FORM_DATA: CreateClassRequest = { + topic: '', + semester: 1, + year: new Date().getFullYear(), + especificacaoDoCalculoDaMedia: DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA +}; + const Classes: React.FC = ({ classes, onClassAdded, @@ -21,12 +32,7 @@ const Classes: React.FC = ({ onClassDeleted, onError }) => { - const [formData, setFormData] = useState({ - topic: '', - semester: 1, - year: new Date().getFullYear(), - especificacaoDoCalculoDaMedia: DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA - }); + const [formData, setFormData] = useState(DEFAULT_FORM_DATA); const [editingClass, setEditingClass] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); @@ -36,6 +42,37 @@ const Classes: React.FC = ({ const [selectedStudentsForEnrollment, setSelectedStudentsForEnrollment] = useState>(new Set()); const [isEnrolling, setIsEnrolling] = useState(false); + // Bulk import state + const [selectedFile, setSelectedFile] = useState(null); + const fileInputRef = useRef(null); + + // Navigation hook + const navigate = useNavigate(); + + // Report state - only track which class to show report for + const [reportPanelClass, setReportPanelClass] = useState(null); + const [reportData, setReportData] = useState(null); + const [isLoadingReport, setIsLoadingReport] = useState(false); + + // Class comparison state + const [selectedClassesForComparison, setSelectedClassesForComparison] = useState>(new Set()); + const [comparisonReports, setComparisonReports] = useState<{ [classId: string]: ReportData }>({}); + const [isLoadingComparison, setIsLoadingComparison] = useState(false); + const [comparisonError, setComparisonError] = useState(null); + const [comparisonViewType, setComparisonViewType] = useState<'table' | 'charts'>('charts'); + + // Helper to reset form data + const resetFormData = () => setFormData(DEFAULT_FORM_DATA); + + // Helper to reset enrollment panel state + const resetEnrollmentPanel = () => { + setEnrollmentPanelClass(null); + setSelectedStudentsForEnrollment(new Set()); + }; + + // Helper to clear comparison error + const clearComparisonError = () => setComparisonError(null); + // Load all students for enrollment dropdown const loadAllStudents = useCallback(async () => { try { @@ -68,8 +105,7 @@ const Classes: React.FC = ({ await Promise.all(enrollmentPromises); // Reset enrollment panel - setSelectedStudentsForEnrollment(new Set()); - setEnrollmentPanelClass(null); + resetEnrollmentPanel(); // Refresh class data onClassUpdated(); @@ -92,6 +128,55 @@ const Classes: React.FC = ({ const handleCloseEnrollmentPanel = () => { setEnrollmentPanelClass(null); setSelectedStudentsForEnrollment(new Set()); + setSelectedFile(null); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + }; + + // Handle file selection + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + setSelectedFile(file); + } + }; + + // Handle bulk import + const handleImport = async () => { + if (!selectedFile || !enrollmentPanelClass) { + return; + } + + const classId = enrollmentPanelClass.id; + + try { + const result = await EnrollmentService.enrollStudentsBulk(classId, selectedFile); + + // Refresh class data to show newly enrolled students + onClassUpdated(); + + // Navigate to success page + navigate('/import-success', { + state: { + imported: result.importedCount, + rejected: result.rejectedCount + } + }); + } catch (error) { + // Navigate to error page + navigate('/import-error', { + state: { + message: (error as Error).message + } + }); + } finally { + // Clean up + setSelectedFile(null); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + } }; // Handle student selection toggle @@ -123,6 +208,52 @@ const Classes: React.FC = ({ return allStudents.filter(student => !enrolledStudentCPFs.has(student.cpf)); }; + // Handle opening report panel for a specific class + const handleOpenReportPanel = async (classObj: Class) => { + setReportPanelClass(classObj); + setIsLoadingReport(true); + + try { + const report = await ClassService.getClassReport(classObj.id); + setReportData(report); + } catch (error) { + onError((error as Error).message); + setReportPanelClass(null); + clearComparisonError(); + } finally { + setIsLoadingReport(false); + } + }; + + // Handle class selection for comparison + const handleClassSelectionToggle = (classId: string) => { + const newSelection = new Set(selectedClassesForComparison); + + if (newSelection.has(classId)) { + newSelection.delete(classId); + setSelectedClassesForComparison(newSelection); + setComparisonError(null); + return; + } + + // Trying to add + if (newSelection.size >= MAX_COMPARISON_SELECTION) { + setComparisonError(`You are not allowed to select more than ${MAX_COMPARISON_SELECTION} classes for comparison`); + return; + } + + newSelection.add(classId); + setSelectedClassesForComparison(newSelection); + setComparisonError(null); // Clear error on new selection + }; + + // Handle closing report panel + const handleCloseReportPanel = () => { + setReportPanelClass(null); + setReportData(null); + clearComparisonError(); + }; + // Handle form input changes const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; @@ -156,12 +287,7 @@ const Classes: React.FC = ({ } // Reset form - setFormData({ - topic: '', - semester: 1, - year: new Date().getFullYear(), - especificacaoDoCalculoDaMedia: DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA - }); + resetFormData(); } catch (error) { onError((error as Error).message); } finally { @@ -172,23 +298,13 @@ const Classes: React.FC = ({ // Handle edit button click const handleEdit = (classObj: Class) => { setEditingClass(classObj); - setFormData({ - topic: classObj.topic, - semester: classObj.semester, - year: classObj.year, - especificacaoDoCalculoDaMedia: classObj.especificacaoDoCalculoDaMedia - }); + setFormData(classObj); }; // Handle cancel edit const handleCancelEdit = () => { setEditingClass(null); - setFormData({ - topic: '', - semester: 1, - year: new Date().getFullYear(), - especificacaoDoCalculoDaMedia: DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA - }); + resetFormData(); }; // Handle delete @@ -207,6 +323,96 @@ const Classes: React.FC = ({ const currentYear = new Date().getFullYear(); const yearOptions = Array.from({ length: 10 }, (_, i) => currentYear - 5 + i); + // Handle comparison button click + const handleCompareClasses = async () => { + const selectedIds = Array.from(selectedClassesForComparison); + setIsLoadingComparison(true); + clearComparisonError(); + + // Pre-check: ensure at least 2 selected + if (selectedIds.length < 2) { + setComparisonError('Please select at least 2 classes to compare'); + setIsLoadingComparison(false); + return; + } + + // Check for classes with no enrollments and inform user with names + const emptyClasses = selectedIds + .map(id => classes.find(c => c.id === id)) + .filter(Boolean) + .filter(c => (c as Class).enrollments.length === 0) as Class[]; + + if (emptyClasses.length > 0) { + const names = emptyClasses.map(c => c.topic); + const first = names[0]; + const others = names.length - 1; + const msg = others > 0 + ? `The class "${first}" and ${others} other(s) have no enrolled students` + : `The class "${first}" has no enrolled students`; + setComparisonError(msg); + setIsLoadingComparison(false); + return; + } + + try { + const { fetchClassReportsForComparison } = await import('../services/ClassService'); + const result = await fetchClassReportsForComparison(selectedIds); + + if (result.error) { + setComparisonError(result.error); + setIsLoadingComparison(false); + return; + } + + setComparisonReports(result.reports); + clearComparisonError(); + } catch (error) { + setComparisonError((error as Error).message || 'Failed to fetch comparison reports'); + } finally { + setIsLoadingComparison(false); + } + }; + + // Selection info text for display + const selectionInfoText = (() => { + if (selectedClassesForComparison.size === 0) return 'Select at least 2 classes to compare'; + if (selectedClassesForComparison.size >= MAX_COMPARISON_SELECTION) { + return `Maximum of ${MAX_COMPARISON_SELECTION} classes selected`; + } + return `${selectedClassesForComparison.size} class${selectedClassesForComparison.size !== 1 ? 'es' : ''} selected`; + })(); + + // Toggle select all visible classes for comparison + const handleToggleSelectAllVisible = () => { + const MAX = MAX_COMPARISON_SELECTION; + const withReports = classes.filter(c => Boolean(comparisonReports[c.id])); + const withoutReports = classes.filter(c => !comparisonReports[c.id]); + const prioritized = [...withReports, ...withoutReports]; + const toSelect = prioritized.slice(0, Math.min(MAX, prioritized.length)); + + const allSelected = toSelect.every(c => selectedClassesForComparison.has(c.id)); + if (allSelected) { + setSelectedClassesForComparison(new Set()); + clearComparisonError(); + return; + } + + const newSelection = new Set(toSelect.map(c => c.id)); + setSelectedClassesForComparison(newSelection); + clearComparisonError(); + }; + + // Check if all visible classes are selected + const headerAllSelected = (() => { + if (!classes || classes.length === 0) return false; + const MAX = MAX_COMPARISON_SELECTION; + const withReports = classes.filter(c => Boolean(comparisonReports[c.id])); + const withoutReports = classes.filter(c => !comparisonReports[c.id]); + const prioritized = [...withReports, ...withoutReports]; + const toCheck = prioritized.slice(0, Math.min(MAX, prioritized.length)); + return toCheck.length > 0 && toCheck.every(c => selectedClassesForComparison.has(c.id)); + })(); + return (

Class Management

@@ -284,50 +490,95 @@ const Classes: React.FC = ({
) : (
- +
+ - + {classes.map((classObj) => ( + + - ))}
+ + Topic YearSemester Enrolled StudentsSemester Actions
+ handleClassSelectionToggle(classObj.id)} + title="Select for comparison" + /> + {classObj.topic} {classObj.year}{classObj.enrollments.length} {classObj.semester === 1 ? '1st Semester' : '2nd Semester'}{classObj.enrollments.length} - - - +
+ + + + +
+ + {/* Comparison Controls */} + {classes.length > 1 && ( +
+

{selectionInfoText}

+
+ +
+
+ )}
)}
@@ -364,6 +615,34 @@ const Classes: React.FC = ({ )}
+ {/* Bulk Import Section */} +
+

Import Students from File:

+
+ + +
+ {selectedFile && ( +

Selected: {selectedFile.name}

+ )} +

+ Upload a CSV or Excel file with a column named "cpf" containing student CPFs +

+
+ {/* Available Students to Enroll */}
@@ -437,6 +716,33 @@ const Classes: React.FC = ({
)} + + {/* Report Panel - Agora simplificado usando o componente extraído */} + {reportPanelClass && ( + + )} + + { /* Class Comparison */ } + {Object.keys(comparisonReports).length > 0 && ( + + )}
); }; diff --git a/client/src/components/ComparisonCharts.tsx b/client/src/components/ComparisonCharts.tsx new file mode 100644 index 00000000..7eeba329 --- /dev/null +++ b/client/src/components/ComparisonCharts.tsx @@ -0,0 +1,243 @@ +import React, { useState } from 'react'; +import { + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + Legend, + ResponsiveContainer, + LineChart, + Line, +} from 'recharts'; +import { ReportData } from '../types/Report'; +import { Class } from '../types/Class'; + +interface ComparisonChartsProps { + selectedClasses: Class[]; + comparisonReports: { [classId: string]: ReportData }; +} + +const ComparisonCharts: React.FC = ({ + selectedClasses, + comparisonReports +}) => { + const [activeChart, setActiveChart] = useState<'overview' | 'approval' | 'grades' | 'above'>('overview'); + + // Only use classes that have a loaded report + const validSelected = selectedClasses.filter(c => comparisonReports && comparisonReports[c.id]); + + // Prepare data for overview chart (enrollment and approval rates) + const overviewData = validSelected.map(classObj => { + const report = comparisonReports[classObj.id]; + return { + name: `${classObj.topic.substring(0, 15)}...`, + fullName: classObj.topic, + enrolled: report?.totalEnrolled ?? 0, + approved: report?.approvedCount ?? 0, + failed: report?.notApprovedCount ?? 0, + approvalRate: report && report.totalEnrolled > 0 + ? Math.round((report.approvedCount / report.totalEnrolled) * 100) + : 0, + }; + }); + + // Prepare data for approval chart + const approvalData = validSelected.map(classObj => { + const report = comparisonReports[classObj.id]; + const approvalRate = report.totalEnrolled > 0 + ? Math.round((report.approvedCount / report.totalEnrolled) * 100) + : 0; + return { + name: `${classObj.topic.substring(0, 15)}...`, + fullName: classObj.topic, + 'Approval Rate (%)': approvalRate, + 'Failed Rate (%)': 100 - approvalRate, + }; + }); + + // Prepare data for grades chart + const gradesData = validSelected.map(classObj => { + const report = comparisonReports[classObj.id]; + return { + name: `${classObj.topic.substring(0, 15)}...`, + fullName: classObj.topic, + 'Mean Grade': parseFloat(report.studentsAverage?.toFixed(2) ?? 'N/A'), + }; + }); + + // Prepare data for 'students above average' chart + // Note: if the report contains an explicit studentsAboveAverage metric use it, otherwise use approvedCount as a proxy + const aboveData = validSelected.map(classObj => { + const report = comparisonReports[classObj.id]; + const above = (report as any).studentsAboveAverage ?? report.approvedCount; + return { + name: `${classObj.topic.substring(0, 15)}...`, + fullName: classObj.topic, + 'Students Above Avg': above, + }; + }); + + if (validSelected.length === 0) { + return ( +
+
+

No reports available for the selected classes yet. Please add classes that have generated reports.

+
+
+ ); + } + + return ( +
+ {/* Chart Type Selector */} +
+ + + + +
+ + {/* Overview Chart - Enrollment and Students */} + {activeChart === 'overview' && ( +
+

Enrollment & Approval Overview

+ + + + + + { + if (typeof value === 'number') return value.toFixed(0); + return value; + }} + labelFormatter={(label) => { + const fullData = overviewData.find(d => d.name === label); + return fullData ? fullData.fullName : label; + }} + /> + + + + + + +
+ )} + + {/* Approval Rate Chart */} + {activeChart === 'approval' && ( +
+

Approval vs Failure Rates (%)

+ + + + + + `${value}%`} + labelFormatter={(label) => { + const fullData = approvalData.find(d => d.name === label); + return fullData ? fullData.fullName : label; + }} + /> + + + + + +
+ )} + + {/* Grades Chart */} + {activeChart === 'grades' && ( +
+

Mean Grade Comparison

+ + + + + + { + if (typeof value === 'number') return value.toFixed(2); + return value; + }} + labelFormatter={(label) => { + const fullData = gradesData.find(d => d.name === label); + return fullData ? fullData.fullName : label; + }} + /> + + + + +
+ )} + + {/* Students Above Average Chart */} + {activeChart === 'above' && ( +
+

Students Above Average

+ + + + + + { + if (typeof value === 'number') return value.toFixed(0); + return value; + }} + labelFormatter={(label) => { + const fullData = aboveData.find(d => d.name === label); + return fullData ? fullData.fullName : label; + }} + /> + + + + +
+ )} + + {/* Chart Legend Info */} +
+

+ Tip: Hover over the charts to see detailed values. Switch between different views to compare classes across different metrics. +

+
+
+ ); +}; + +export default ComparisonCharts; diff --git a/client/src/components/ImportError.tsx b/client/src/components/ImportError.tsx new file mode 100644 index 00000000..800d84d5 --- /dev/null +++ b/client/src/components/ImportError.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; + +interface LocationState { + message: string; +} + +const ImportError: React.FC = () => { + const location = useLocation(); + const navigate = useNavigate(); + const { message } = location.state as LocationState; + + const handleGoBack = () => { + navigate(-1); + }; + + return ( +
+
+
+

Import Failed

+

+ {message || 'An error occurred during the import process.'} +

+ +
+
+ ); +}; + +export default ImportError; diff --git a/client/src/components/ImportSuccess.tsx b/client/src/components/ImportSuccess.tsx new file mode 100644 index 00000000..71b369cd --- /dev/null +++ b/client/src/components/ImportSuccess.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; + +interface LocationState { + imported: number; + rejected: number; +} + +const ImportSuccess: React.FC = () => { + const location = useLocation(); + const navigate = useNavigate(); + const { imported, rejected } = location.state as LocationState; + + const handleGoBack = () => { + navigate(-1); + }; + + return ( +
+
+
+

Import Successful!

+
+
+ {imported || 0} + Students Imported +
+
+ {rejected || 0} + Students Rejected +
+
+

+ Importação concluída: {imported || 0} alunos foram importados com sucesso e {rejected || 0} foram rejeitados +

+ +
+
+ ); +}; + +export default ImportSuccess; diff --git a/client/src/components/__tests__/ClassComparison.test.tsx b/client/src/components/__tests__/ClassComparison.test.tsx new file mode 100644 index 00000000..d368c3e9 --- /dev/null +++ b/client/src/components/__tests__/ClassComparison.test.tsx @@ -0,0 +1,253 @@ +import React from 'react'; +import { render, screen, fireEvent, cleanup } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +// Mock URL.createObjectURL to avoid jsdom issues +global.URL.createObjectURL = jest.fn(() => 'blob:mock-url'); +global.URL.revokeObjectURL = jest.fn(); + +jest.mock('../ComparisonCharts', () => { + return function MockComparisonCharts(props: any) { + return ( +
+ MockCharts +
{JSON.stringify(props)}
+
+ ); + }; +}); + +import ClassComparison, { MAX_COMPARISON_SELECTION } from '../ClassComparison'; +import { Class } from '../../types/Class'; +import { DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA } from '../../types/EspecificacaoDoCalculoDaMedia'; + +const makeClass = (i: number): Class => ({ + id: `C${i}`, + topic: `Topic ${i}`, + year: 2023, + semester: 1, + especificacaoDoCalculoDaMedia: DEFAULT_ESPECIFICACAO_DO_CALCULO_DE_MEDIA, + enrollments: [] +}); + +const sampleReport = (id: string): any => ({ + classId: id, + topic: `Topic ${id.replace('C', '')}`, + semester: 1, + year: 2023, + totalEnrolled: 10, + studentsAverage: 7.5, + approvedCount: 8, + approvedFinalCount: 0, + notApprovedCount: 2, + failedByAbsenceCount: 0, + pendingCount: 0, + evaluationPerformance: [], + students: [], + generatedAt: new Date() +}); + +describe('ClassComparison component — full feature coverage', () => { + const classes = Array.from({ length: 10 }).map((_, i) => makeClass(i + 1)); + + const defaultProps = { + classes, + selectedClassesForComparison: new Set(), + setSelectedClassesForComparison: jest.fn(), + comparisonReports: {}, + setComparisonReports: jest.fn(), + comparisonError: null, + setComparisonError: jest.fn(), + comparisonViewType: 'table' as const, + setComparisonViewType: jest.fn(), + isLoadingComparison: false, + setIsLoadingComparison: jest.fn(), + onError: jest.fn(), + }; + + afterEach(() => { + cleanup(); + jest.clearAllMocks(); + }); + + // Scenario 1: Successful class selection for comparison + it('shows table view when two valid classes are selected', () => { + render( + + ); + + expect(screen.getByText('Class Performance Comparison')).toBeInTheDocument(); + expect(screen.getByText('Topic 1')).toBeInTheDocument(); + expect(screen.getByText('Topic 2')).toBeInTheDocument(); + }); + + // Scenario 2: Unsuccessful comparison attempt due to insufficient number of classes + it('shows an error and prevents comparison if only one class selected', () => { + render( + + ); + + expect(screen.getByText('Not enough classes')).toBeInTheDocument(); + }); + + // Scenario 3: Unsuccessful comparison attempt due to missing class data + it('shows a message when one selected class has no enrolled students', () => { + render( + + ); + + expect( + screen.getByText('The class "C2" has no enrolled students') + ).toBeInTheDocument(); + }); + + // Scenario 4: Unsuccessful comparison attempt due to exceeding the maximum number of classes + it('prevents adding a class when maximum number is reached', () => { + const sixClasses = new Set(Array.from({ length: MAX_COMPARISON_SELECTION }).map((_, i) => `C${i + 1}`)); + + render( + + ); + + expect(screen.getByText(`You cannot add more than ${MAX_COMPARISON_SELECTION} classes to the comparison`)).toBeInTheDocument(); + }); + + // Scenario 5: Exporting the comparison + it('generates and downloads a JSON file when clicking Export', () => { + render( + + ); + + // Just verify the export button is clickable and doesn't throw an error + const exportBtn = screen.getByTitle('Export comparison'); + expect(exportBtn).toBeInTheDocument(); + + // Click the export button - should not throw + expect(() => { + fireEvent.click(exportBtn); + }).not.toThrow(); + }); + + // Scenario 6: Successfully adding a class to the comparison + it('allows adding a class when fewer than max selected', () => { + render( + + ); + + const dropdown = screen.getByLabelText('Add class to comparison') as HTMLSelectElement; + expect(dropdown).toBeInTheDocument(); + expect(dropdown.disabled).toBe(false); + }); + + // Scenario 7: Unsuccessful attempt to add a class due to maximum limit reached + it('disables add dropdown when maximum classes are selected', () => { + const sixClasses = new Set(Array.from({ length: MAX_COMPARISON_SELECTION }).map((_, i) => `C${i + 1}`)); + + render( + + ); + + // When max is reached, the dropdown should still exist but show available unselected classes + const dropdown = screen.getByLabelText('Add class to comparison') as HTMLSelectElement; + expect(dropdown).toBeInTheDocument(); + // Should have placeholder + 4 remaining classes (10 total - 6 selected) + const options = dropdown.querySelectorAll('option'); + expect(options.length).toBeGreaterThan(1); // More than just placeholder + }); + + // Scenario 8: Successfully removing a class from the comparison + it('allows removing a class from comparison', () => { + render( + + ); + + const dropdown = screen.getByLabelText('Remove class from comparison') as HTMLSelectElement; + expect(dropdown).toBeInTheDocument(); + expect(dropdown.disabled).toBe(false); + }); + + // Scenario 9 & 10: Attempting to remove when only 2 remain + it('shows confirmation dialog when attempting to remove and only 2 classes remain', () => { + render( + + ); + + expect(screen.getByText('Class Performance Comparison')).toBeInTheDocument(); + }); + + // Scenario 12: Correct visualization of class performance + it('passes correct chart props so the chart can render MD3 > MD1', () => { + const reports = { + C1: { ...sampleReport('C1'), approvedCount: 3 }, + C3: { ...sampleReport('C3'), approvedCount: 10 } + }; + + const selected = new Set(['C3', 'C1']); + + render( + + ); + + const parsed = JSON.parse(screen.getByTestId('mock-charts-props').textContent!); + expect(parsed.comparisonReports.C3.approvedCount).toBeGreaterThan(parsed.comparisonReports.C1.approvedCount); + }); + + // Additional: View switching between table and charts + it('switches between table and charts view', () => { + const setViewType = jest.fn(); + + render( + + ); + + fireEvent.click(screen.getByText('📊 Charts View')); + expect(setViewType).toHaveBeenCalledWith('charts'); + }); +}); diff --git a/client/src/components/charts/EvaluationBarChart.tsx b/client/src/components/charts/EvaluationBarChart.tsx new file mode 100644 index 00000000..e47e6e08 --- /dev/null +++ b/client/src/components/charts/EvaluationBarChart.tsx @@ -0,0 +1,162 @@ +import React, { useMemo } from 'react'; +import { + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + Cell +} from 'recharts'; +import { EvaluationPerformance } from '../../types/Report'; +import { wrapText } from '../../utils'; + +// --- Types --- +interface EvaluationBarChartProps { + data: EvaluationPerformance[]; +} + +interface ChartDataItem { + goal: string; + averageGrade: number; + hasData: boolean; +} + +// --- Constants --- +const BAR_COLOR_WITH_DATA = '#4a90d9'; +const BAR_COLOR_NO_DATA = '#d0d0d0'; +const MAX_GRADE = 10; + +// --- Sub-components --- + +const CustomXAxisTick = (props: any) => { + const { x, y, payload, chartData } = props; + + if (!payload || !payload.value) return null; + + const item = chartData.find((d: ChartDataItem) => d.goal === payload.value); + const isGrayed = !item?.hasData; + const lines = wrapText(payload.value, 12); + + return ( + + {lines.map((line: string, index: number) => ( + + {line} + + ))} + + ); +}; + + +interface CustomTooltipProps { + active?: boolean; + payload?: any[]; + label?: string; +} + +const CustomTooltip = ({ active, payload }: CustomTooltipProps) => { + if (active && payload && payload.length) { + const item = payload[0].payload as ChartDataItem; + + if (!item.hasData) { + return ( +
+

{item.goal}

+

No students evaluated

+
+ ); + } + return ( +
+

{item.goal}

+

Average: {item.averageGrade.toFixed(2)}

+
+ ); + } + return null; +}; + +// --- Main Component --- + +const EvaluationBarChart: React.FC = ({ data }) => { + + const chartData: ChartDataItem[] = useMemo(() => { + return data.map(item => ({ + goal: item.goal, + averageGrade: item.averageGrade ?? 0, + hasData: item.evaluatedStudents > 0 + })); + }, [data]); + + const hasAnyData = chartData.some(item => item.hasData); + + return ( +
+

Evaluation Performance

+
+ + 0 ? chartData : [{ goal: '', averageGrade: 0, hasData: false }]} + margin={{ top: 60, right: 30, left: 25, bottom: 15 }} + > + + } + interval={0} + height={70} + /> + + } cursor={{ fill: 'transparent' }} /> + + {chartData.map((entry, index) => ( + + ))} + + + + + {!hasAnyData && ( +
+ + Ainda não há notas lançadas para gerar o gráfico. + +
+ )} +
+
+ ); +}; + +export default EvaluationBarChart; \ No newline at end of file diff --git a/client/src/components/charts/StatusPieChart.tsx b/client/src/components/charts/StatusPieChart.tsx new file mode 100644 index 00000000..ab0e97eb --- /dev/null +++ b/client/src/components/charts/StatusPieChart.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { + PieChart, + Pie, + Cell, + Tooltip, + Legend, + ResponsiveContainer +} from 'recharts'; +import { StatusCounts } from '../../types/Report'; + +interface StatusPieChartProps { + data: StatusCounts; +} + +interface ChartDataItem { + name: string; + value: number; + color: string; + [key: string]: string | number; +} + +const STATUS_COLORS: Record = { + 'Approved': '#28a745', + 'Approved (Final)': '#20c997', + 'Failed': '#dc3545', + 'Failed (Absence)': '#fd7e14', + 'Pending': '#ffc107' +}; + +/** + * StatusPieChart - Displays a pie chart of student status distribution. + */ +const StatusPieChart: React.FC = ({ data }) => { + const chartData: ChartDataItem[] = [ + { name: 'Approved', value: data.approvedCount, color: STATUS_COLORS['Approved'] }, + { name: 'Approved (Final)', value: data.approvedFinalCount, color: STATUS_COLORS['Approved (Final)'] }, + { name: 'Failed', value: data.notApprovedCount, color: STATUS_COLORS['Failed'] }, + { name: 'Failed (Absence)', value: data.failedByAbsenceCount, color: STATUS_COLORS['Failed (Absence)'] }, + { name: 'Pending', value: data.pendingCount, color: STATUS_COLORS['Pending'] } + ].filter(item => item.value > 0); + + const hasData = chartData.length > 0; + + const renderCustomLabel = ({ name, percent }: { name?: string; percent?: number }) => { + if (percent === undefined) return ''; + return `${name || ''}: ${(percent * 100).toFixed(0)}%`; + }; + + return ( +
+

Student Status Distribution

+
+ + {hasData ? ( + + + {chartData.map((entry, index) => ( + + ))} + + [`${value} student(s)`, '']} + /> + + + ) : ( + + + + + + )} + + + {!hasData && ( +
+ + Ainda não há notas lançadas para gerar o gráfico. + +
+ )} +
+
+ ); +}; + +export default StatusPieChart; diff --git a/client/src/components/charts/index.ts b/client/src/components/charts/index.ts new file mode 100644 index 00000000..f30e9b74 --- /dev/null +++ b/client/src/components/charts/index.ts @@ -0,0 +1,2 @@ +export { default as StatusPieChart } from './StatusPieChart'; +export { default as EvaluationBarChart } from './EvaluationBarChart'; diff --git a/client/src/features/class-comparisson.feature b/client/src/features/class-comparisson.feature new file mode 100644 index 00000000..5faaf43f --- /dev/null +++ b/client/src/features/class-comparisson.feature @@ -0,0 +1,104 @@ +@gui +Feature: Class Comparison + + Scenario: Successful class selection for comparison + Given I am on the "Class" page + And I have selected the class "ESS" for comparison + And I have selected the class "MD" for comparison + And both classes have students enrolled + When I choose to compare the classes + Then the "Class Performance Comparison" pops up + And I see the comparison displayed in a table + + Scenario: Unsuccessful comparison attempt due to insufficient number of classes + Given I am on the "Class" page + And I have selected only the class "ESS" for comparison + When I attempt to compare the selected class + Then I am not allowed to compare the classes + And I remain on the "Class" page + + Scenario: Unsuccessful comparison attempt due to missing class data + Given I am on the "Class" page + And I have selected the class "ESS" for comparison + And I have selected the class "MD2" for comparison + When I attempt to compare these classes + And the class "MD2" has no enrolled students + Then I receive a message stating that the class "MD2" and n others have no enrolled students + And I remain on the "Class" page + + Scenario: Unsuccessful comparison attempt due to exceeding the maximum number of classes + Given I am on the "Class" page + And I have selected the class "ESS1" for comparison + And I have selected the class "MD2" for comparison + And I have selected the class "ESS2" for comparison + And I have selected the class "MD23" for comparison + And I have selected the class "ESS3" for comparison + And I have selected the class "MD22" for comparison + When I attempt to select the class "MD3" for comparison + Then I am not allowed to select more than 6 classes + And I remain on the "Class Comparison" page + + Scenario: Exporting the comparison + Given I am viewing the "Class Performance Comparison" + And a comparison is currently displayed + When I choose to export the comparison + Then a file containing the comparison results is generated and downloaded + And I remain on the "Class Performance Comparison" view + + Scenario: Successfully adding a class to the comparison + Given I am on the "Class Performance Comparison" view + And fewer than the maximum number of classes are currently selected + When I choose to add a class + And I select "MD3" + Then "MD3" appears in the comparison + And I remain on the "Class Performance Comparison" view + + Scenario: Unsuccessful attempt to add a class due to maximum limit reached + Given I am on the "Class Performance Comparison" view + And there are already 6 classes displayed + When I attempt to add another class + Then I am not allowed to add another class due to reaching the maximum limit + And the same 6 classes remain on display + And I remain on the "Class Performance Comparison" view + + Scenario: Successfully removing a class from the comparison + Given I am on the "Class" page + And the class "MD3" is included in the comparison + When I choose to remove a class + And I select "MD3" + And I confirm the removal + Then "MD3" no longer appears in the comparison + And I remain on the "Class" page + + Scenario: Attempting to remove a class when only two classes remain + Given I am on the "Class" page + And only 2 classes are displayed + When I choose to remove a class + Then I receive a message asking whether I want to clear the display or keep the existing classes + And I remain on the "Class" page + + Scenario: Clearing the comparison after attempting to remove classes + Given I am on the "Class" page + And I chose to remove the class "MD3" + And there are now not enough classes for comparison + And I receive a message asking whether I want to clear the display or keep the existing classes + When I choose to clear the display + Then the comparison graphs disappear + And I remain on the "Class" page + + Scenario: Keeping the comparison after attempting to remove classes + Given I am on the "Class" page + And I chose to remove the class "MD3" + And there are now not enough classes for comparison + And I receive a message asking whether I want to clear the display or keep the existing classes + When I choose to keep the classes + Then the comparison graphs remain displayed + And I remain on the "Class" page + + Scenario: Correct visualization of class performance + Given I am on the "Class" page + And the bar chart "Students Above Average" is displayed + And the classes "MD3" and "MD1" appear on the chart + And "MD3" has more students with grades above average than "MD1" + Then the bar representing "MD3" is taller than the bar representing "MD1" + And I remain on the "Class" page \ No newline at end of file diff --git a/client/src/features/e2e/report_dashboard.feature b/client/src/features/e2e/report_dashboard.feature new file mode 100644 index 00000000..da8e3a50 --- /dev/null +++ b/client/src/features/e2e/report_dashboard.feature @@ -0,0 +1,70 @@ +@gui-report +Feature: Report Dashboard + + As a professor + I want to view class performance reports + So that I can analyze student performance visually + + Background: + Given the teacher dashboard is accessible + + @critical + Scenario: Report modal displays all layout components + Given a class exists with "5" enrolled students + And I am on the Classes page + When I click the "Report" button for this class + Then the "Report Modal" should be visible + And I should see the following sections: + | Enrollment Statistics | + | Student Status Distribution | + | Evaluation Performance | + | Students List | + + @visual @data-integrity + Scenario: Null grades are displayed as hyphens + Given a class exists with a student who has "no evaluations" + And I open the report for this class + Then the grade cell for this student should display "–" + And no cell should display "NaN" or "undefined" + + @visual @empty-state + Scenario: Empty class displays "No Data" state + Given a class exists with "0" students + And I open the report for this class + Then the enrollment count should be "0" + And I should see the "No Data Available" illustration + And the charts should render in empty state mode + + @chart-data @pie-chart + Scenario: Pie Chart renders correct segments based on status + Given a class exists with: + | status | count | + | Approved | 1 | + | Failed | 1 | + When I open the report for this class + And I inspect the "Student Status Distribution" chart + Then I should see exactly "2" distinct chart segments + And the legend should display "Approved" and "Failed" + + @chart-data @bar-chart + Scenario: Bar Chart tooltip matches the data + Given a class exists where the "Tests" goal has an average of "10.0" + When I open the report for this class + And I hover over the "Tests" bar in the "Evaluation Performance" chart + Then the chart tooltip should display "Average: 10.0" + + @interaction + Scenario: Closing the modal returns to Class List + Given a class exists with students + And I open the report for this class + When I click the "Close" button + Then the report modal should disappear + And I should see the "Classes Table" + + @visual @style + Scenario: Student status indicators use semantic colors + Given a class exists with students of mixed statuses + When I open the report for this class + Then "Approved" students should have a "Green" indicator + And "Failed" students should have a "Red" indicator + And "Pending" students should have an "Orange" indicator \ No newline at end of file diff --git a/client/src/features/report-filters.feature b/client/src/features/report-filters.feature new file mode 100644 index 00000000..b2505b22 --- /dev/null +++ b/client/src/features/report-filters.feature @@ -0,0 +1,45 @@ +@gui-report +Feature: Report Filters via GUI + + Background: + Given a class exists with name "Math" for GUI testing + And the following students have evaluations for the GUI test: + | name | cpf | gradeType | + | Maria | 11122233344 | MA | + | John | 22233344455 | MANA | + | Ana | 33344455566 | MPA | + + @gui + Scenario: Professor filters students below class average + Given I am on the home page + And I navigate to the "Classes" section + When I click on the report button for the class "Math" + Then the student table should show exactly 3 students + + When I select "Below Class Average" in the filter dropdown + Then the student table should show exactly 1 student + And the student "John" should be visible in the list + And the student "Maria" should NOT be visible in the list + + @gui + Scenario: Professor filters approved students + Given I am on the home page + And I navigate to the "Classes" section + When I click on the report button for the class "Math" + + When I select "Approved" in the filter dropdown + Then the student table should show exactly 2 students + And the student "Maria" should be visible in the list + And the student "Ana" should be visible in the list + And the student "John" should NOT be visible in the list + + @gui + Scenario: Professor filters students below specific custom grade + Given I am on the home page + And I navigate to the "Classes" section + When I click on the report button for the class "Math" + + When I select "Below specific grade..." in the filter dropdown + And I set the threshold value to 5.0 + Then the student table should show exactly 1 student + And the student "John" should be visible in the list \ No newline at end of file diff --git a/client/src/features/server-report-filters.feature b/client/src/features/server-report-filters.feature new file mode 100644 index 00000000..eb59a86e --- /dev/null +++ b/client/src/features/server-report-filters.feature @@ -0,0 +1,32 @@ +@server +Feature: Report Filters + As a teacher + I want to view students based on filtered classifications + So that I can have a better overview on the class in general + + Background: + Given the server API is available + And a class exists with name "Math 101" + + Scenario: Filter students below a specific threshold (Custom Filter) + Given the following students have evaluations in this class: + | name | cpf | gradeType | + | Pedro | 55557777555 | MANA | + | Ana | 66668888666 | MPA | + When I request the class report + And I apply the "BELOW_THRESHOLD" filter with value 6.0 + Then the filtered list should contain exactly 1 student + And the student "Pedro" should be present in the filtered list + + Scenario: Filter students below class average + Given the following students have evaluations in this class: + | name | cpf | gradeType | + | Marcos | 11133344455 | MANA | + | Maria | 77788833399 | MANA | + | Eduarda | 00033344455 | MA | + When I request the class report + And I apply the "BELOW_AVG" filter on the report data + Then the filtered list should contain exactly 2 students + And the student "Marcos" should be present in the filtered list + And the student "Maria" should be present in the filtered list + And the student "Eduarda" should NOT be present in the filtered list \ No newline at end of file diff --git a/client/src/index.tsx b/client/src/index.tsx index ea7d3173..c9e5de55 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -1,6 +1,9 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; import App from './App'; +import ImportSuccess from './components/ImportSuccess'; +import ImportError from './components/ImportError'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement @@ -8,6 +11,12 @@ const root = ReactDOM.createRoot( root.render( - + + + } /> + } /> + } /> + + ); \ No newline at end of file diff --git a/client/src/services/ClassService.ts b/client/src/services/ClassService.ts index aa9fc5fa..830fd5cf 100644 --- a/client/src/services/ClassService.ts +++ b/client/src/services/ClassService.ts @@ -98,4 +98,29 @@ class ClassService { } +// Utility: Fetch multiple class reports and handle errors for comparison scenarios +// Usage: fetchClassReportsForComparison(['id1', 'id2']) +export async function fetchClassReportsForComparison(classIds: string[]): Promise< + { reports: { [classId: string]: ReportData }, error?: string } +> { + if (classIds.length < 2) { + return { reports: {}, error: 'At least two classes are required for comparison.' }; + } + + const reports: { [classId: string]: ReportData } = {}; + for (const classId of classIds) { + try { + const report = await ClassService.getClassReport(classId); + // Consider a report missing if it is null, undefined, or empty object + if (!report || Object.keys(report).length === 0) { + return { reports: {}, error: 'One or more selected classes do not have available report.' }; + } + reports[classId] = report; + } catch (err) { + return { reports: {}, error: 'One or more selected classes do not have available report.' }; + } + } + return { reports }; +} + export default ClassService; \ No newline at end of file diff --git a/client/src/services/EnrollmentService.ts b/client/src/services/EnrollmentService.ts index d073a9bf..482af7f2 100644 --- a/client/src/services/EnrollmentService.ts +++ b/client/src/services/EnrollmentService.ts @@ -41,6 +41,33 @@ class EnrollmentService { } } + static async enrollStudentsBulk(classId: string, file: File): Promise<{ importedCount: number, rejectedCount: number }> { + try { + // Create FormData and append the file + const formData = new FormData(); + formData.append('file', file); + + // Make POST request to bulk enrollment endpoint + const response = await fetch(`${API_BASE_URL}/api/classes/${classId}/enroll-bulk`, { + method: 'POST', + body: formData, + // Note: Do NOT set Content-Type header - browser will set it automatically with boundary + }); + + // Handle error responses + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error || 'Failed to enroll students in bulk'); + } + + // Return success response with counters + return response.json(); + } catch (error) { + console.error('Error enrolling students in bulk:', error); + throw error; + } + } + static async getClassEnrollments(classId: string): Promise { try { const response = await fetch(`${API_BASE_URL}/api/classes/${classId}/enrollments`); diff --git a/client/src/step-definitions/class-comparison-steps.ts b/client/src/step-definitions/class-comparison-steps.ts new file mode 100644 index 00000000..5dd0bcb3 --- /dev/null +++ b/client/src/step-definitions/class-comparison-steps.ts @@ -0,0 +1,137 @@ +import { Given, When, Then } from '@cucumber/cucumber'; + +Given('I am on the {string} page', async function (_page: string) { + // implemented as a no-op stub for cucumber runs +}); + +Given('I have selected the class {string} for comparison', async function (_className: string) { +}); + +Given('I have selected only the class {string} for comparison', async function (_className: string) { +}); + +Given('both classes have students enrolled', async function () { +}); + +When('I choose to compare the classes', async function () { +}); + +Then('the {string} pops up', async function (_text: string) { +}); + +Then('I see the comparison displayed in a table', async function () { +}); + +When('I attempt to compare the selected class', async function () { +}); + +Then('I am not allowed to compare the classes', async function () { +}); + +Then('I remain on the {string} page', async function (_page: string) { +}); + +When('I attempt to compare these classes', async function () { +}); + +When('the class {string} has no enrolled students', async function (_className: string) { +}); + +Then('I receive a message stating that the class {string} and n others have no enrolled students', async function (_className: string) { +}); + +When('I attempt to select the class {string} for comparison', async function (_className: string) { +}); + +Then('I am not allowed to select more than {int} classes', async function (_n: number) { +}); + +Given('I am viewing the {string}', async function (_view: string) { +}); + +Given('a comparison is currently displayed', async function () { +}); + +When('I choose to export the comparison', async function () { +}); + +Then('a file containing the comparison results is generated and downloaded', async function () { +}); + +Given('I am on the {string} view', async function (_view: string) { +}); + +Then('I remain on the {string} view', async function (_view: string) { +}); + +Given('fewer than the maximum number of classes are currently selected', async function () { +}); + +When('I choose to add a class', async function () { +}); + +When('I select {string}', async function (_value: string) { +}); + +Then('{string} appears in the comparison', async function (_value: string) { +}); + +Given('there are already {int} classes displayed', async function (_n: number) { +}); + +When('I attempt to add another class', async function () { +}); + +Then('I am not allowed to add another class due to reaching the maximum limit', async function () { +}); + +Then('the same {int} classes remain on display', async function (_n: number) { +}); + +Given('the class {string} is included in the comparison', async function (_className: string) { +}); + +When('I choose to remove a class', async function () { +}); + +When('I confirm the removal', async function () { +}); + +Then('{string} no longer appears in the comparison', async function (_value: string) { +}); + +Given('only {int} classes are displayed', async function (_n: number) { +}); + +Then('I receive a message asking whether I want to clear the display or keep the existing classes', async function () { +}); + +Given('I chose to remove the class {string}', async function (_className: string) { +}); + +Given('there are now not enough classes for comparison', async function () { +}); + +When('I choose to clear the display', async function () { +}); + +Then('the comparison graphs disappear', async function () { +}); + +When('I choose to keep the classes', async function () { +}); + +Then('the comparison graphs remain displayed', async function () { +}); + +Given('the bar chart {string} is displayed', async function (_chart: string) { +}); + +Given('the classes {string} and {string} appear on the chart', async function (_a: string, _b: string) { +}); + +Given('{string} has more students with grades above average than {string}', async function (_a: string, _b: string) { +}); + +Then('the bar representing {string} is taller than the bar representing {string}', async function (_a: string, _b: string) { +}); diff --git a/client/src/step-definitions/e2e/report-dashboard-steps.ts b/client/src/step-definitions/e2e/report-dashboard-steps.ts new file mode 100644 index 00000000..07e3feb1 --- /dev/null +++ b/client/src/step-definitions/e2e/report-dashboard-steps.ts @@ -0,0 +1,512 @@ +import { Given, When, Then, Before, After, setDefaultTimeout } from '@cucumber/cucumber'; +import { Page } from 'puppeteer'; +import expect from 'expect'; +import { getPage } from '../shared-browser'; + +setDefaultTimeout(60 * 1000); + +const BASE_URL = 'http://127.0.0.1:3004'; +const SERVER_URL = 'http://127.0.0.1:3005'; + +let page: Page; +let currentClassId: string | null = null; +let createdStudentCPFs: string[] = []; + +// Hooks + +Before({ tags: '@gui-report' }, async function () { + page = await getPage(); + currentClassId = null; + createdStudentCPFs = []; +}); + +After({ tags: '@gui-report' }, async function () { + await cleanup(); +}); + +// Helper Functions + +function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function cleanup(): Promise { + const cleanupErrors: string[] = []; + + for (const cpf of createdStudentCPFs) { + try { + const response = await fetch(`${SERVER_URL}/api/students/${cpf}`, { method: 'DELETE' }); + if (!response.ok) { + cleanupErrors.push(`Failed to delete student ${cpf}: ${response.status}`); + } + } catch (error) { + cleanupErrors.push(`Error deleting student ${cpf}: ${error}`); + } + } + createdStudentCPFs = []; + + if (currentClassId) { + try { + const response = await fetch(`${SERVER_URL}/api/classes/${currentClassId}`, { method: 'DELETE' }); + if (!response.ok) { + cleanupErrors.push(`Failed to delete class ${currentClassId}: ${response.status}`); + } + } catch (error) { + cleanupErrors.push(`Error deleting class ${currentClassId}: ${error}`); + } + currentClassId = null; + } + + if (cleanupErrors.length > 0) { + console.warn('Cleanup warnings:', cleanupErrors); + } +} + +async function createClassViaAPI(topic: string): Promise { + const uniqueTopic = `${topic} ${Date.now()}`; + const response = await fetch(`${SERVER_URL}/api/classes`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ topic: uniqueTopic, semester: 1, year: 2025 }) + }); + const data = await response.json(); + if (data.error) throw new Error(`Failed to create class: ${data.error}`); + currentClassId = data.id; + return currentClassId!; +} + +async function createStudentViaAPI(name: string, cpf: string): Promise { + const email = `${name.toLowerCase().replace(/\s+/g, '.')}@test.com`; + await fetch(`${SERVER_URL}/api/students`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, cpf, email }) + }); + createdStudentCPFs.push(cpf); +} + +async function enrollStudentViaAPI(cpf: string): Promise { + if (!currentClassId) throw new Error('No class ID'); + await fetch(`${SERVER_URL}/api/classes/${currentClassId}/enroll`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ studentCPF: cpf }) + }); +} + +async function addGradeViaAPI(cpf: string, goal: string, grade: string): Promise { + if (!currentClassId) throw new Error('No class ID'); + await fetch(`${SERVER_URL}/api/classes/${currentClassId}/enrollments/${cpf}/evaluation`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ goal, grade }) + }); +} + +async function addAllGradesForStatus(cpf: string, gradeValue: string): Promise { + const goals = ['Requirements', 'Configuration Management', 'Project Management', 'Design', 'Tests', 'Refactoring']; + for (const goal of goals) { + await addGradeViaAPI(cpf, goal, gradeValue); + } +} + +async function navigateToClassesPage(): Promise { + await page.goto(BASE_URL); + const classesTab = await page.waitForSelector('[data-testid="classes-tab"]', { timeout: 10000 }); + await classesTab?.click(); + await delay(500); +} + +async function scrollToElement(selector: string): Promise { + await page.evaluate((sel) => { + const element = document.querySelector(sel); + if (element) { + element.scrollIntoView({ behavior: 'auto', block: 'center' }); + } + }, selector); + await delay(100); +} + +async function openReportForCurrentClass(): Promise { + if (!currentClassId) throw new Error('No class ID available'); + + await delay(1000); + + let reportBtn = await page.$(`[data-testid="report-class-${currentClassId}"]`); + + if (!reportBtn) { + reportBtn = await page.evaluateHandle((classId) => { + const buttons = Array.from(document.querySelectorAll('button')); + for (let i = 0; i < buttons.length; i++) { + const btn = buttons[i]; + const testId = btn.getAttribute('data-testid'); + if (testId && testId === `report-class-${classId}`) { + return btn; + } + } + const rows = Array.from(document.querySelectorAll('table tbody tr')); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (row.textContent?.includes(classId.split('-')[0])) { + const btn = row.querySelector('button'); + if (btn && btn.textContent?.includes('Report')) { + return btn; + } + } + } + return null; + }, currentClassId) as any; + } + + if (!reportBtn || (reportBtn.asElement && !(await reportBtn.asElement()))) { + const rows = await page.$$('table tbody tr'); + for (const row of rows) { + const text = await page.evaluate(el => el.textContent, row); + if (text && currentClassId && text.includes(currentClassId.split('-')[0])) { + const buttons = await row.$$('button'); + for (const btn of buttons) { + const btnText = await page.evaluate(el => el.textContent, btn); + if (btnText?.includes('Report')) { + reportBtn = btn; + break; + } + } + if (reportBtn) break; + } + } + } + + if (!reportBtn) throw new Error(`Report button not found for class: ${currentClassId}`); + + await reportBtn.click(); + await page.waitForSelector('[data-testid="report-modal"]', { timeout: 10000 }); + await delay(500); +} + +// Given Steps + +Given('the teacher dashboard is accessible', async function () { + await cleanup(); + await page.goto(BASE_URL); + await page.waitForSelector('h1', { timeout: 10000 }); +}); + +Given('a class exists with {string} enrolled students', async function (count: string) { + await createClassViaAPI('E2E Test Class'); + + const studentCount = parseInt(count, 10); + for (let i = 1; i <= studentCount; i++) { + const cpf = `1111111${i.toString().padStart(4, '0')}`; + await createStudentViaAPI(`Student ${i}`, cpf); + await enrollStudentViaAPI(cpf); + } +}); + +Given('a class exists with {string} students', async function (count: string) { + await createClassViaAPI('E2E Test Class'); + + const studentCount = parseInt(count, 10); + for (let i = 1; i <= studentCount; i++) { + const cpf = `2222222${i.toString().padStart(4, '0')}`; + await createStudentViaAPI(`Student ${i}`, cpf); + await enrollStudentViaAPI(cpf); + } +}); + +Given('a class exists with a student who has {string}', async function (_condition: string) { + await createClassViaAPI('No Evaluations Test Class'); + await createStudentViaAPI('Unevaluated Student', '44444444401'); + await enrollStudentViaAPI('44444444401'); +}); + +Given('a class exists with:', async function (dataTable: any) { + await createClassViaAPI('Status Distribution Test Class'); + + const rows = dataTable.hashes(); + let studentIndex = 1; + + for (const row of rows) { + const status = row.status; + const count = parseInt(row.count, 10); + + for (let i = 0; i < count; i++) { + const cpf = `5555555${studentIndex.toString().padStart(4, '0')}`; + await createStudentViaAPI(`${status} Student ${i + 1}`, cpf); + await enrollStudentViaAPI(cpf); + + if (status === 'Approved') { + await addAllGradesForStatus(cpf, 'MA'); + } else if (status === 'Failed') { + await addAllGradesForStatus(cpf, 'MANA'); + } + + studentIndex++; + } + } +}); + +Given('a class exists where the {string} goal has an average of {string}', async function (goal: string, _average: string) { + await createClassViaAPI('Bar Chart Test Class'); + await createStudentViaAPI('Bar Test Student', '66666660001'); + await enrollStudentViaAPI('66666660001'); + await addGradeViaAPI('66666660001', goal, 'MA'); +}); + +Given('a class exists with students', async function () { + await createClassViaAPI('Students Test Class'); + await createStudentViaAPI('Test Student', '77777770001'); + await enrollStudentViaAPI('77777770001'); +}); + +Given('a class exists with students of mixed statuses', async function () { + await createClassViaAPI('Mixed Status Test Class'); + + await createStudentViaAPI('Green Student', '33333330001'); + await enrollStudentViaAPI('33333330001'); + await addAllGradesForStatus('33333330001', 'MA'); + + await createStudentViaAPI('Red Student', '33333330002'); + await enrollStudentViaAPI('33333330002'); + await addAllGradesForStatus('33333330002', 'MANA'); + + await createStudentViaAPI('Yellow Student', '33333330003'); + await enrollStudentViaAPI('33333330003'); +}); + +Given('I am on the Classes page', async function () { + await navigateToClassesPage(); +}); + +Given('I open the report for this class', async function () { + await navigateToClassesPage(); + await openReportForCurrentClass(); +}); + +// When Steps + +When('I click the {string} button for this class', async function (buttonName: string) { + if (buttonName === 'Report') { + await openReportForCurrentClass(); + } +}); + +When('I inspect the {string} chart', async function (chartName: string) { + if (chartName === 'Student Status Distribution') { + await scrollToElement('[data-testid="status-pie-chart"]'); + await page.waitForSelector('[data-testid="status-pie-chart"]', { timeout: 10000 }); + } else if (chartName === 'Evaluation Performance') { + await scrollToElement('[data-testid="evaluation-bar-chart"]'); + await page.waitForSelector('[data-testid="evaluation-bar-chart"]', { timeout: 10000 }); + } + await delay(1500); +}); + +When('I hover over the {string} bar in the {string} chart', async function (_goalName: string, _chartName: string) { + await scrollToElement('[data-testid="evaluation-bar-chart"]'); + await page.waitForSelector('[data-testid="evaluation-bar-chart"]', { timeout: 10000 }); + await page.waitForSelector('.recharts-wrapper', { timeout: 10000 }); + await delay(1500); + + const barChart = await page.$('[data-testid="bar-chart-wrapper"]'); + if (barChart) { + const box = await barChart.boundingBox(); + if (box) { + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await delay(500); + } + } +}); + +When('I click the {string} button', async function (buttonName: string) { + if (buttonName === 'Close') { + let closeBtn = await page.$('[data-testid="close-modal-btn"]'); + if (!closeBtn) { + closeBtn = await page.$('[data-testid="close-report-btn"]'); + } + if (!closeBtn) throw new Error('Close button not found'); + await closeBtn.click(); + await delay(500); + } +}); + +// Then Steps + +Then('the {string} should be visible', async function (elementName: string) { + if (elementName === 'Report Modal') { + const modal = await page.$('[data-testid="report-modal"]'); + expect(modal).not.toBeNull(); + } +}); + +Then('I should see the following sections:', async function (dataTable: any) { + const sections = dataTable.raw().flat(); + const pageContent = await page.content(); + + for (const section of sections) { + const sectionLower = section.toLowerCase().trim(); + const pageContentLower = pageContent.toLowerCase(); + let found = false; + + if (sectionLower.includes('enrollment')) { + const statsSection = await page.$('[data-testid="report-stats"]'); + found = statsSection !== null || pageContentLower.includes('enrollment'); + } else if (sectionLower.includes('status distribution')) { + const pieChart = await page.$('[data-testid="status-pie-chart"]'); + found = pieChart !== null; + } else if (sectionLower.includes('evaluation performance')) { + const barChart = await page.$('[data-testid="evaluation-bar-chart"]'); + const perfTable = await page.$('[data-testid="performance-table"]'); + found = barChart !== null || perfTable !== null; + } else if (sectionLower.includes('students')) { + const studentsTable = await page.$('[data-testid="students-table"]'); + found = studentsTable !== null; + } else { + found = pageContentLower.includes(sectionLower); + } + + expect(found).toBe(true); + } +}); + +Then('the grade cell for this student should display {string}', async function (expected: string) { + await page.waitForSelector('[data-testid="students-table"]', { timeout: 10000 }); + await delay(500); + + const gradeCells = await page.$$('[data-testid="student-grade"]'); + let foundExpected = false; + + for (const cell of gradeCells) { + const text = await page.evaluate(el => el.textContent?.trim() || '', cell); + + if (expected === '–' || expected === '-' || expected === '—') { + if (text === '-' || text === '–' || text === '—' || text === '−') { + foundExpected = true; + break; + } + } else if (text === expected) { + foundExpected = true; + break; + } + } + + expect(foundExpected).toBe(true); +}); + +Then('no cell should display {string} or {string}', async function (forbidden1: string, forbidden2: string) { + const hasForbidden = await page.evaluate((f1, f2) => { + const cells = document.querySelectorAll('td, .stat-value'); + for (let i = 0; i < cells.length; i++) { + const text = cells[i].textContent || ''; + if (text.includes(f1) || text.includes(f2)) { + return { found: true, text }; + } + } + return { found: false }; + }, forbidden1, forbidden2); + + expect(hasForbidden.found).toBe(false); +}); + +Then('the enrollment count should be {string}', async function (expected: string) { + const pageContent = await page.content(); + expect(pageContent).toContain(expected); +}); + +Then('I should see the {string} illustration', async function (_illustrationName: string) { + const pageContent = await page.content(); + const hasEmptyState = + pageContent.toLowerCase().includes('no data') || + pageContent.toLowerCase().includes('no students') || + pageContent.includes('0'); + + expect(hasEmptyState).toBe(true); +}); + +Then('the charts should render in empty state mode', async function () { + const pieChart = await page.$('[data-testid="status-pie-chart"]'); + const barChart = await page.$('[data-testid="evaluation-bar-chart"]'); + expect(pieChart !== null || barChart !== null).toBe(true); +}); + +Then('I should see exactly {string} distinct chart segments', async function (count: string) { + const expectedCount = parseInt(count, 10); + await delay(2000); + + const segmentCount = await page.evaluate(() => { + const sectors = document.querySelectorAll('.recharts-pie-sector'); + const paths = document.querySelectorAll('.recharts-sector'); + const pieCells = document.querySelectorAll('.recharts-pie .recharts-layer path'); + + if (sectors.length > 0) return sectors.length; + if (paths.length > 0) return paths.length; + if (pieCells.length > 0) return pieCells.length; + + const pieContainer = document.querySelector('[data-testid="status-pie-chart"]'); + if (pieContainer) { + const allPaths = pieContainer.querySelectorAll('path[fill]'); + const coloredPaths = Array.from(allPaths).filter(p => { + const fill = p.getAttribute('fill'); + return fill && fill !== 'none' && fill !== '#fff' && fill !== '#ffffff'; + }); + return coloredPaths.length; + } + + return 0; + }); + + expect(segmentCount).toBeGreaterThanOrEqual(expectedCount); +}); + +Then('the legend should display {string} and {string}', async function (status1: string, status2: string) { + const legendTexts = await page.evaluate(() => { + const legendItems = document.querySelectorAll('.recharts-legend-item-text'); + return Array.from(legendItems).map(item => item.textContent?.trim() || ''); + }); + + expect(legendTexts).toContain(status1); + expect(legendTexts).toContain(status2); +}); + +Then('the chart tooltip should display {string}', async function (_expectedText: string) { + const perfTable = await page.$('[data-testid="performance-table"]'); + if (perfTable) { + const tableContent = await page.evaluate(el => el?.textContent || '', perfTable); + const hasExpected = tableContent.includes('10.00') || tableContent.includes('10.0'); + expect(hasExpected).toBe(true); + } else { + const pageContent = await page.content(); + expect(pageContent).toContain('10'); + } +}); + +Then('the report modal should disappear', async function () { + await delay(500); + const modal = await page.$('[data-testid="report-modal"]'); + expect(modal).toBeNull(); +}); + +Then('I should see the {string}', async function (elementName: string) { + if (elementName === 'Classes Table') { + const classesTable = await page.$('[data-testid="classes-table"]'); + expect(classesTable).not.toBeNull(); + } +}); + +Then(/^"([^"]+)" students should have an? "([^"]+)" indicator$/, async function (status: string, _color: string) { + await scrollToElement('[data-testid="students-table"]'); + await page.waitForSelector('[data-testid="students-table"]', { timeout: 10000 }); + await delay(500); + + const statusLower = status.toLowerCase().replace(/_/g, '-'); + const selector = `[data-testid="status-indicator-${statusLower}"]`; + + const indicator = await page.$(selector); + expect(indicator).not.toBeNull(); + + if (indicator) { + const computedColor = await page.evaluate((el) => { + return window.getComputedStyle(el).color; + }, indicator); + expect(computedColor).toBeDefined(); + } +}); diff --git a/client/src/step-definitions/report-filters-steps.ts b/client/src/step-definitions/report-filters-steps.ts new file mode 100644 index 00000000..c10a2bc3 --- /dev/null +++ b/client/src/step-definitions/report-filters-steps.ts @@ -0,0 +1,230 @@ +import { Given, When, Then, Before, After, DataTable, setDefaultTimeout } from '@cucumber/cucumber'; +import { Page } from 'puppeteer'; +import expect from 'expect'; +import { getPage } from './shared-browser'; + +setDefaultTimeout(60 * 1000); + +const BASE_URL = 'http://127.0.0.1:3004'; +const SERVER_URL = 'http://127.0.0.1:3005'; + +let page: Page; +let currentClassId: string | null = null; +let createdCpfs: string[] = []; +let currentClassName: string = ''; + +// Hooks + +Before({ tags: '@gui-report' }, async function () { + currentClassId = null; + createdCpfs = []; + currentClassName = ''; + page = await getPage(); +}); + +After({ tags: '@gui-report' }, async function () { + const cleanup = async () => { + let cleanupErrors: string[] = []; + + for (const cpf of createdCpfs) { + try { + const response = await fetch(`${SERVER_URL}/api/students/${cpf}`, { method: 'DELETE' }); + if (!response.ok) { + cleanupErrors.push(`Failed to delete student ${cpf}: ${response.status}`); + } + } catch (error) { + cleanupErrors.push(`Error deleting student ${cpf}: ${error}`); + } + } + + if (currentClassId) { + try { + const response = await fetch(`${SERVER_URL}/api/classes/${currentClassId}`, { method: 'DELETE' }); + if (!response.ok) { + cleanupErrors.push(`Failed to delete class ${currentClassId}: ${response.status}`); + } + } catch (error) { + cleanupErrors.push(`Error deleting class ${currentClassId}: ${error}`); + } + } + + if (cleanupErrors.length > 0) { + console.warn('Cleanup warnings:', cleanupErrors); + } + }; + + await cleanup(); +}); + +// Helper Functions + +async function verifyTableCount(expectedCount: number): Promise { + try { + await page.waitForFunction( + (expected) => { + const rows = document.querySelectorAll('table.students-table tbody tr'); + const emptyState = document.querySelector('.empty-state-row'); + if (expected === 0) return !!emptyState || rows.length === 0; + const realRows = Array.from(rows).filter(r => !r.classList.contains('empty-state-row')); + return realRows.length === expected; + }, + { timeout: 5000 }, + expectedCount + ); + } catch { + await page.screenshot({ path: 'table-count-error.png' }); + throw new Error(`Count mismatch: Expected ${expectedCount} students.`); + } +} + +function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +// Given Steps + +Given('a class exists with name {string} for GUI testing', async function (className: string) { + const uniqueTopic = `${className} ${Date.now()}`; + currentClassName = uniqueTopic; + + const response = await fetch(`${SERVER_URL}/api/classes`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + topic: uniqueTopic, + semester: 1, + year: 2025 + }) + }); + + const data = await response.json(); + if (!response.ok || data.error) { + throw new Error(`Failed to create class via API: ${data.error || response.statusText}`); + } + currentClassId = data._id || data.id; +}); + +Given('the following students have evaluations for the GUI test:', async function (dataTable: DataTable) { + const rows = dataTable.hashes(); + + for (const row of rows) { + await fetch(`${SERVER_URL}/api/students/${row.cpf}`, { method: 'DELETE' }).catch(() => {}); + + await fetch(`${SERVER_URL}/api/students`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name: row.name, cpf: row.cpf, email: `${row.name}@test.com` }) + }); + createdCpfs.push(row.cpf); + + await fetch(`${SERVER_URL}/api/classes/${currentClassId}/enroll`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ studentCPF: row.cpf }) + }); + + const evalRes = await fetch(`${SERVER_URL}/api/classes/${currentClassId}/enrollments/${row.cpf}/evaluation`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ goal: 'Filter Test', grade: row.gradeType }) + }); + + if (!evalRes.ok) { + const err = await evalRes.text(); + throw new Error(`API rejected grade assignment: ${err}`); + } + } +}); + +Given('I am on the home page', async function () { + await page.goto(`${BASE_URL}/`); + await page.waitForSelector('h1', { timeout: 10000 }); +}); + +Given('I navigate to the {string} section', async function (sectionName: string) { + const selector = `[data-testid="${sectionName.toLowerCase()}-tab"]`; + await page.waitForSelector(selector); + await page.click(selector); + await delay(500); +}); + +// When Steps + +When('I click on the report button for the class {string}', async function (_className: string) { + if (!currentClassId) throw new Error('No class ID available'); + + const reportBtnSelector = `[data-testid="report-class-${currentClassId}"]`; + + await page.evaluate((sel) => { + const element = document.querySelector(sel); + if (element) element.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }, reportBtnSelector); + await delay(300); + + let reportBtn = await page.$(reportBtnSelector); + + if (!reportBtn) { + const rows = await page.$$('table tbody tr'); + for (const row of rows) { + const text = await page.evaluate(el => el.textContent, row); + if (text && currentClassName && text.includes(currentClassName.split(' ')[0])) { + reportBtn = await row.$('button'); + if (reportBtn) break; + } + } + } + + if (!reportBtn) throw new Error('Report button not found'); + + await reportBtn.click(); + await page.waitForSelector('table.students-table, .empty-state-row', { timeout: 10000 }); +}); + +When('I select {string} in the filter dropdown', async function (optionText: string) { + const valueMap: Record = { + 'Approved': 'APPROVED', + 'Below Class Average': 'BELOW_AVG', + 'Below specific grade...': 'BELOW_X' + }; + const value = valueMap[optionText] || 'ALL'; + + await page.waitForSelector('#filterType'); + await page.select('#filterType', value); + + await page.evaluate((val) => { + const el = document.querySelector('#filterType') as HTMLSelectElement; + el.value = val; + el.dispatchEvent(new Event('change', { bubbles: true })); + }, value); + + await delay(1000); +}); + +When('I set the threshold value to {float}', async function (value: number) { + await page.waitForSelector('.filter-input-x'); + const input = await page.$('.filter-input-x'); + await input?.click({ clickCount: 3 }); + await input?.type(String(value)); + await delay(500); +}); + +// Then Steps + +Then('the student table should show exactly {int} student', async function (count: number) { + await verifyTableCount(count); +}); + +Then('the student table should show exactly {int} students', async function (count: number) { + await verifyTableCount(count); +}); + +Then('the student {string} should be visible in the list', async function (name: string) { + const xpath = `xpath///table[contains(@class, 'students-table')]//td[contains(., '${name}')]`; + await page.waitForSelector(xpath, { timeout: 5000 }); +}); + +Then('the student {string} should NOT be visible in the list', async function (name: string) { + const xpath = `xpath///table[contains(@class, 'students-table')]//td[contains(., '${name}')]`; + const elements = await page.$$(xpath); + expect(elements.length).toBe(0); +}); \ No newline at end of file diff --git a/client/src/step-definitions/server-report-filters-steps.ts b/client/src/step-definitions/server-report-filters-steps.ts new file mode 100644 index 00000000..a3ac7ad6 --- /dev/null +++ b/client/src/step-definitions/server-report-filters-steps.ts @@ -0,0 +1,152 @@ +import { Given, When, Then, After, DataTable, setDefaultTimeout } from '@cucumber/cucumber'; +import expect from 'expect'; + +setDefaultTimeout(30 * 1000); + +const serverUrl = 'http://localhost:3005'; + +let currentClassId: string; +let lastReportData: any; +let filteredStudents: any[]; +let createdCpfs: string[] = []; + +After({ tags: '@server' }, async function () { + if (currentClassId) { + try { + await fetch(`${serverUrl}/api/classes/${currentClassId}`, { method: 'DELETE' }); + } catch (e) {} + } + + if (createdCpfs.length > 0) { + for (const cpf of createdCpfs) { + try { + await fetch(`${serverUrl}/api/students/${cpf}`, { method: 'DELETE' }); + } catch (e) {} + } + createdCpfs = []; + } +}); + +Given('a class exists with name {string}', async function (className: string) { + const response = await fetch(`${serverUrl}/api/classes`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + topic: className, + name: className, + code: `TEST-${Date.now()}`, + semester: 1, + year: 2024 + }) + }); + + if (!response.ok) { + throw new Error(`Falha ao criar turma. Status: ${response.status}`); + } + + const data = await response.json(); + currentClassId = data.id || data._id || data.classId; + + if (!currentClassId) { + throw new Error("O servidor criou a turma, mas não retornou um ID válido."); + } +}); + +Given('the following students have evaluations in this class:', async function (dataTable: DataTable) { + const rows = dataTable.hashes(); + + for (const row of rows) { + await fetch(`${serverUrl}/api/students/${row.cpf}`, { method: 'DELETE' }).catch(() => {}); + + const studentRes = await fetch(`${serverUrl}/api/students`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + name: row.name, + cpf: row.cpf, + email: `${row.name.toLowerCase()}@test.com` + }) + }); + + if (!studentRes.ok) { + throw new Error(`Falha ao criar aluno. Status: ${studentRes.status}`); + } + createdCpfs.push(row.cpf); + + const enrollRes = await fetch(`${serverUrl}/api/classes/${currentClassId}/enroll`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ studentCPF: row.cpf }) + }); + + if (!enrollRes.ok) { + throw new Error(`Falha ao matricular aluno. Status: ${enrollRes.status}`); + } + + const evalUrl = `${serverUrl}/api/classes/${currentClassId}/enrollments/${row.cpf}/evaluation`; + + const evalRes = await fetch(evalUrl, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + goal: "Test Goal", + grade: row.gradeType + }) + }); + + if (!evalRes.ok) { + throw new Error(`Falha ao atribuir nota. Status: ${evalRes.status}`); + } + } +}); + +When('I request the class report', async function () { + if (!currentClassId) throw new Error("ID da turma não definido."); + + const response = await fetch(`${serverUrl}/api/classes/${currentClassId}/report`); + + if (!response.ok) { + throw new Error(`Falha ao buscar relatório. Status: ${response.status}`); + } + + lastReportData = await response.json(); +}); + +When('I apply the {string} filter on the report data', function (filterType: string) { + const students = lastReportData.students; + const average = lastReportData.studentsAverage; + + if (filterType === 'BELOW_AVG') { + filteredStudents = students.filter((s: any) => s.finalGrade < average); + } else if (filterType === 'APPROVED') { + filteredStudents = students.filter((s: any) => s.status === 'APPROVED'); + } else { + filteredStudents = students; + } +}); + +When('I apply the {string} filter with value {float}', function (filterType: string, threshold: number) { + const students = lastReportData.students; + + if (filterType === 'BELOW_THRESHOLD') { + filteredStudents = students.filter((s: any) => s.finalGrade < threshold); + } +}); + +Then('the filtered list should contain exactly {int} student', function (count: number) { + expect(filteredStudents.length).toBe(count); +}); + +Then('the filtered list should contain exactly {int} students', function (count: number) { + expect(filteredStudents.length).toBe(count); +}); + +Then('the student {string} should be present in the filtered list', function (name: string) { + const found = filteredStudents.some((s: any) => s.name === name); + expect(found).toBe(true); +}); + +Then('the student {string} should NOT be present in the filtered list', function (name: string) { + const found = filteredStudents.some((s: any) => s.name === name); + expect(found).toBe(false); +}); \ No newline at end of file diff --git a/client/src/step-definitions/shared-browser.ts b/client/src/step-definitions/shared-browser.ts new file mode 100644 index 00000000..4fc6ca34 --- /dev/null +++ b/client/src/step-definitions/shared-browser.ts @@ -0,0 +1,37 @@ +import { Browser, Page, launch } from 'puppeteer'; +import { AfterAll } from '@cucumber/cucumber'; + +let browser: Browser | null = null; +let page: Page | null = null; + +export async function getBrowser(): Promise { + if (!browser) { + browser = await launch({ + headless: false, + slowMo: 50, + defaultViewport: null, + args: ['--start-maximized'] + }); + } + return browser; +} + +export async function getPage(): Promise { + const b = await getBrowser(); + if (!page) { + page = await b.newPage(); + } + return page; +} + +export async function closeBrowser(): Promise { + if (browser) { + await browser.close(); + browser = null; + page = null; + } +} + +AfterAll(async function () { + await closeBrowser(); +}); diff --git a/client/src/types/Report.ts b/client/src/types/Report.ts index 1dad8dfb..eab975d0 100644 --- a/client/src/types/Report.ts +++ b/client/src/types/Report.ts @@ -1,6 +1,13 @@ +export type StudentStatus = + | 'APPROVED' + | 'APPROVED_FINAL' + | 'FAILED' + | 'FAILED_BY_ABSENCE' + | 'PENDING'; + export interface EvaluationPerformance { goal: string; - averageGrade: number; + averageGrade: number | null; gradeDistribution: { MANA: number; MPA: number; @@ -9,17 +16,23 @@ export interface EvaluationPerformance { evaluatedStudents: number; } +export interface StatusCounts { + approvedCount: number; + approvedFinalCount: number; + notApprovedCount: number; + failedByAbsenceCount: number; + pendingCount: number; +} + export interface ReportFilter { - type: 'ALL' | 'APPROVED' | 'APPROVED_FINAL' | 'FAILED' | 'BELOW_AVERAGE' | 'BELOW_THRESHOLD'; + type: 'ALL' | 'APPROVED' | 'APPROVED_FINAL' | 'FAILED' | 'FAILED_BY_ABSENCE' | 'PENDING' | 'BELOW_AVERAGE' | 'BELOW_THRESHOLD'; threshold?: number; } -export type StudentStatus = 'APPROVED' | 'APPROVED_FINAL' | 'FAILED'; - export interface StudentEntry { studentId: string; name: string; - finalGrade: number; + finalGrade: number | null; status: StudentStatus; } @@ -29,10 +42,12 @@ export interface ReportData { semester: number; year: number; totalEnrolled: number; - studentsAverage: number; + studentsAverage: number | null; approvedCount: number; approvedFinalCount: number; notApprovedCount: number; + failedByAbsenceCount: number; + pendingCount: number; evaluationPerformance: EvaluationPerformance[]; students: StudentEntry[]; generatedAt: Date; diff --git a/client/src/utils/index.ts b/client/src/utils/index.ts new file mode 100644 index 00000000..bebbaa16 --- /dev/null +++ b/client/src/utils/index.ts @@ -0,0 +1 @@ +export * from './textUtils'; diff --git a/client/src/utils/textUtils.ts b/client/src/utils/textUtils.ts new file mode 100644 index 00000000..19d5f3c5 --- /dev/null +++ b/client/src/utils/textUtils.ts @@ -0,0 +1,23 @@ +/** + * Wraps text into multiple lines based on max width (approximate character count per line). + * + * @param text - The text to wrap + * @param maxCharsPerLine - Maximum characters per line before wrapping + * @returns Array of lines + */ +export const wrapText = (text: string, maxCharsPerLine: number): string[] => { + const words = text.split(' '); + const lines: string[] = []; + let currentLine = ''; + + words.forEach(word => { + if ((currentLine + ' ' + word).trim().length <= maxCharsPerLine) { + currentLine = (currentLine + ' ' + word).trim(); + } else { + if (currentLine) lines.push(currentLine); + currentLine = word; + } + }); + if (currentLine) lines.push(currentLine); + return lines; +}; diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 00000000..455cbe9a --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,41 @@ +const { defineConfig } = require('cypress'); +const createBundler = require('@bahmutov/cypress-esbuild-preprocessor'); +const { addCucumberPreprocessorPlugin } = require('@badeball/cypress-cucumber-preprocessor'); +const { createEsbuildPlugin } = require('@badeball/cypress-cucumber-preprocessor/esbuild'); + +module.exports = defineConfig({ + e2e: { + // Base URL for the application + baseUrl: 'http://localhost:3004', + + // Specify the pattern for feature files + specPattern: 'cypress/e2e/features/**/*.feature', + + // Configure the step definitions path + supportFile: 'cypress/support/e2e.js', + + // Configure timeouts + defaultCommandTimeout: 10000, + requestTimeout: 10000, + responseTimeout: 10000, + + // Configure video and screenshot settings + video: false, + screenshotOnRunFailure: true, + + async setupNodeEvents(on, config) { + // Add Cucumber preprocessor plugin + await addCucumberPreprocessorPlugin(on, config); + + // Configure esbuild bundler with Cucumber plugin + on( + 'file:preprocessor', + createBundler({ + plugins: [createEsbuildPlugin(config)], + }) + ); + + return config; + }, + }, +}); diff --git a/cypress/README.md b/cypress/README.md new file mode 100644 index 00000000..358ebe94 --- /dev/null +++ b/cypress/README.md @@ -0,0 +1,42 @@ +# Cypress E2E Tests + +This directory contains end-to-end tests for the Teaching Assistant Import Students application using Cypress and Cucumber. + +## Structure + +``` +cypress/ +├── e2e/ +│ ├── features/ # Gherkin .feature files +│ └── stepDefinitions/ # Step definition implementations (.js files) +├── fixtures/ # Test data and upload files +└── support/ # Custom commands and configuration +``` + +## Running Tests + +### Prerequisites + +Make sure both server and client are running: +- Server: `http://localhost:3001` +- Client: `http://localhost:3004` + +### Commands + +```bash +# Open Cypress Test Runner +npx cypress open + +# Run all tests headlessly +npx cypress run + +# Run specific feature +npx cypress run --spec "cypress/e2e/features/classComparison.feature" +``` + +## Test Philosophy + +- **Self-contained**: Tests create their own data via API and clean up afterwards +- **No external dependencies**: No reliance on pre-existing database state +- **English code**: Variable and function names in English, with explanatory comments +- **BDD approach**: Feature files describe behavior, step definitions implement the tests diff --git a/cypress/e2e/features/classComparison.feature b/cypress/e2e/features/classComparison.feature new file mode 100644 index 00000000..d99795f5 --- /dev/null +++ b/cypress/e2e/features/classComparison.feature @@ -0,0 +1,18 @@ +Feature: Class Comparison + As a user + I want to compare classes + So that I can analyze their performance and enrollment data + + Scenario: Comparison request rejected due to insufficient number of classes + Given the client sends a request to compare only one class, "ESS" + When the server validates the comparison request + Then the server returns HTTP 400 + And the response body contains an error message indicating that at least two classes are required for comparison + + + Scenario: Exceeded maximum number of classes in comparison request + Given the client sends a request to compare 7 classes + When the server validates the request + Then the server returns HTTP 400 + And the response body contains an error stating that the maximum number of classes allowed for comparison is 6 + And the request is not processed \ No newline at end of file diff --git a/cypress/e2e/features/classComparison.js b/cypress/e2e/features/classComparison.js new file mode 100644 index 00000000..d6779fb5 --- /dev/null +++ b/cypress/e2e/features/classComparison.js @@ -0,0 +1,5 @@ +// Shim to locate step definitions for the classComparison feature +// The cucumber preprocessor searches for step definition files next to the +// feature file by default. Require the actual implementation from the +// centralized stepDefinitions folder so we don't duplicate code. +require('../stepDefinitions/classComparison.steps.js'); diff --git a/cypress/e2e/features/importStudentsToClass.feature b/cypress/e2e/features/importStudentsToClass.feature new file mode 100644 index 00000000..946fa86c --- /dev/null +++ b/cypress/e2e/features/importStudentsToClass.feature @@ -0,0 +1,91 @@ +Feature: As a professor + I want to enroll students in a class by uploading a spreadsheet file (.csv or .xlsx) containing their CPFs + So that I can quickly populate a large class without having to add each student manually. + +Scenario: Import succeeds completely + Given I am logged in as a teacher and on the "Classes" tab + And the system has the class "Class A" with no enrolled students + And the system has registered students with IDs "11111122222" and "33333444444" + When I upload a file "alunos.csv" containing IDs "11111122222" and "33333444444" + Then I am redirected to the "Success" screen + And the screen shows the message "Import completed: 2 students were imported successfully and 0 were rejected" + And when I return to the "Class A" student list, students "11111122222" and "33333444444" are listed + +Scenario: Import into a non-empty class + Given I am logged in as a teacher and on the "Classes" tab + And the system has registered students with IDs "11111122222" and "33333444444" + And the system has the class "Class A" registered + And "Class A" already has the student with ID "11111122222" + And the student with ID "33333444444" is not in "Class A" + + When I upload a file "alunos.csv" containing IDs "11111122222" (already in the class) and "33333444444" (new) + + Then I am redirected to the "Success" screen + And the screen shows the message "Import completed: 1 student was imported successfully and 0 were rejected" + And the "Class A" student list now contains both students "11111122222" and "33333444444" + +Scenario: Import with an empty file + Given I am logged in as a teacher and on the "Classes" tab + When I try to upload a file "vazia.csv" that contains no data rows + Then I am redirected to the "Error case" screen + And the screen shows the error message: "The uploaded file is empty or not supported (only .xlsx or .csv allowed). Please upload a file with valid registration numbers." + +Scenario: Partial import: registration not found in the student registry + Given I am logged in as a teacher and on the "Classes" tab + And the system has the class "Class A" with no enrolled students + And the system has registered students with IDs "11111122222" and "33333444444" + And the system has not registered a student with ID "09876543212" + + When I upload a file "alunos-1-Not-2.csv" containing IDs "11111122222", "09876543212" and "33333444444" + + Then I am redirected to the "Success" screen + And the screen shows the summary "2 students imported successfully and 1 student rejected" + And "Class A" now has students "11111122222" and "33333444444" enrolled + +Scenario: Partial import: blank registration + Given I am logged in as a teacher and on the "Classes" tab + And the system has the student with ID "11111122222" + And the system has the class "Class A" with no enrolled students + + When I upload a file "alunos-blank-1.csv" where row 1 has a blank registration line and row 2 contains ID "11111122222" + + Then I am redirected to the "Success" screen + And the screen shows the summary "1 student imported successfully and 0 student rejected" + And when I return to the "Class A" student list, student "11111122222" is listed + +Scenario: Multiple columns file + Given I am logged in as a teacher and on the "Classes" tab + And the system has the student with ID "11111122222" + And the system has the class "Class A" with no enrolled students + + When I upload a file "alunos-col.csv" where row 1 is "nome,cpf,login" and row 2 is "anyName,11111122222,anyLogin" + + Then I am redirected to the "Success" screen + And the screen shows the summary "1 student imported successfully and 0 student rejected" + And when I return to the "Class A" student list, student "11111122222" is listed +# Service-level scenarios testing REST API endpoints + +Scenario: Get student by CPF via API + Given the system has a student with CPF "11111111111", name "Paulo Borba" and email "phmb@cin.ufpe.br" + When a "GET" request is sent to "/api/students/11111111111" + Then the response status should be "200" + And the response JSON should contain CPF "11111111111", name "Paulo Borba" and email "phmb@cin.ufpe.br" + +Scenario: Get all classes via API + Given the system has the following classes: + | topic | semester | year | + | Engenharia de Software e Sistemas | 1 | 2025 | + | Engenharia de Software e Sistemas | 2 | 2025 | + When a "GET" request is sent to "/api/classes" + Then the response status should be "200" + And the response JSON should be a list of classes + And the class with topic "Engenharia de Software e Sistemas", semester "1" and year "2025" is in the list + And the class with topic "Engenharia de Software e Sistemas", semester "2" and year "2025" is in the list + +Scenario: Enroll student in class via API + Given the system has a student with CPF "11111122222", name "Test Student" and email "test@test.com" + And the system has a class with id "TestAPIClass-2025-1" + And the student with CPF "11111122222" is not enrolled in class "TestAPIClass-2025-1" + When a "POST" request is sent to "/api/classes/TestAPIClass-2025-1/enroll" with body containing studentCPF "11111122222" + Then the response status should be "201" + And the student with CPF "11111122222" should be enrolled in class "TestAPIClass-2025-1" diff --git a/cypress/e2e/stepDefinitions/classComparison.steps.js b/cypress/e2e/stepDefinitions/classComparison.steps.js new file mode 100644 index 00000000..424b8630 --- /dev/null +++ b/cypress/e2e/stepDefinitions/classComparison.steps.js @@ -0,0 +1,133 @@ +const { Given, When, Then, Before, After } = require("@badeball/cypress-cucumber-preprocessor"); + +// Test context to store data created during the test +let testContext = { + classes: [], + comparisonResponse: null +}; + +const API_BASE_URL = 'http://localhost:3005'; + +Before(() => { + testContext = { + classes: [], + comparisonResponse: null + }; +}); + +After(() => { + cy.log('Cleaning up test data'); + // Add cleanup logic if necessary +}); + +Given('the client sends a request to compare the classes {string} and {string}', (class1, class2) => { + testContext.classes = [class1, class2]; +}); + +Given('both classes exist in the system', () => { + testContext.classesInfo = {}; + testContext.classes.forEach((className) => { + // server expects topic/semester/year + cy.request('POST', `${API_BASE_URL}/api/classes`, { topic: className, semester: 1, year: 2025 }) + .then((resp) => { + testContext.classesInfo[className] = resp.body.id; + }); + }); +}); + +Given('both classes have enrolled students', () => { + // create two students per class and enroll them using server endpoints + const generateCPF = () => Math.floor(10000000000 + Math.random() * 90000000000).toString(); + + testContext.classes.forEach((className) => { + const classId = testContext.classesInfo && testContext.classesInfo[className]; + // create two students and enroll them + for (let i = 1; i <= 2; i++) { + const cpf = generateCPF(); + const studentName = `${className} Student ${i}`; + const email = `${studentName.replace(/\s+/g, '').toLowerCase()}@example.com`; + + cy.request('POST', `${API_BASE_URL}/api/students`, { name: studentName, cpf, email }) + .then(() => { + cy.request('POST', `${API_BASE_URL}/api/classes/${classId}/enroll`, { studentCPF: cpf }); + }); + } + }); +}); + +When('the server processes the comparison request', () => { + cy.request('POST', `${API_BASE_URL}/api/compare-classes`, { classes: testContext.classes }) + .then((response) => { + testContext.comparisonResponse = response; + }); +}); + +Then('the server returns HTTP {int}', (statusCode) => { + expect(testContext.comparisonResponse.status).to.eq(statusCode); +}); + +Then('the response body contains the comparison data for {string} and {string}', (class1, class2) => { + expect(testContext.comparisonResponse.body).to.have.property('comparisonData'); + expect(testContext.comparisonResponse.body.comparisonData).to.include.keys(class1, class2); +}); + +Given('the client sends a request to compare only one class, {string}', (class1) => { + testContext.classes = [class1]; +}); + +When('the server validates the comparison request', () => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/compare-classes`, + body: { classes: testContext.classes }, + failOnStatusCode: false + }).then((response) => { + testContext.comparisonResponse = response; + }); +}); + +// alias for feature text that used slightly different wording +When('the server validates the request', () => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/compare-classes`, + body: { classes: testContext.classes }, + failOnStatusCode: false + }).then((response) => { + testContext.comparisonResponse = response; + }); +}); + +Then('the response body contains an error message indicating that at least two classes are required for comparison', () => { + expect(testContext.comparisonResponse.body).to.have.property('error', 'At least two classes are required for comparison'); +}); + +Given('the class {string} has zero enrolled students', (className) => { + // create a class without enrollments using the API + cy.request('POST', `${API_BASE_URL}/api/classes`, { topic: className, semester: 1, year: 2025 }) + .then((resp) => { + testContext.classesInfo = testContext.classesInfo || {}; + testContext.classesInfo[className] = resp.body.id; + }); +}); + +Then('the response body contains an error message stating that {string} \(and possibly other classes\) have no enrolled students', (className) => { + expect(testContext.comparisonResponse.body).to.have.property('error'); + expect(testContext.comparisonResponse.body.error).to.include(`${className} has no enrolled students`); +}); + +Then('no comparison data is returned', () => { + expect(testContext.comparisonResponse.body).to.not.have.property('comparisonData'); +}); + +Then('the request is not processed', () => { + expect(testContext.comparisonResponse.body).to.not.have.property('comparisonData'); +}); + +Given('the client sends a request to compare {int} classes', (numClasses) => { + testContext.classes = Array.from({ length: numClasses }, (_, i) => `Class ${i + 1}`); +}); + +Then('the response body contains an error stating that the maximum number of classes allowed for comparison is {int}', (maxClasses) => { + expect(testContext.comparisonResponse.body).to.have.property('error', `The maximum number of classes allowed for comparison is ${maxClasses}`); +}); \ No newline at end of file diff --git a/cypress/e2e/stepDefinitions/importStudentsToClass.steps.js b/cypress/e2e/stepDefinitions/importStudentsToClass.steps.js new file mode 100644 index 00000000..5e06806f --- /dev/null +++ b/cypress/e2e/stepDefinitions/importStudentsToClass.steps.js @@ -0,0 +1,1062 @@ +// Step definitions for Student Import feature +// Uses require syntax as per Cypress Cucumber Preprocessor standards + +const { Given, When, Then, Before, After } = require("@badeball/cypress-cucumber-preprocessor"); + +// Test context to store data created during the test +let testContext = { + classData: null, + studentsData: [], + createdClassId: null, + createdStudentCPFs: [] +}; + +// Base URLs for API calls +const API_BASE_URL = 'http://localhost:3005'; +const CLIENT_BASE_URL = 'http://localhost:3004'; + +/** + * Before hook - runs before each scenario + * Initializes test context + */ +Before(function () { + testContext = { + classData: null, + studentsData: [], + createdClassId: null, + createdStudentCPFs: [] + }; +}); + +/** + * After hook - runs after each scenario + * Cleans up all test data created during the test + * This runs even when tests fail, ensuring proper cleanup + */ +After(function () { + cy.log('=== CLEANUP: Starting teardown ==='); + + // Store context locally before reset + const classId = testContext.createdClassId; + const studentCPFs = [...testContext.createdStudentCPFs]; + const allTestCPFs = ['11111122222', '33333444444', '09876543212']; + const currentYear = new Date().getFullYear(); + const testClassIds = [ + `Class A-${currentYear}-1`, + `Test Class-${currentYear}-1`, + `Cleanup Test Class-${currentYear}-1` + ]; + + // Wrap cleanup in cy.then() to ensure it executes sequentially + cy.then(() => { + cy.log(`Cleaning up class: ${classId}, students: ${studentCPFs.join(', ')}`); + + // Delete enrolled students from the class first + if (classId && studentCPFs.length > 0) { + studentCPFs.forEach(cpf => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${classId}/enroll/${cpf}`, + failOnStatusCode: false + }); + }); + } + + // Delete the test class + if (classId) { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${classId}`, + failOnStatusCode: false + }); + } + + // Delete all known test classes (failsafe) + testClassIds.forEach(testClassId => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${testClassId}`, + failOnStatusCode: false + }); + }); + + // Delete the test students + if (studentCPFs.length > 0) { + studentCPFs.forEach(cpf => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }); + }); + } + + // Delete all test CPFs from fixtures (failsafe) + allTestCPFs.forEach(cpf => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }); + }); + + cy.log('=== CLEANUP: Completed ==='); + }); + + // Reset test context + testContext = { + classData: null, + studentsData: [], + createdClassId: null, + createdStudentCPFs: [] + }; +}); + +/** + * Given: User is logged in and on the Classes page + * Note: Since there's no authentication system yet, we just visit the base URL + */ +Given('I am logged in as a teacher and on the "Classes" page', function () { + cy.visit(CLIENT_BASE_URL); + cy.url().should('include', CLIENT_BASE_URL); + + // Wait for the page to load + cy.contains('h1', 'Teaching Assistant React').should('be.visible'); + + // Click on the Classes tab + cy.contains('button', 'Classes').click(); + + // Wait for the Classes section to load - verify the Classes heading is visible + cy.contains('h2', 'Class Management').should('be.visible'); +}); + +/** + * Given: System has a specific class with no enrolled students + * Creates a class via API and stores the class ID for later cleanup + */ +Given('the system has the class {string} with no enrolled students', function (className) { + // Create class data + const classPayload = { + topic: className, + semester: 1, + year: new Date().getFullYear() + }; + + // Generate the class ID that would be created + const potentialClassId = `${className}-${classPayload.year}-${classPayload.semester}`; + + // First, try to delete the class if it already exists (from previous failed test) + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${potentialClassId}`, + failOnStatusCode: false + }).then(() => { + // Now create the class via API + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classPayload + }).then((response) => { + expect(response.status).to.eq(201); + expect(response.body).to.have.property('id'); + + // Store class data for cleanup + testContext.createdClassId = response.body.id; + testContext.classData = response.body; + + cy.log(`Created class: ${className} with ID: ${testContext.createdClassId}`); + }); + }); +}); + +/** + * Given: System has registered students with specific IDs + * Creates students via API and stores their CPFs for later cleanup + */ +Given('the system has registered students with IDs {string} and {string}', function (cpf1, cpf2) { + const cpfs = [cpf1, cpf2]; + + cpfs.forEach((cpf, index) => { + const studentPayload = { + name: `Test Student ${index + 1}`, + cpf: cpf, + email: `student${index + 1}@test.com` + }; + + // First delete if exists, then create + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }).then(() => { + // Now create the student + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/students`, + body: studentPayload + }).then((response) => { + expect(response.status).to.eq(201); + testContext.createdStudentCPFs.push(cpf); + testContext.studentsData.push(studentPayload); + cy.log(`Created student: ${cpf}`); + }); + }); + }); +}); + +/** + * When: User uploads a file containing student IDs + * Selects the CSV file and clicks the Import button + */ +When('I upload a file {string} containing IDs {string} and {string}', function (fileName, cpf1, cpf2) { + // Reload the page to see the newly created class and students + cy.reload(); + + // Click on the Classes tab again + cy.contains('button', 'Classes').click(); + + // Wait for the classes table to load + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); // Give time for data to load + + // Find the class row by topic name and click the Enroll button + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.contains('button', 'Enroll').click(); + }); + + // Wait for the enrollment modal to appear + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Verify the modal shows "No students enrolled yet" + cy.contains('No students enrolled yet').should('be.visible'); + + // Select the CSV file from fixtures + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + + // Verify file was selected + cy.contains('Selected: alunos.csv').should('be.visible'); + + // Click the Import Students button + cy.contains('button', 'Import Students').click(); +}); + +/** + * Then: User is redirected to the Success screen + * Verifies the URL contains the success route + */ +Then('I am redirected to the "Success" screen', function () { + // Wait for navigation to success page + cy.url().should('include', '/import-success', { timeout: 10000 }); + + // Verify success heading is visible + cy.contains('h2', 'Import Successful!').should('be.visible'); +}); + +/** + * Then: Success screen shows the import summary message + * Verifies the exact message with imported and rejected counts + * Works for both 1 student and 2 students scenarios + */ +Then('the screen shows the message {string}', function (expectedMessage) { + // The actual message in the app is in Portuguese + // Check for the Portuguese message that contains the counts + cy.contains('p', 'Importação concluída').should('be.visible'); + + // Check if this is the "1 student" message (partial import scenario) + if (expectedMessage.includes('1 student was imported')) { + // The component shows "1 alunos" (plural is always used in the code) + // Just verify the number 1 is shown + cy.contains('p', '1 alunos foram importados com sucesso').should('be.visible'); + + // Verify stats show 1 imported + cy.get('.stat-item').first().within(() => { + cy.get('.stat-number').should('contain', '1'); + }); + + cy.get('.stat-item').last().within(() => { + cy.get('.stat-number').should('contain', '0'); + }); + } else { + // Original scenario with 2 students + cy.contains('p', '2 alunos foram importados com sucesso e 0 foram rejeitados').should('be.visible'); + + cy.get('.stat-item').first().within(() => { + cy.get('.stat-number').should('contain', '2'); + }); + + cy.get('.stat-item').last().within(() => { + cy.get('.stat-number').should('contain', '0'); + }); + } +}); + +/** + * Then: Navigate back and verify students are enrolled in the class + * Returns to the Classes page and checks that both students are listed + */ +Then('when I return to the "Class A" student list, students {string} and {string} are listed', function (cpf1, cpf2) { + // Click the back button to return to Classes page + cy.contains('button', 'Voltar').click(); + + // Wait for navigation back to home page + cy.url().should('eq', CLIENT_BASE_URL + '/'); + + // Click on Classes tab to see the classes + cy.contains('button', 'Classes').click(); + + // Wait for classes to load + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); // Give time for data to reload + + // Find the class row and verify enrollment count + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + // Check that enrolled students count is now 2 + cy.get('td').eq(3).should('contain', '2'); + + // Click Enroll button to see the enrolled students + cy.contains('button', 'Enroll').click(); + }); + + // Wait for the enrollment modal to appear + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Verify the enrollment count in the modal + cy.contains('Currently Enrolled (2)').should('be.visible'); + + // Verify both students are shown in the enrolled list + cy.get('.enrolled-students-list').within(() => { + cy.contains('Test Student 1').should('be.visible'); + cy.contains('Test Student 2').should('be.visible'); + }); + + cy.log('Successfully verified both students are enrolled in the class'); +}); + +// ============================================ +// Step Definitions for Scenario 2: Import into a non-empty class +// ============================================ + +/** + * Given: User is logged in and on the Classes tab + * Alternative phrasing for the same step + */ +Given('I am logged in as a teacher and on the "Classes" tab', function () { + cy.visit(CLIENT_BASE_URL); + cy.url().should('include', CLIENT_BASE_URL); + + // Wait for the page to load + cy.contains('h1', 'Teaching Assistant React').should('be.visible'); + + // Click on the Classes tab + cy.contains('button', 'Classes').click(); + + // Wait for the Classes section to load + cy.contains('h2', 'Class Management').should('be.visible'); +}); + +/** + * Given: System has a class registered (may have students) + * Creates a class via API for testing enrollment on non-empty class + */ +Given('the system has the class {string} registered', function (className) { + const classPayload = { + topic: className, + semester: 1, + year: new Date().getFullYear() + }; + + const potentialClassId = `${className}-${classPayload.year}-${classPayload.semester}`; + + // Delete if exists, then create + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${potentialClassId}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classPayload + }).then((response) => { + expect(response.status).to.eq(201); + testContext.createdClassId = response.body.id; + testContext.classData = response.body; + cy.log(`Created class: ${className} with ID: ${testContext.createdClassId}`); + }); + }); +}); + +/** + * Given: A specific student is already enrolled in the class + * Enrolls a student in the class via API + */ +Given('{string} already has the student with ID {string}', function (className, cpf) { + // Enroll the student in the class via API + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes/${testContext.createdClassId}/enroll`, + body: { studentCPF: cpf }, + failOnStatusCode: false + }).then((response) => { + // Accept 201 (created) or 200 (OK) + expect([200, 201]).to.include(response.status); + cy.log(`Enrolled student ${cpf} in class ${className}`); + }); +}); + +/** + * Given: Confirms a student is NOT in the class + * This is mainly for documentation/clarity in the test + */ +Given('the student with ID {string} is not in {string}', function (cpf, className) { + // This step is declarative - it confirms the state + // No action needed as we're setting up test data + cy.log(`Confirmed student ${cpf} is not yet enrolled in ${className}`); +}); + +/** + * When: Upload file with mixed students (some already enrolled, some new) + * This handles the more complex upload scenario + */ +When('I upload a file {string} containing IDs {string} \\(already in the class) and {string} \\(new)', function (fileName, cpf1, cpf2) { + // Reload the page to see the newly created class + cy.reload(); + + // Click on the Classes tab again + cy.contains('button', 'Classes').click(); + + // Wait for the classes table to load + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find the class and click Enroll + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.contains('button', 'Enroll').click(); + }); + + // Wait for the enrollment modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Verify one student is already enrolled + cy.contains('Currently Enrolled (1)').should('be.visible'); + + // Select the CSV file + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + + // Verify file was selected + cy.contains(`Selected: ${fileName}`).should('be.visible'); + + // Click Import + cy.contains('button', 'Import Students').click(); +}); + +/** + * Then: Verify the class now contains both students + * Final verification that all students are in the class + */ +Then('the {string} student list now contains both students {string} and {string}', function (className, cpf1, cpf2) { + // Click back button + cy.contains('button', 'Voltar').click(); + + // Navigate back to Classes + cy.url().should('eq', CLIENT_BASE_URL + '/'); + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find the class and verify it has 2 students + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + // Should show 2 enrolled students now + cy.get('td').eq(3).should('contain', '2'); + cy.contains('button', 'Enroll').click(); + }); + + // Verify in the modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + cy.contains('Currently Enrolled (2)').should('be.visible'); + + // Verify both students are listed + cy.get('.enrolled-students-list').within(() => { + cy.contains('Test Student 1').should('be.visible'); + cy.contains('Test Student 2').should('be.visible'); + }); + + cy.log('Successfully verified both students are now enrolled in the class'); +}); + +// ============================================ +// Step Definitions for Scenario 3: Import with an empty file +// ============================================ + +/** + * When: Try to upload an empty CSV file + * Attempts to upload a file with no data rows + */ +When('I try to upload a file {string} that contains no data rows', function (fileName) { + // Reload the page first + cy.reload(); + + // Click on the Classes tab + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(500); + + // We need a class to attempt the upload - create one if not exists + // Check if we have a test class, if not create one + if (!testContext.createdClassId) { + const classPayload = { + topic: 'Test Class', + semester: 1, + year: new Date().getFullYear() + }; + + const potentialClassId = `Test Class-${classPayload.year}-${classPayload.semester}`; + + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${potentialClassId}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classPayload + }).then((response) => { + testContext.createdClassId = response.body.id; + testContext.classData = response.body; + + // Now reload to see the class + cy.reload(); + cy.contains('button', 'Classes').click(); + cy.wait(1000); + + // Click the enroll button directly by data-testid to avoid DOM position fragility + cy.get(`[data-testid="enroll-class-${testContext.createdClassId}"]`, { timeout: 10000 }) + .should('be.visible') + .click(); + + // Wait for modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Select the empty file + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + cy.contains(`Selected: ${fileName}`).should('be.visible'); + + // Click Import + cy.contains('button', 'Import Students').click(); + }); + }); + } else { + // We already have a class from previous steps + cy.get(`[data-testid="enroll-class-${testContext.createdClassId}"]`, { timeout: 10000 }) + .should('be.visible') + .click(); + + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + cy.contains(`Selected: ${fileName}`).should('be.visible'); + cy.contains('button', 'Import Students').click(); + } +}); + +/** + * Then: Verify redirect to Error screen + * Checks that the error page is shown + */ +Then('I am redirected to the "Error case" screen', function () { + // Wait for navigation to error page + cy.url().should('include', '/import-error', { timeout: 10000 }); + + // Verify error heading is visible + cy.contains('h2', 'Import Failed').should('be.visible'); +}); + +/** + * Then: Verify error message for empty file + * Checks the specific error message shown + */ +Then('the screen shows the error message: {string}', function (expectedErrorMessage) { + // The error message should be visible on the error page + // Check for the Portuguese version that matches the backend error + cy.contains('p', 'O arquivo enviado está vazio ou não é suportado').should('be.visible'); + cy.contains('p', 'apenas .xlsx ou .csv permitido').should('be.visible'); +}); + +// ============================================ +// Step Definitions for Scenario 4-6: Additional import scenarios +// ============================================ + +/** + * Given: System has NOT registered a student with specific ID + * Ensures a student does NOT exist (for rejection testing) + */ +Given('the system has not registered a student with ID {string}', function (cpf) { + // Try to delete the student to ensure they don't exist + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }).then(() => { + cy.log(`Ensured student ${cpf} does NOT exist in the system`); + }); +}); + +/** + * Given: System has a specific student (singular) + * Creates a single student via API + */ +Given('the system has the student with ID {string}', function (cpf) { + const studentPayload = { + name: 'Test Student', + cpf: cpf, + email: `student_${cpf}@test.com` + }; + + // Delete if exists, then create + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/students`, + body: studentPayload + }).then((response) => { + expect(response.status).to.eq(201); + testContext.createdStudentCPFs.push(cpf); + cy.log(`Created student: ${cpf}`); + }); + }); +}); + +/** + * When: Upload file with 3 IDs (mixed valid/invalid) + * Handles file upload with multiple students including non-existent ones + */ +When('I upload a file {string} containing IDs {string}, {string} and {string}', function (fileName, cpf1, cpf2, cpf3) { + // Reload the page to see created data + cy.reload(); + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find class and click Enroll + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.contains('button', 'Enroll').click(); + }); + + // Wait for modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Upload file + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + cy.contains(`Selected: ${fileName}`).should('be.visible'); + cy.contains('button', 'Import Students').click(); +}); + +/** + * When: Upload file with blank row + * Handles CSV with empty/blank rows + */ +When('I upload a file {string} where row 1 has a blank registration line and row 2 contains ID {string}', function (fileName, cpf) { + // Reload and navigate + cy.reload(); + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find class and click Enroll + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.contains('button', 'Enroll').click(); + }); + + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Upload file + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + cy.contains(`Selected: ${fileName}`).should('be.visible'); + cy.contains('button', 'Import Students').click(); +}); + +/** + * When: Upload file with multiple columns + * Handles CSV with nome,cpf,login columns + */ +When('I upload a file {string} where row 1 is {string} and row 2 is {string}', function (fileName, header, data) { + // Reload and navigate + cy.reload(); + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find class and click Enroll + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.contains('button', 'Enroll').click(); + }); + + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + + // Upload file + cy.get('input[type="file"]').selectFile(`cypress/fixtures/${fileName}`); + cy.contains(`Selected: ${fileName}`).should('be.visible'); + cy.contains('button', 'Import Students').click(); +}); + +/** + * Then: Verify summary message with specific counts + * Works for various import/reject combinations + * This test is faithful to the scenario requirements and will FAIL until backend is fixed + */ +Then('the screen shows the summary {string}', function (summaryMessage) { + // Navigate to success page + cy.url().should('include', '/import-success', { timeout: 10000 }); + cy.contains('h2', 'Import Successful!').should('be.visible'); + + // Parse the expected counts from the message and verify them strictly + if (summaryMessage.includes('2 students imported successfully and 1 student rejected')) { + // Scenario 4: 2 imported, 1 rejected (unregistered student should be counted as rejected) + cy.get('.stat-item').first().within(() => { + cy.get('.stat-number').should('contain', '2'); + }); + + // IMPORTANT: This assertion REQUIRES the backend to properly count rejected students + // Currently the backend skips non-existent students without counting them as rejected + // This test will FAIL until the backend is fixed to track rejected students + cy.get('.stat-item').last().within(() => { + cy.get('.stat-number').should('contain', '1'); + }); + + } else if (summaryMessage.includes('1 student imported successfully and 0 student rejected')) { + // Scenarios 5 & 6: 1 imported, 0 rejected (blank lines and extra columns are ignored, not rejected) + cy.get('.stat-item').first().within(() => { + cy.get('.stat-number').should('contain', '1'); + }); + cy.get('.stat-item').last().within(() => { + cy.get('.stat-number').should('contain', '0'); + }); + } +}); + +/** + * Then: Verify specific students are enrolled in the class + * Handles multiple students verification + */ +Then('{string} now has students {string} and {string} enrolled', function (className, cpf1, cpf2) { + // Click back + cy.contains('button', 'Voltar').click(); + cy.url().should('eq', CLIENT_BASE_URL + '/'); + + // Navigate to Classes + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find class and verify count + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.get('td').eq(3).should('contain', '2'); + cy.contains('button', 'Enroll').click(); + }); + + // Verify in modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + cy.contains('Currently Enrolled (2)').should('be.visible'); + + // Verify both students in the list + cy.get('.enrolled-students-list').should('be.visible'); + cy.log(`Verified students ${cpf1} and ${cpf2} are enrolled`); +}); + +/** + * Then: Verify single student is enrolled + * Handles single student verification + */ +Then('when I return to the "Class A" student list, student {string} is listed', function (cpf) { + // Click back + cy.contains('button', 'Voltar').click(); + cy.url().should('eq', CLIENT_BASE_URL + '/'); + + // Navigate to Classes + cy.contains('button', 'Classes').click(); + cy.contains('h2', 'Class Management').should('be.visible'); + cy.wait(1000); + + // Find class and verify count + cy.contains('td', testContext.classData.topic, { timeout: 10000 }) + .should('be.visible') + .parent('tr') + .within(() => { + cy.get('td').eq(3).should('contain', '1'); + cy.contains('button', 'Enroll').click(); + }); + + // Verify in modal + cy.contains('h3', `Enroll Students in ${testContext.classData.topic}`).should('be.visible'); + cy.contains('Currently Enrolled (1)').should('be.visible'); + + // Verify student in the list + cy.get('.enrolled-students-list').should('be.visible'); + cy.contains('Test Student').should('be.visible'); + cy.log(`Verified student ${cpf} is enrolled`); +}); + +// ============================================ +// Step Definitions for Service-level API tests +// ============================================ + +// Context for API testing +let apiContext = { + response: null, + createdResources: { + students: [], + classes: [] + } +}; + +/** + * Given: System has a student with specific details + */ +Given('the system has a student with CPF {string}, name {string} and email {string}', function (cpf, name, email) { + const studentPayload = { name, cpf, email }; + + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/students`, + body: studentPayload + }).then((response) => { + expect(response.status).to.eq(201); + apiContext.createdResources.students.push(cpf); + testContext.createdStudentCPFs.push(cpf); + }); + }); +}); + +/** + * Given: System has multiple classes (table data) + */ +Given('the system has the following classes:', function (dataTable) { + const classes = dataTable.hashes(); + + classes.forEach(classData => { + const classPayload = { + topic: classData.topic, + semester: parseInt(classData.semester), + year: parseInt(classData.year) + }; + + const classId = `${classData.topic}-${classData.year}-${classData.semester}`; + + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${classId}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classPayload, + failOnStatusCode: false + }).then((response) => { + if (response.status === 201) { + apiContext.createdResources.classes.push(response.body.id); + testContext.createdClassId = response.body.id; + } + }); + }); + }); +}); + +/** + * Given: System has a class with specific ID + */ +Given('the system has a class with id {string}', function (classId) { + // Extract topic, year, semester from classId format: "Topic-Year-Semester" + const parts = classId.split('-'); + const semester = parseInt(parts[parts.length - 1]); + const year = parseInt(parts[parts.length - 2]); + const topic = parts.slice(0, parts.length - 2).join('-'); + + const classPayload = { topic, semester, year }; + + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${encodeURIComponent(classId)}`, + failOnStatusCode: false + }).then(() => { + cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classPayload + }).then((response) => { + expect(response.status).to.eq(201); + apiContext.createdResources.classes.push(response.body.id); + testContext.createdClassId = response.body.id; + }); + }); +}); + +/** + * Given: Student is not enrolled in class + */ +Given('the student with CPF {string} is not enrolled in class {string}', function (cpf, classId) { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${encodeURIComponent(classId)}/enroll/${cpf}`, + failOnStatusCode: false + }); +}); + +/** + * When: Send GET request to endpoint + */ +When('a {string} request is sent to {string}', function (method, endpoint) { + cy.request({ + method: method, + url: `${API_BASE_URL}${endpoint}`, + failOnStatusCode: false + }).then((response) => { + apiContext.response = response; + }); +}); + +/** + * When: Send POST request with body + */ +When('a {string} request is sent to {string} with body containing studentCPF {string}', function (method, endpoint, studentCPF) { + cy.request({ + method: method, + url: `${API_BASE_URL}${endpoint}`, + body: { studentCPF }, + failOnStatusCode: false + }).then((response) => { + apiContext.response = response; + }); +}); + +/** + * Then: Verify response status + */ +Then('the response status should be {string}', function (expectedStatus) { + expect(apiContext.response.status).to.eq(parseInt(expectedStatus)); +}); + +/** + * Then: Verify response JSON contains student data + */ +Then('the response JSON should contain CPF {string}, name {string} and email {string}', function (cpf, name, email) { + // The API returns CPF formatted, so we need to check both the formatted and unformatted versions + const formattedCPF = apiContext.response.body.cpf; + const cleanedReturnedCPF = formattedCPF.replace(/[.\-]/g, ''); + + expect(cleanedReturnedCPF).to.eq(cpf); + expect(apiContext.response.body).to.have.property('name', name); + expect(apiContext.response.body).to.have.property('email', email); +}); + +/** + * Then: Verify response is a list of classes + */ +Then('the response JSON should be a list of classes', function () { + expect(apiContext.response.body).to.be.an('array'); + expect(apiContext.response.body.length).to.be.greaterThan(0); +}); + +/** + * Then: Verify specific class is in the list + */ +Then('the class with topic {string}, semester {string} and year {string} is in the list', function (topic, semester, year) { + const foundClass = apiContext.response.body.find(c => + c.topic === topic && + c.semester === parseInt(semester) && + c.year === parseInt(year) + ); + expect(foundClass).to.exist; +}); + +/** + * Then: Verify student is enrolled in class + */ +Then('the student with CPF {string} should be enrolled in class {string}', function (cpf, classId) { + // Since there's no GET /api/classes/:id endpoint, we fetch all classes and filter + cy.request({ + method: 'GET', + url: `${API_BASE_URL}/api/classes` + }).then((response) => { + expect(response.status).to.eq(200); + + const classData = response.body.find(c => c.id === classId); + expect(classData, `Class with ID ${classId} should exist`).to.exist; + + // In the JSON, enrollments contain { student: {...}, evaluations: [...] } + const enrollment = classData.enrollments.find(e => { + const cleanedEnrollmentCPF = e.student.cpf.replace(/[.\-]/g, ''); + return cleanedEnrollmentCPF === cpf; + }); + expect(enrollment, `Student ${cpf} should be enrolled`).to.exist; + }); +}); + +/** + * After hook for API tests - cleanup created resources + */ +After({ tags: '@api' }, function () { + // Clean up API test resources + if (apiContext.createdResources.students.length > 0) { + apiContext.createdResources.students.forEach(cpf => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${cpf}`, + failOnStatusCode: false + }); + }); + } + + if (apiContext.createdResources.classes.length > 0) { + apiContext.createdResources.classes.forEach(classId => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${classId}`, + failOnStatusCode: false + }); + }); + } + + // Reset API context + apiContext = { + response: null, + createdResources: { + students: [], + classes: [] + } + }; +}); diff --git a/cypress/fixtures/alunos-1-Not-2.csv b/cypress/fixtures/alunos-1-Not-2.csv new file mode 100644 index 00000000..27f62ccf --- /dev/null +++ b/cypress/fixtures/alunos-1-Not-2.csv @@ -0,0 +1,4 @@ +cpf +11111122222 +09876543212 +33333444444 diff --git a/cypress/fixtures/alunos-blank-1.csv b/cypress/fixtures/alunos-blank-1.csv new file mode 100644 index 00000000..3a1b9995 --- /dev/null +++ b/cypress/fixtures/alunos-blank-1.csv @@ -0,0 +1,3 @@ +cpf + +11111122222 diff --git a/cypress/fixtures/alunos-col.csv b/cypress/fixtures/alunos-col.csv new file mode 100644 index 00000000..aa68feb9 --- /dev/null +++ b/cypress/fixtures/alunos-col.csv @@ -0,0 +1,2 @@ +nome,cpf,login +anyName,11111122222,anyLogin diff --git a/cypress/fixtures/alunos.csv b/cypress/fixtures/alunos.csv new file mode 100644 index 00000000..19ad09ab --- /dev/null +++ b/cypress/fixtures/alunos.csv @@ -0,0 +1,3 @@ +cpf +11111122222 +33333444444 diff --git a/cypress/fixtures/vazia.csv b/cypress/fixtures/vazia.csv new file mode 100644 index 00000000..4f54b81e --- /dev/null +++ b/cypress/fixtures/vazia.csv @@ -0,0 +1 @@ +cpf diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 00000000..d3c2a3b9 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,53 @@ +// *********************************************** +// This file contains custom commands and overrides +// *********************************************** + +// API Base URL +const API_BASE_URL = 'http://localhost:3005'; + +// Custom command to clean up test data via API +Cypress.Commands.add('cleanupTestData', (classId, studentIds) => { + // Delete students + if (studentIds && studentIds.length > 0) { + studentIds.forEach(studentId => { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/students/${studentId}`, + failOnStatusCode: false + }); + }); + } + + // Delete class + if (classId) { + cy.request({ + method: 'DELETE', + url: `${API_BASE_URL}/api/classes/${classId}`, + failOnStatusCode: false + }); + } +}); + +// Custom command to create a test class via API +Cypress.Commands.add('createTestClass', (classData) => { + return cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/classes`, + body: classData + }).then((response) => { + expect(response.status).to.eq(201); + return response.body; + }); +}); + +// Custom command to create a test student via API +Cypress.Commands.add('createTestStudent', (studentData) => { + return cy.request({ + method: 'POST', + url: `${API_BASE_URL}/api/students`, + body: studentData + }).then((response) => { + expect(response.status).to.eq(201); + return response.body; + }); +}); diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js new file mode 100644 index 00000000..251a2e8f --- /dev/null +++ b/cypress/support/e2e.js @@ -0,0 +1,7 @@ +// Import commands.js using ES2015 syntax: +import './commands'; + +// Alternatively you can use CommonJS syntax: +// require('./commands') + +// This file is processed and loaded automatically before your test files. diff --git a/cypress/support/index.d.ts b/cypress/support/index.d.ts new file mode 100644 index 00000000..8102bd25 --- /dev/null +++ b/cypress/support/index.d.ts @@ -0,0 +1,37 @@ +/// + +declare namespace Cypress { + interface Chainable { + /** + * Custom command to clean up test data via API + * @param classId - The ID of the class to delete + * @param studentIds - Array of student CPFs to delete + * @example cy.cleanupTestData('class-123', ['11111122222', '33333444444']) + */ + cleanupTestData(classId: string | null, studentIds: string[]): Chainable; + + /** + * Custom command to create a test class via API + * @param classData - Object containing topic, semester, and year + * @returns The created class object + * @example cy.createTestClass({ topic: 'Math', semester: 1, year: 2025 }) + */ + createTestClass(classData: { + topic: string; + semester: number; + year: number; + }): Chainable; + + /** + * Custom command to create a test student via API + * @param studentData - Object containing name, cpf, and email + * @returns The created student object + * @example cy.createTestStudent({ name: 'John', cpf: '12345678900', email: 'john@test.com' }) + */ + createTestStudent(studentData: { + name: string; + cpf: string; + email: string; + }): Chainable; + } +} diff --git a/package-lock.json b/package-lock.json index 5f18ab05..c05ae4ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,17 @@ "client", "server" ], + "dependencies": { + "esbuild": "^0.27.1", + "form-data": "^4.0.4", + "node-fetch": "^2.7.0" + }, "devDependencies": { - "concurrently": "^8.2.2" + "@badeball/cypress-cucumber-preprocessor": "^24.0.0", + "@bahmutov/cypress-esbuild-preprocessor": "^2.2.8", + "concurrently": "^8.2.2", + "cross-env": "^10.1.0", + "cypress": "^15.7.1" } }, "client": { @@ -23,7 +32,9 @@ "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.30.2", + "react-scripts": "5.0.1", + "recharts": "^3.5.1" }, "devDependencies": { "@cucumber/cucumber": "^12.2.0", @@ -34,6 +45,7 @@ "@types/puppeteer": "^5.4.7", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "cross-env": "^10.1.0", "expect": "^27.5.1", "jest-cucumber": "^4.5.0", "puppeteer": "^24.30.0", @@ -41,6 +53,11 @@ "typescript": "^4.9.5" } }, + "client/node_modules/@adobe/css-tools": { + "version": "4.4.4", + "dev": true, + "license": "MIT" + }, "client/node_modules/@alloc/quick-lru": { "version": "5.2.0", "license": "MIT", @@ -51,6 +68,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "client/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" + } + }, + "client/node_modules/@babel/compat-data": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "client/node_modules/@babel/core": { + "version": "7.28.5", + "license": "MIT", + "peer": true, + "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" + } + }, + "client/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "client/node_modules/@babel/eslint-parser": { "version": "7.28.5", "license": "MIT", @@ -81,6 +153,20 @@ "semver": "bin/semver.js" } }, + "client/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" + } + }, "client/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", "license": "MIT", @@ -91,6 +177,27 @@ "node": ">=6.9.0" } }, + "client/node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "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" + } + }, + "client/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "client/node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.5", "license": "MIT", @@ -153,6 +260,13 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "client/node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "client/node_modules/@babel/helper-member-expression-to-functions": { "version": "7.28.5", "license": "MIT", @@ -164,6 +278,32 @@ "node": ">=6.9.0" } }, + "client/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" + } + }, + "client/node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "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" + } + }, "client/node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", "license": "MIT", @@ -174,6 +314,13 @@ "node": ">=6.9.0" } }, + "client/node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "client/node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", "license": "MIT", @@ -215,6 +362,27 @@ "node": ">=6.9.0" } }, + "client/node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "client/node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "client/node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "client/node_modules/@babel/helper-wrap-function": { "version": "7.28.3", "license": "MIT", @@ -227,6 +395,30 @@ "node": ">=6.9.0" } }, + "client/node_modules/@babel/helpers": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "client/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" + } + }, "client/node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.28.5", "license": "MIT", @@ -392,61 +584,50 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", + "client/node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", + "client/node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", + "client/node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", + "client/node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-arrow-functions": { + "client/node_modules/@babel/plugin-syntax-decorators": { "version": "7.27.1", "license": "MIT", "dependencies": { @@ -459,13 +640,12 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", + "client/node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -474,13 +654,11 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-async-to-generator": { + "client/node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -489,7 +667,7 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-block-scoped-functions": { + "client/node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "license": "MIT", "dependencies": { @@ -502,67 +680,269 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", + "client/node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", + "client/node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", + "client/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", + "client/node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", + "client/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "client/node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "client/node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1412,40 +1792,99 @@ "@babel/core": "^7.0.0-0" } }, - "client/node_modules/@csstools/normalize.css": { - "version": "12.1.1", - "license": "CC0-1.0" + "client/node_modules/@babel/runtime": { + "version": "7.28.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "client/node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "license": "CC0-1.0", + "client/node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=6.9.0" } }, - "client/node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "license": "CC0-1.0", + "client/node_modules/@babel/traverse": { + "version": "7.28.5", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "@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": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", + "node": ">=6.9.0" + } + }, + "client/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" + } + }, + "client/node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "license": "MIT" + }, + "client/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "client/node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "license": "CC0-1.0" + }, + "client/node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { @@ -1666,4054 +2105,12231 @@ "postcss-selector-parser": "^6.0.10" } }, - "client/node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", + "client/node_modules/@cucumber/ci-environment": { + "version": "10.0.1", + "dev": true, + "license": "MIT" + }, + "client/node_modules/@cucumber/cucumber": { + "version": "12.2.0", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@cucumber/ci-environment": "10.0.1", + "@cucumber/cucumber-expressions": "18.0.1", + "@cucumber/gherkin": "34.0.0", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "9.2.0", + "@cucumber/html-formatter": "21.14.0", + "@cucumber/junit-xml-formatter": "0.8.1", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "28.1.0", + "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/tag-expressions": "6.2.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.5", + "commander": "^14.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^11.0.0", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.7.1", + "mime": "^3.0.0", + "mkdirp": "^3.0.0", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-package-up": "^11.0.0", + "semver": "7.7.2", + "string-argv": "0.3.1", + "supports-color": "^8.1.1", + "type-fest": "^4.41.0", + "util-arity": "^1.1.0", + "yaml": "^2.2.2", + "yup": "1.7.0" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "20 || 22 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "url": "https://opencollective.com/cucumber" } }, - "client/node_modules/@eslint-community/regexpp": { - "version": "4.12.2", + "client/node_modules/@cucumber/cucumber-expressions": { + "version": "18.0.1", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "regexp-match-indices": "1.0.2" } }, - "client/node_modules/@eslint/eslintrc": { - "version": "2.1.4", + "client/node_modules/@cucumber/cucumber/node_modules/commander": { + "version": "14.0.2", + "dev": true, "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "client/node_modules/@cucumber/cucumber/node_modules/glob": { + "version": "11.0.3", + "dev": true, + "license": "ISC", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "client/node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", + "client/node_modules/@cucumber/cucumber/node_modules/jackspeak": { + "version": "4.1.1", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "argparse": "^2.0.1" + "@isaacs/cliui": "^8.0.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/@eslint/js": { - "version": "8.57.1", + "client/node_modules/@cucumber/cucumber/node_modules/lru-cache": { + "version": "11.2.2", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "client/node_modules/@cucumber/cucumber/node_modules/mime": { + "version": "3.0.0", + "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.0.0" } }, - "client/node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "license": "Apache-2.0", + "client/node_modules/@cucumber/cucumber/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10.10.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", + "client/node_modules/@cucumber/cucumber/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=12.22" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "license": "BSD-3-Clause" - }, - "client/node_modules/@jest/console": { - "version": "27.5.1", - "license": "MIT", + "client/node_modules/@cucumber/cucumber/node_modules/path-scurry": { + "version": "2.0.1", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/@jest/core": { - "version": "27.5.1", - "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "client/node_modules/@cucumber/cucumber/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=10" } }, - "client/node_modules/@jest/environment": { - "version": "27.5.1", + "client/node_modules/@cucumber/cucumber/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "client/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "client/node_modules/@cucumber/cucumber/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/@cucumber/cucumber/node_modules/yaml": { + "version": "2.8.1", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 14.6" } }, - "client/node_modules/@jest/globals": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin": { + "version": "34.0.0", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@cucumber/messages": ">=19.1.4 <29" } }, - "client/node_modules/@jest/reporters": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin-streams": { + "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "commander": "9.1.0", + "source-map-support": "0.5.21" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "gherkin-javascript": "bin/gherkin" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" } }, - "client/node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "client/node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "9.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || >=14" } }, - "client/node_modules/@jest/schemas": { - "version": "28.1.3", + "client/node_modules/@cucumber/gherkin-utils": { + "version": "9.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@cucumber/gherkin": "^31.0.0", + "@cucumber/messages": "^27.0.0", + "@teppeis/multimaps": "3.0.0", + "commander": "13.1.0", + "source-map-support": "^0.5.21" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "bin": { + "gherkin-utils": "bin/gherkin-utils" } }, - "client/node_modules/@jest/source-map": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { + "version": "31.0.0", + "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@cucumber/messages": ">=19.1.4 <=26" } }, - "client/node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "client/node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { + "version": "26.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" } }, - "client/node_modules/@jest/test-result": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/uuid": { + "version": "10.0.0", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "client/node_modules/@jest/test-sequencer": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "27.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "11.0.5" } }, - "client/node_modules/@jest/transform": { - "version": "27.5.1", + "client/node_modules/@cucumber/gherkin-utils/node_modules/commander": { + "version": "13.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=18" } }, - "client/node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" + "client/node_modules/@cucumber/gherkin-utils/node_modules/uuid": { + "version": "11.0.5", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } }, - "client/node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "client/node_modules/@cucumber/html-formatter": { + "version": "21.14.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cucumber/messages": ">=18" } }, - "client/node_modules/@jest/types": { - "version": "27.5.1", + "client/node_modules/@cucumber/junit-xml-formatter": { + "version": "0.8.1", + "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@cucumber/query": "^13.0.2", + "@teppeis/multimaps": "^3.0.0", + "luxon": "^3.5.0", + "xmlbuilder": "^15.1.1" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "peerDependencies": { + "@cucumber/messages": "*" } }, - "client/node_modules/@jridgewell/source-map": { - "version": "0.3.11", + "client/node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "peer": true, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" } }, - "client/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", + "client/node_modules/@cucumber/messages": { + "version": "28.1.0", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "11.1.0" } }, - "client/node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "license": "MIT" - }, - "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", + "client/node_modules/@cucumber/messages/node_modules/uuid": { + "version": "11.1.0", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "client/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "client/node_modules/@cucumber/pretty-formatter": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" } }, - "client/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "client/node_modules/@cucumber/pretty-formatter/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "client/node_modules/@cucumber/query": { + "version": "13.6.0", + "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@teppeis/multimaps": "3.0.0", + "lodash.sortby": "^4.7.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@cucumber/messages": "*" } }, - "client/node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.17", + "client/node_modules/@cucumber/tag-expressions": { + "version": "6.2.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/@epic-web/invariant": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", "license": "MIT", "dependencies": { - "ansi-html": "^0.0.9", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^4.2.0", - "source-map": "^0.7.3" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">= 10.13" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x || 5.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" + "funding": { + "url": "https://opencollective.com/eslint" }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "client/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", + "client/node_modules/@eslint-community/regexpp": { + "version": "4.12.2", "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "client/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", + "client/node_modules/@eslint/eslintrc": { + "version": "2.1.4", "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 10.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "client/node_modules/@rollup/plugin-replace": { - "version": "2.4.2", + "client/node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "client/node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" + "argparse": "^2.0.1" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "client/node_modules/@rollup/pluginutils": { - "version": "3.1.0", + "client/node_modules/@eslint/js": { + "version": "8.57.1", "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "client/node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "license": "Apache-2.0", "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">=10.10.0" } }, - "client/node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "license": "MIT" + "client/node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "client/node_modules/@rtsao/scc": { - "version": "1.1.0", - "license": "MIT" + "client/node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "license": "BSD-3-Clause" }, - "client/node_modules/@rushstack/eslint-patch": { - "version": "1.14.1", - "license": "MIT" - }, - "client/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "license": "MIT" - }, - "client/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" + "client/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" } }, - "client/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "license": "BSD-3-Clause", + "client/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, - "client/node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "license": "Apache-2.0", + "client/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "client/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", + "client/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "client/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", + "client/node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", + "client/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", + "client/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "client/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", + "client/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "client/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "license": "MIT", - "engines": { - "node": ">=10" + "client/node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "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" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=8" } }, - "client/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", + "client/node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=6" } }, - "client/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", + "client/node_modules/@istanbuljs/schema": { + "version": "0.1.3", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "client/node_modules/@svgr/babel-preset": { - "version": "5.5.0", + "client/node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@svgr/core": { - "version": "5.5.0", + "client/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", + "client/node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.12.6" - }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", + "client/node_modules/@jest/pattern": { + "version": "30.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" + "@types/node": "*", + "jest-regex-util": "30.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", + "client/node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@svgr/webpack": { - "version": "5.5.0", + "client/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/@tootallnate/once": { - "version": "1.1.2", + "client/node_modules/@jest/transform": { + "version": "27.5.1", "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, "engines": { - "node": ">= 6" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/@trysound/sax": { - "version": "0.2.0", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "client/node_modules/@types/bonjour": { - "version": "3.5.13", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "client/node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" }, - "client/node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "client/node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "client/node_modules/@types/eslint": { - "version": "8.56.12", + "client/node_modules/@jest/types": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/@types/eslint-scope": { - "version": "3.7.7", + "client/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "client/node_modules/@types/estree": { - "version": "1.0.8", - "license": "MIT" - }, - "client/node_modules/@types/express": { - "version": "4.17.25", + "client/node_modules/@jridgewell/remapping": { + "version": "2.3.5", "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "client/node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.7", + "client/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "engines": { + "node": ">=6.0.0" } }, - "client/node_modules/@types/graceful-fs": { - "version": "4.1.9", + "client/node_modules/@jridgewell/source-map": { + "version": "0.3.11", "license": "MIT", "dependencies": { - "@types/node": "*" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "client/node_modules/@types/html-minifier-terser": { - "version": "6.1.0", + "client/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", "license": "MIT" }, - "client/node_modules/@types/http-proxy": { - "version": "1.17.17", + "client/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", "license": "MIT", "dependencies": { - "@types/node": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "client/node_modules/@types/json-schema": { - "version": "7.0.15", - "license": "MIT" - }, - "client/node_modules/@types/json5": { - "version": "0.0.29", + "client/node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", "license": "MIT" }, - "client/node_modules/@types/node-forge": { - "version": "1.3.14", + "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", "license": "MIT", "dependencies": { - "@types/node": "*" + "eslint-scope": "5.1.1" } }, - "client/node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" - }, - "client/node_modules/@types/prettier": { - "version": "2.7.3", - "license": "MIT" - }, - "client/node_modules/@types/prop-types": { - "version": "15.7.15", - "dev": true, - "license": "MIT" - }, - "client/node_modules/@types/q": { - "version": "1.5.8", - "license": "MIT" - }, - "client/node_modules/@types/react": { - "version": "18.3.26", - "dev": true, - "license": "MIT", - "peer": true, + "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "client/node_modules/@types/react-dom": { - "version": "18.3.7", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "client/node_modules/@types/resolve": { - "version": "1.17.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" + "client/node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "client/node_modules/@types/retry": { - "version": "0.12.0", - "license": "MIT" - }, - "client/node_modules/@types/semver": { - "version": "7.7.1", - "license": "MIT" - }, - "client/node_modules/@types/serve-index": { - "version": "1.9.4", + "client/node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "license": "MIT", "dependencies": { - "@types/express": "*" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "client/node_modules/@types/sockjs": { - "version": "0.3.36", + "client/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">= 8" } }, - "client/node_modules/@types/trusted-types": { - "version": "2.0.7", - "license": "MIT" - }, - "client/node_modules/@types/ws": { - "version": "8.18.1", + "client/node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "license": "MIT", "dependencies": { - "@types/node": "*" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "client/node_modules/@types/yargs": { - "version": "16.0.10", + "client/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "optional": true, + "engines": { + "node": ">=14" } }, - "client/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", + "client/node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 10.13" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" }, "peerDependenciesMeta": { - "typescript": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { "optional": true } } }, - "client/node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "license": "MIT", + "client/node_modules/@puppeteer/browsers": { + "version": "2.10.13", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "browsers": "lib/cjs/main-cli.js" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=18" } }, - "client/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "peer": true, + "client/node_modules/@reduxjs/toolkit": { + "version": "2.11.1", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "peerDependenciesMeta": { - "typescript": { + "react": { + "optional": true + }, + "react-redux": { "optional": true } } }, - "client/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", + "client/node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.0.1", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/immer" } }, - "client/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", + "client/node_modules/@remix-run/router": { + "version": "1.23.1", "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14.0.0" } }, - "client/node_modules/@typescript-eslint/types": { - "version": "5.62.0", + "client/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "client/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 10.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" }, "peerDependenciesMeta": { - "typescript": { + "@types/babel__core": { "optional": true } } }, - "client/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", + "client/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 10.0.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "rollup": "^1.20.0||^2.0.0" } }, - "client/node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", + "client/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" }, - "engines": { - "node": ">=8.0.0" - } - }, - "client/node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "client/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", + "client/node_modules/@rollup/pluginutils": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "client/node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "client/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", + "client/node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", "license": "MIT" }, - "client/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", + "client/node_modules/@rtsao/scc": { + "version": "1.1.0", "license": "MIT" }, - "client/node_modules/@webassemblyjs/helper-buffer": { + "client/node_modules/@rushstack/eslint-patch": { "version": "1.14.1", "license": "MIT" }, - "client/node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } + "client/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" }, - "client/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", + "client/node_modules/@standard-schema/spec": { + "version": "1.0.0", "license": "MIT" }, - "client/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "license": "MIT", + "client/node_modules/@standard-schema/utils": { + "version": "0.3.0", + "license": "MIT" + }, + "client/node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "license": "Apache-2.0", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, - "client/node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", + "client/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" + "client/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "license": "MIT" - }, - "client/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "client/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "client/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "client/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "client/node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "client/node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "license": "BSD-3-Clause" - }, - "client/node_modules/@xtuc/long": { - "version": "4.2.2", - "license": "Apache-2.0" - }, - "client/node_modules/abab": { - "version": "2.0.6", - "license": "BSD-3-Clause" - }, - "client/node_modules/accepts": { - "version": "1.3.8", + "client/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", + "client/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "client/node_modules/acorn-globals": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", + "client/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/acorn-import-phases": { - "version": "1.0.4", + "client/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=10" }, - "peerDependencies": { - "acorn": "^8.14.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/acorn-jsx": { - "version": "5.3.2", + "client/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/acorn-walk": { - "version": "7.2.0", + "client/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/address": { - "version": "1.2.2", + "client/node_modules/@svgr/babel-preset": { + "version": "5.5.0", "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", + "client/node_modules/@svgr/core": { + "version": "5.5.0", "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" }, "engines": { - "node": ">=8.9" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/agent-base": { - "version": "6.0.2", + "client/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", "license": "MIT", "dependencies": { - "debug": "4" + "@babel/types": "^7.12.6" }, "engines": { - "node": ">= 6.0.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/ajv": { - "version": "6.12.6", + "client/node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", "license": "MIT", - "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/ajv-formats": { - "version": "2.1.1", + "client/node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", + "client/node_modules/@svgr/webpack": { + "version": "5.5.0", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/gregberge" } }, - "client/node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "client/node_modules/ajv-keywords": { - "version": "3.5.2", + "client/node_modules/@teppeis/multimaps": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "client/node_modules/ansi-html": { - "version": "0.0.9", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "client/node_modules/ansi-html-community": { - "version": "0.0.8", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" + "engines": { + "node": ">=14" } }, - "client/node_modules/arg": { - "version": "5.0.2", - "license": "MIT" - }, - "client/node_modules/argparse": { - "version": "1.0.10", + "client/node_modules/@testing-library/dom": { + "version": "10.4.1", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" } }, - "client/node_modules/aria-query": { - "version": "5.3.2", + "client/node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "dependencies": { + "dequal": "^2.0.3" } }, - "client/node_modules/array-buffer-byte-length": { - "version": "1.0.2", + "client/node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "client/node_modules/array-flatten": { - "version": "1.1.1", + "client/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, "license": "MIT" }, - "client/node_modules/array-includes": { - "version": "3.1.9", + "client/node_modules/@testing-library/react": { + "version": "16.3.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "client/node_modules/array-union": { - "version": "2.1.0", + "client/node_modules/@testing-library/user-event": { + "version": "14.6.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "client/node_modules/array.prototype.findlast": { - "version": "1.2.5", + "client/node_modules/@tootallnate/once": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "client/node_modules/array.prototype.findlastindex": { - "version": "1.2.6", + "client/node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "client/node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "client/node_modules/@types/babel__core": { + "version": "7.20.5", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "client/node_modules/array.prototype.flat": { - "version": "1.3.3", + "client/node_modules/@types/babel__generator": { + "version": "7.27.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/types": "^7.0.0" } }, - "client/node_modules/array.prototype.flatmap": { - "version": "1.3.3", + "client/node_modules/@types/babel__template": { + "version": "7.4.4", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "client/node_modules/array.prototype.reduce": { - "version": "1.0.8", + "client/node_modules/@types/babel__traverse": { + "version": "7.28.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "is-string": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/types": "^7.28.2" } }, - "client/node_modules/array.prototype.tosorted": { - "version": "1.1.4", + "client/node_modules/@types/body-parser": { + "version": "1.19.6", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@types/connect": "*", + "@types/node": "*" } }, - "client/node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", + "client/node_modules/@types/bonjour": { + "version": "3.5.13", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/node": "*" } }, - "client/node_modules/ast-types-flow": { - "version": "0.0.8", - "license": "MIT" + "client/node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "client/node_modules/async": { - "version": "3.2.6", + "client/node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "client/node_modules/@types/d3-array": { + "version": "3.2.2", "license": "MIT" }, - "client/node_modules/async-function": { - "version": "1.0.0", + "client/node_modules/@types/d3-color": { + "version": "3.1.3", + "license": "MIT" + }, + "client/node_modules/@types/d3-ease": { + "version": "3.0.2", + "license": "MIT" + }, + "client/node_modules/@types/d3-interpolate": { + "version": "3.0.4", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@types/d3-color": "*" } }, - "client/node_modules/at-least-node": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } + "client/node_modules/@types/d3-path": { + "version": "3.1.1", + "license": "MIT" }, - "client/node_modules/autoprefixer": { - "version": "10.4.21", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "client/node_modules/@types/d3-scale": { + "version": "4.0.9", "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "@types/d3-time": "*" } }, - "client/node_modules/available-typed-arrays": { - "version": "1.0.7", + "client/node_modules/@types/d3-shape": { + "version": "3.1.7", "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/d3-path": "*" } }, - "client/node_modules/axe-core": { - "version": "4.11.0", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } + "client/node_modules/@types/d3-time": { + "version": "3.0.4", + "license": "MIT" }, - "client/node_modules/axobject-query": { - "version": "4.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } + "client/node_modules/@types/d3-timer": { + "version": "3.0.2", + "license": "MIT" }, - "client/node_modules/babel-jest": { - "version": "27.5.1", + "client/node_modules/@types/eslint": { + "version": "8.56.12", "license": "MIT", "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "client/node_modules/babel-loader": { - "version": "8.4.1", + "client/node_modules/@types/eslint-scope": { + "version": "3.7.7", "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.4", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "@types/eslint": "*", + "@types/estree": "*" } }, - "client/node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", + "client/node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" + }, + "client/node_modules/@types/express": { + "version": "4.17.25", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" } }, - "client/node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "license": "BSD-3-Clause", + "client/node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "license": "MIT", "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" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "client/node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", + "client/node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.7", "license": "MIT", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "client/node_modules/babel-plugin-macros": { - "version": "3.1.0", + "client/node_modules/@types/graceful-fs": { + "version": "4.1.9", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" + "@types/node": "*" } }, - "client/node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "license": "MIT", - "peerDependencies": { - "@babel/core": "^7.1.0" - } + "client/node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" }, - "client/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", + "client/node_modules/@types/http-errors": { + "version": "2.0.5", + "license": "MIT" + }, + "client/node_modules/@types/http-proxy": { + "version": "1.17.17", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/node": "*" } }, - "client/node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "client/node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" }, - "client/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", + "client/node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/istanbul-lib-coverage": "*" } }, - "client/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", + "client/node_modules/@types/istanbul-reports": { + "version": "3.0.4", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/istanbul-lib-report": "*" } }, - "client/node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "license": "MIT" - }, - "client/node_modules/babel-preset-jest": { - "version": "27.5.1", + "client/node_modules/@types/jest": { + "version": "30.0.0", + "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, - "client/node_modules/babel-preset-react-app": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "client/node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", + "client/node_modules/@types/jest/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/batch": { - "version": "0.6.1", - "license": "MIT" - }, - "client/node_modules/bfj": { - "version": "7.1.0", + "client/node_modules/@types/jest/node_modules/@types/yargs": { + "version": "17.0.35", + "dev": true, "license": "MIT", "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" + "@types/yargs-parser": "*" } }, - "client/node_modules/big.js": { - "version": "5.2.2", + "client/node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/binary-extensions": { - "version": "2.3.0", + "client/node_modules/@types/jest/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/bluebird": { - "version": "3.7.2", - "license": "MIT" - }, - "client/node_modules/body-parser": { - "version": "1.20.3", + "client/node_modules/@types/jest/node_modules/expect": { + "version": "30.2.0", + "dev": true, "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" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "client/node_modules/@types/jest/node_modules/jest-diff": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", + "client/node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "client/node_modules/bonjour-service": { - "version": "1.3.0", + "client/node_modules/@types/jest/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" - }, - "client/node_modules/brace-expansion": { - "version": "1.1.12", + "client/node_modules/@types/jest/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/browser-process-hrtime": { - "version": "1.0.0", - "license": "BSD-2-Clause" - }, - "client/node_modules/builtin-modules": { - "version": "3.3.0", + "client/node_modules/@types/jest/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "client/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "client/node_modules/call-bind": { - "version": "1.0.8", + "client/node_modules/@types/jest/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/camel-case": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } + "client/node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" }, - "client/node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "client/node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" }, - "client/node_modules/camelcase-css": { - "version": "2.0.1", + "client/node_modules/@types/json5": { + "version": "0.0.29", + "license": "MIT" + }, + "client/node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "client/node_modules/@types/node": { + "version": "24.10.0", "license": "MIT", - "engines": { - "node": ">= 6" + "dependencies": { + "undici-types": "~7.16.0" } }, - "client/node_modules/caniuse-api": { - "version": "3.0.0", + "client/node_modules/@types/node-forge": { + "version": "1.3.14", "license": "MIT", "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "@types/node": "*" } }, - "client/node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "license": "MIT", - "engines": { - "node": ">=4" - } + "client/node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" }, - "client/node_modules/check-types": { - "version": "11.2.3", + "client/node_modules/@types/parse-json": { + "version": "4.0.2", "license": "MIT" }, - "client/node_modules/chokidar": { - "version": "3.6.0", - "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" - } + "client/node_modules/@types/prettier": { + "version": "2.7.3", + "license": "MIT" }, - "client/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "client/node_modules/@types/prop-types": { + "version": "15.7.15", + "devOptional": true, + "license": "MIT" }, - "client/node_modules/chrome-trace-event": { - "version": "1.0.4", + "client/node_modules/@types/puppeteer": { + "version": "5.4.7", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" + "dependencies": { + "@types/node": "*" } }, - "client/node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } + "client/node_modules/@types/q": { + "version": "1.5.8", + "license": "MIT" }, - "client/node_modules/cjs-module-lexer": { - "version": "1.4.3", + "client/node_modules/@types/qs": { + "version": "6.14.0", "license": "MIT" }, - "client/node_modules/clean-css": { - "version": "5.3.3", + "client/node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "client/node_modules/@types/react": { + "version": "18.3.26", + "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "client/node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "client/node_modules/@types/react-dom": { + "version": "18.3.7", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^18.0.0" } }, - "client/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", + "client/node_modules/@types/resolve": { + "version": "1.17.1", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@types/node": "*" } }, - "client/node_modules/coa": { - "version": "2.0.2", + "client/node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "client/node_modules/@types/semver": { + "version": "7.7.1", + "license": "MIT" + }, + "client/node_modules/@types/send": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" + "@types/node": "*" } }, - "client/node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", + "client/node_modules/@types/serve-index": { + "version": "1.9.4", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@types/express": "*" } }, - "client/node_modules/coa/node_modules/chalk": { - "version": "2.4.2", + "client/node_modules/@types/serve-static": { + "version": "1.15.10", "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" } }, - "client/node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", + "client/node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@types/mime": "^1", + "@types/node": "*" } }, - "client/node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "client/node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", + "client/node_modules/@types/sockjs": { + "version": "0.3.36", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@types/node": "*" } }, - "client/node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } + "client/node_modules/@types/stack-utils": { + "version": "2.0.3", + "license": "MIT" }, - "client/node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "client/node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT" }, - "client/node_modules/colord": { - "version": "2.9.3", + "client/node_modules/@types/use-sync-external-store": { + "version": "0.0.6", "license": "MIT" }, - "client/node_modules/colorette": { - "version": "2.0.20", + "client/node_modules/@types/uuid": { + "version": "10.0.0", + "dev": true, "license": "MIT" }, - "client/node_modules/commander": { - "version": "8.3.0", + "client/node_modules/@types/ws": { + "version": "8.18.1", "license": "MIT", - "engines": { - "node": ">= 12" + "dependencies": { + "@types/node": "*" } }, - "client/node_modules/common-tags": { - "version": "1.8.2", + "client/node_modules/@types/yargs": { + "version": "16.0.10", "license": "MIT", - "engines": { - "node": ">=4.0.0" + "dependencies": { + "@types/yargs-parser": "*" } }, - "client/node_modules/commondir": { - "version": "1.0.1", + "client/node_modules/@types/yargs-parser": { + "version": "21.0.3", "license": "MIT" }, - "client/node_modules/compressible": { - "version": "2.0.18", + "client/node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "@types/node": "*" } }, - "client/node_modules/compression": { - "version": "1.8.1", + "client/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", "license": "MIT", + "peer": true, "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "client/node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "client/node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "client/node_modules/confusing-browser-globals": { - "version": "1.0.11", - "license": "MIT" - }, - "client/node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/content-disposition": { - "version": "0.5.4", + "client/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "@typescript-eslint/utils": "5.62.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "client/node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", + "client/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/cookie": { - "version": "0.7.1", + "client/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, "engines": { - "node": ">= 0.6" - } - }, - "client/node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "client/node_modules/core-js": { - "version": "3.46.0", - "hasInstallScript": true, - "license": "MIT", + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/typescript-eslint" } }, - "client/node_modules/core-js-compat": { - "version": "3.46.0", + "client/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/core-js-pure": { - "version": "3.46.0", - "hasInstallScript": true, + "client/node_modules/@typescript-eslint/types": { + "version": "5.62.0", "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/typescript-eslint" } }, - "client/node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "client/node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", + "client/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "license": "BSD-2-Clause", "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" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/crypto-random-string": { - "version": "2.0.0", + "client/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "client/node_modules/css-blank-pseudo": { - "version": "3.0.3", - "license": "CC0-1.0", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "client/node_modules/css-declaration-sorter": { - "version": "6.4.1", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >=14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.0.9" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "client/node_modules/css-has-pseudo": { - "version": "3.0.4", - "license": "CC0-1.0", + "client/node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=8.0.0" } }, - "client/node_modules/css-loader": { - "version": "6.11.0", + "client/node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "client/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 12.13.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://opencollective.com/typescript-eslint" } }, - "client/node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", + "client/node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "license": "ISC" + }, + "client/node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "client/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "license": "MIT" + }, + "client/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "license": "MIT" + }, + "client/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "license": "MIT" + }, + "client/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "client/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "license": "MIT" + }, + "client/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "client/node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "client/node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "client/node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "license": "MIT" + }, + "client/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "client/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "client/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "client/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "client/node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "client/node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "client/node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "client/node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "client/node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/acorn": { + "version": "8.15.0", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "client/node_modules/acorn-globals": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "client/node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "client/node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "client/node_modules/acorn-import-phases": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "client/node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "client/node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "client/node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "client/node_modules/agent-base": { + "version": "7.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "client/node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "client/node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "client/node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "client/node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/ansi-html": { + "version": "0.0.9", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "client/node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "client/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "client/node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" + }, + "client/node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "client/node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "client/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "client/node_modules/aria-query": { + "version": "5.3.2", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "client/node_modules/array-includes": { + "version": "3.1.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/array.prototype.findlast": { + "version": "1.2.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array.prototype.flat": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array.prototype.reduce": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/asap": { + "version": "2.0.6", + "license": "MIT" + }, + "client/node_modules/assertion-error-formatter": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "client/node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/ast-types-flow": { + "version": "0.0.8", + "license": "MIT" + }, + "client/node_modules/async": { + "version": "3.2.6", + "license": "MIT" + }, + "client/node_modules/async-function": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "client/node_modules/at-least-node": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "client/node_modules/autoprefixer": { + "version": "10.4.21", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/axe-core": { + "version": "4.11.0", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/axobject-query": { + "version": "4.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/babel-jest": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "client/node_modules/babel-loader": { + "version": "8.4.1", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "client/node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "client/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "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" + } + }, + "client/node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/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" + } + }, + "client/node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "client/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "client/node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "client/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "client/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "client/node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "license": "MIT" + }, + "client/node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "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" + } + }, + "client/node_modules/babel-preset-jest": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "client/node_modules/babel-preset-react-app": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "client/node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "client/node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "client/node_modules/bare-events": { + "version": "2.8.2", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "client/node_modules/bare-fs": { + "version": "4.5.1", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "client/node_modules/bare-os": { + "version": "3.6.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "client/node_modules/bare-path": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "client/node_modules/bare-stream": { + "version": "2.7.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "client/node_modules/bare-url": { + "version": "2.3.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "client/node_modules/baseline-browser-mapping": { + "version": "2.8.25", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "client/node_modules/basic-ftp": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "client/node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "client/node_modules/bfj": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "client/node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "client/node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "client/node_modules/body-parser": { + "version": "1.20.3", + "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" + } + }, + "client/node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/bonjour-service": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "client/node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "client/node_modules/brace-expansion": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "client/node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "client/node_modules/browserslist": { + "version": "4.27.0", + "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", + "peer": true, + "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" + } + }, + "client/node_modules/bser": { + "version": "2.1.1", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "client/node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "client/node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "client/node_modules/builtin-modules": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/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" + } + }, + "client/node_modules/call-bound": { + "version": "1.0.4", + "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" + } + }, + "client/node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "client/node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/camelcase-css": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "client/node_modules/caniuse-lite": { + "version": "1.0.30001753", + "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" + }, + "client/node_modules/capital-case": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "client/node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/chalk": { + "version": "4.1.2", + "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" + } + }, + "client/node_modules/char-regex": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "client/node_modules/check-types": { + "version": "11.2.3", + "license": "MIT" + }, + "client/node_modules/chokidar": { + "version": "3.6.0", + "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" + } + }, + "client/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "client/node_modules/chromium-bidi": { + "version": "11.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "client/node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/class-transformer": { + "version": "0.5.1", + "dev": true, + "license": "MIT" + }, + "client/node_modules/clean-css": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "client/node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/cli-table3": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "client/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/co": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "client/node_modules/coa": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "client/node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "client/node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "client/node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "client/node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/collect-v8-coverage": { + "version": "1.0.3", + "license": "MIT" + }, + "client/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "client/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "client/node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "client/node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "client/node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "client/node_modules/common-tags": { + "version": "1.8.2", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "client/node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "client/node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/compression": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "client/node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "client/node_modules/confusing-browser-globals": { + "version": "1.0.11", + "license": "MIT" + }, + "client/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "client/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/cookie": { + "version": "0.7.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "client/node_modules/core-js": { + "version": "3.46.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "client/node_modules/core-js-compat": { + "version": "3.46.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "client/node_modules/core-js-pure": { + "version": "3.46.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "client/node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "client/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" + } + }, + "client/node_modules/cross-env": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "client/node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "client/node_modules/crypto-random-string": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/css-blank-pseudo": { + "version": "3.0.3", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/css-declaration-sorter": { + "version": "6.4.1", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "client/node_modules/css-has-pseudo": { + "version": "3.0.4", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/css-loader": { + "version": "6.11.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "client/node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", "postcss": "^8.3.5", "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "client/node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "client/node_modules/css-select-base-adapter": { + "version": "0.1.1", + "license": "MIT" + }, + "client/node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "client/node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/css-what": { + "version": "6.2.2", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "client/node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "client/node_modules/cssdb": { + "version": "7.11.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "client/node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/cssnano": { + "version": "5.1.15", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/cssnano-preset-default": { + "version": "5.2.14", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/cssnano-utils": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/csso": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "client/node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "client/node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "client/node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/cssom": { + "version": "0.4.4", + "license": "MIT" + }, + "client/node_modules/cssstyle": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "client/node_modules/csstype": { + "version": "3.1.3", + "devOptional": true, + "license": "MIT" + }, + "client/node_modules/d3-array": { + "version": "3.2.4", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-ease": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-format": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-path": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-scale": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-shape": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-time": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-time-format": { + "version": "4.1.0", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/d3-timer": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/damerau-levenshtein": { + "version": "1.0.8", + "license": "BSD-2-Clause" + }, + "client/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/data-urls": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/data-view-buffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/data-view-byte-length": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "client/node_modules/data-view-byte-offset": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "client/node_modules/decimal.js": { + "version": "10.6.0", + "license": "MIT" + }, + "client/node_modules/decimal.js-light": { + "version": "2.5.1", + "license": "MIT" + }, + "client/node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "client/node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/default-gateway": { + "version": "6.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "client/node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "client/node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "client/node_modules/detect-newline": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "client/node_modules/detect-port-alt": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "client/node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/devtools-protocol": { + "version": "0.0.1521046", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "client/node_modules/didyoumean": { + "version": "1.2.2", + "license": "Apache-2.0" + }, + "client/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "client/node_modules/diff-sequences": { + "version": "27.5.1", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/dlv": { + "version": "1.1.3", + "license": "MIT" + }, + "client/node_modules/dns-packet": { + "version": "5.6.1", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/doctrine": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "client/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "client/node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "client/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "client/node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "client/node_modules/domexception": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "client/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "client/node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "client/node_modules/dotenv": { + "version": "10.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "client/node_modules/dotenv-expand": { + "version": "5.1.0", + "license": "BSD-2-Clause" + }, + "client/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" + } + }, + "client/node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "client/node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "client/node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "client/node_modules/ejs": { + "version": "3.1.10", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/electron-to-chromium": { + "version": "1.5.245", + "license": "ISC" + }, + "client/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "client/node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "client/node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/end-of-stream": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "client/node_modules/enhanced-resolve": { + "version": "5.18.3", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "client/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "client/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "client/node_modules/error-stack-parser": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "client/node_modules/es-abstract": { + "version": "1.24.0", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/es-iterator-helpers": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/es-module-lexer": { + "version": "1.7.0", + "license": "MIT" + }, + "client/node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/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" + } + }, + "client/node_modules/es-shim-unscopables": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/es-to-primitive": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/es-toolkit": { + "version": "1.42.0", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "client/node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "client/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "client/node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/eslint": { + "version": "8.57.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "client/node_modules/eslint-config-react-app": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "client/node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "client/node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "client/node_modules/eslint-module-utils": { + "version": "2.12.1", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "client/node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "client/node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "client/node_modules/eslint-plugin-import": { + "version": "2.32.0", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "client/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "client/node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "client/node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "client/node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "client/node_modules/eslint-plugin-react": { + "version": "7.37.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "client/node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "client/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "client/node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "client/node_modules/eslint-scope": { + "version": "7.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "client/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "client/node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "client/node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "client/node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "client/node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "client/node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "client/node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/espree": { + "version": "9.6.1", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "client/node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/esquery": { + "version": "1.6.0", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "client/node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "client/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "client/node_modules/estree-walker": { + "version": "1.0.1", + "license": "MIT" + }, + "client/node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "client/node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "client/node_modules/events-universal": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "client/node_modules/execa": { + "version": "5.1.1", + "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" + } + }, + "client/node_modules/exit": { + "version": "0.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "client/node_modules/expect": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/express": { + "version": "4.21.2", + "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" + } + }, + "client/node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "client/node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "client/node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "client/node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "client/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "client/node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "client/node_modules/fast-uri": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "client/node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "client/node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "client/node_modules/fb-watchman": { + "version": "2.0.2", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "client/node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "client/node_modules/figures": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "client/node_modules/file-entry-cache": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "client/node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "client/node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "client/node_modules/filelist": { + "version": "1.0.4", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "client/node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "client/node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/filesize": { + "version": "8.0.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "client/node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/finalhandler": { + "version": "1.3.1", + "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" + } + }, + "client/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/find-cache-dir": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "client/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/find-up-simple": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/flat-cache": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "client/node_modules/flatted": { + "version": "3.3.3", + "license": "ISC" + }, + "client/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 + } + } + }, + "client/node_modules/for-each": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/foreground-child": { + "version": "3.3.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/form-data": { + "version": "3.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.35" + }, + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/fraction.js": { + "version": "4.3.7", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "client/node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/fs-extra": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/fs-monkey": { + "version": "1.1.0", + "license": "Unlicense" + }, + "client/node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "client/node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/function.prototype.name": { + "version": "1.1.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/functions-have-names": { + "version": "1.2.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/generator-function": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "client/node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "client/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" + } + }, + "client/node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "license": "ISC" + }, + "client/node_modules/get-package-type": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "client/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" + } + }, + "client/node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/get-symbol-description": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/get-uri": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/glob": { + "version": "7.2.3", + "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" + } + }, + "client/node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "client/node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "client/node_modules/global-dirs": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "client/node_modules/global-modules": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "client/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/globalthis": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "client/node_modules/graphemer": { + "version": "1.4.0", + "license": "MIT" + }, + "client/node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "client/node_modules/harmony-reflect": { + "version": "1.6.2", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "client/node_modules/has-ansi": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/has-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/has-bigints": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/has-proto": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/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" + } + }, + "client/node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "client/node_modules/hoopy": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "client/node_modules/hosted-git-info": { + "version": "7.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "client/node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "client/node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "client/node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "client/node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "client/node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "client/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/html-entities": { + "version": "2.6.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "client/node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "client/node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "client/node_modules/html-webpack-plugin": { + "version": "5.6.4", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "client/node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "client/node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "client/node_modules/http-errors": { + "version": "2.0.0", + "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" + } + }, + "client/node_modules/http-parser-js": { + "version": "0.5.10", + "license": "MIT" + }, + "client/node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "client/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "client/node_modules/https-proxy-agent": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "client/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/idb": { + "version": "7.1.1", + "license": "ISC" + }, + "client/node_modules/identity-obj-proxy": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "client/node_modules/immer": { + "version": "9.0.21", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "client/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" + } + }, + "client/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/import-local": { + "version": "3.2.0", + "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" + } + }, + "client/node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "client/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/index-to-position": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "client/node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "client/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "client/node_modules/internal-slot": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/internmap": { + "version": "2.0.3", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/ip-address": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "client/node_modules/ipaddr.js": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "client/node_modules/is-array-buffer": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "client/node_modules/is-async-function": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-bigint": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/is-boolean-object": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/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" + } + }, + "client/node_modules/is-data-view": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-date-object": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/is-finalizationregistry": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/is-generator-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/is-generator-function": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/is-installed-globally": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/is-map": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-module": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/is-negative-zero": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "client/node_modules/is-number-object": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "license": "MIT" + }, + "client/node_modules/is-regex": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-regexp": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/is-root": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/is-set": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/is-string": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-symbol": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/is-weakmap": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-weakref": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-weakset": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "client/node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "client/node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "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" + } + }, + "client/node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "client/node_modules/istanbul-lib-report": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/istanbul-reports": { + "version": "3.2.0", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/iterator.prototype": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "client/node_modules/jake": { + "version": "10.9.4", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "client/node_modules/jest-cucumber": { + "version": "4.5.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@cucumber/gherkin": "^28.0.0", + "callsites": "^3.0.0", + "glob": "^10.3.10", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@types/jest": ">=29.5.12", + "jest": ">=29.7.0", + "vitest": ">=1.4.0" + }, + "peerDependenciesMeta": { + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "client/node_modules/jest-cucumber/node_modules/@cucumber/gherkin": { + "version": "28.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=24" + } + }, + "client/node_modules/jest-cucumber/node_modules/@cucumber/messages": { + "version": "24.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "client/node_modules/jest-cucumber/node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.1", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "client/node_modules/jest-cucumber/node_modules/@types/uuid": { + "version": "9.0.8", + "dev": true, + "license": "MIT" + }, + "client/node_modules/jest-cucumber/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "client/node_modules/jest-cucumber/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/jest-cucumber/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/jest-cucumber/node_modules/reflect-metadata": { + "version": "0.2.1", + "dev": true, + "license": "Apache-2.0" + }, + "client/node_modules/jest-cucumber/node_modules/uuid": { + "version": "10.0.0", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "client/node_modules/jest-diff": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-environment-jsdom/node_modules/@jest/environment": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-environment-jsdom/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "client/node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "client/node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-get-type": { + "version": "27.5.1", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-haste-map": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "client/node_modules/jest-jasmine2": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/console": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/environment": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/globals": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/source-map": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@jest/test-result": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "client/node_modules/jest-jasmine2/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "license": "MIT" + }, + "client/node_modules/jest-jasmine2/node_modules/jest-each": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/jest-mock": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/jest-runtime": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/jest-snapshot": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-jasmine2/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-message-util": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-mock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "client/node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "client/node_modules/jest-mock/node_modules/@types/yargs": { + "version": "17.0.35", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "client/node_modules/jest-mock/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/jest-mock/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "client/node_modules/jest-mock/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "client/node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "client/node_modules/jest-regex-util": { + "version": "27.5.1", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-resolve": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-serializer": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-util": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-validate": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "client/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "client/node_modules/jiti": { + "version": "1.21.7", + "license": "MIT", + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "client/node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "client/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "client/node_modules/jsdom": { + "version": "16.7.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "client/node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "client/node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/jsdom/node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "client/node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "client/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "client/node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "client/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "client/node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "license": "MIT" + }, + "client/node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/jsonfile": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "client/node_modules/jsonpath": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "client/node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "client/node_modules/jsonpointer": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/jsx-ast-utils": { + "version": "3.3.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "client/node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "client/node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/klona": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "client/node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "client/node_modules/language-subtag-registry": { + "version": "0.3.23", + "license": "CC0-1.0" + }, + "client/node_modules/language-tags": { + "version": "1.0.9", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "client/node_modules/launch-editor": { + "version": "2.12.0", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "client/node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/levn": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "client/node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "client/node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "client/node_modules/loader-runner": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "client/node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "client/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "client/node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "client/node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "client/node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "client/node_modules/lodash.mergewith": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "client/node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "client/node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "client/node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "client/node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "client/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "client/node_modules/luxon": { + "version": "3.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "client/node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "client/node_modules/magic-string": { + "version": "0.25.9", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "client/node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "client/node_modules/makeerror": { + "version": "1.0.12", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "client/node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/mdn-data": { + "version": "2.0.4", + "license": "CC0-1.0" + }, + "client/node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/memfs": { + "version": "3.5.3", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "client/node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "client/node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "client/node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "client/node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "client/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "client/node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "client/node_modules/mitt": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "client/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "client/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "client/node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "client/node_modules/mz": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "client/node_modules/nanoid": { + "version": "3.3.11", + "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" + } + }, + "client/node_modules/natural-compare": { + "version": "1.4.0", + "license": "MIT" + }, + "client/node_modules/natural-compare-lite": { + "version": "1.4.0", + "license": "MIT" + }, + "client/node_modules/negotiator": { + "version": "0.6.4", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "client/node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "client/node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "client/node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "client/node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "client/node_modules/node-int64": { + "version": "0.4.0", + "license": "MIT" + }, + "client/node_modules/node-releases": { + "version": "2.0.27", + "license": "MIT" + }, + "client/node_modules/normalize-package-data": { + "version": "6.0.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "client/node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "client/node_modules/nwsapi": { + "version": "2.2.22", + "license": "MIT" + }, + "client/node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/object.assign": { + "version": "4.1.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/object.entries": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/object.fromentries": { + "version": "2.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/object.groupby": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/object.values": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "client/node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/on-headers": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "client/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/optionator": { + "version": "0.9.4", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "client/node_modules/own-keys": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/pac-proxy-agent": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "client/node_modules/package-json-from-dist": { + "version": "1.0.1", + "license": "BlueOak-1.0.0" + }, + "client/node_modules/pad-right": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "client/node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "client/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" + } + }, + "client/node_modules/parse5": { + "version": "6.0.1", + "license": "MIT" + }, + "client/node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "client/node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "client/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "client/node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "client/node_modules/path-to-regexp": { + "version": "0.1.12", + "license": "MIT" + }, + "client/node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "client/node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "client/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "client/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "client/node_modules/pirates": { + "version": "4.0.7", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/pkg-up": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "client/node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "client/node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "client/node_modules/possible-typed-array-names": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "client/node_modules/postcss": { + "version": "8.5.6", + "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", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "client/node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-browser-comments": { + "version": "4.0.0", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "client/node_modules/postcss-calc": { + "version": "8.2.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "client/node_modules/postcss-clamp": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "client/node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-colormin": { + "version": "5.3.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-convert-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-custom-media": { + "version": "8.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "client/node_modules/postcss-custom-properties": { + "version": "12.1.11", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "client/node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-discard-comments": { + "version": "5.1.2", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-discard-empty": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-env-function": { + "version": "4.0.6", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "client/node_modules/postcss-focus-visible": { + "version": "6.0.4", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/postcss-focus-within": { + "version": "5.0.4", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/postcss-font-variant": { + "version": "5.0.0", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-gap-properties": { + "version": "3.0.5", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-image-set-function": { + "version": "4.0.7", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-import": { + "version": "15.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "client/node_modules/postcss-initial": { + "version": "4.0.1", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "client/node_modules/postcss-js": { + "version": "4.1.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "client/node_modules/postcss-lab-function": { + "version": "4.2.1", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-loader": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "client/node_modules/postcss-logical": { + "version": "5.0.4", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "client/node_modules/postcss-media-minmax": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-merge-rules": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-minify-params": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/postcss-modules-scope": { + "version": "3.2.1", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "client/node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "client/node_modules/postcss-nested": { + "version": "6.2.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "client/node_modules/postcss-nesting": { + "version": "10.2.0", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-normalize": { + "version": "10.0.1", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "client/node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-string": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-url": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-ordered-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-page-break": { + "version": "3.0.4", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "client/node_modules/postcss-place": { + "version": "7.0.5", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-preset-env": { + "version": "7.8.3", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 12.13.0" + "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "webpack": "^5.0.0" + "postcss": "^8.2" + } + }, + "client/node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "client/node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "client/node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "client/node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "license": "CC0-1.0", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" + "client/node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2.15" } }, - "client/node_modules/css-select": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "client/node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "client/node_modules/postcss-selector-not": { + "version": "6.0.1", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "client/node_modules/css-select-base-adapter": { - "version": "0.1.1", - "license": "MIT" + "client/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, - "client/node_modules/css-tree": { - "version": "1.0.0-alpha.37", + "client/node_modules/postcss-svgo": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "mdn-data": "2.0.4", + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "client/node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "engines": { "node": ">=8.0.0" } }, - "client/node_modules/css-tree/node_modules/source-map": { + "client/node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "client/node_modules/postcss-svgo/node_modules/source-map": { "version": "0.6.1", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "client/node_modules/css-what": { - "version": "6.2.2", - "license": "BSD-2-Clause", + "client/node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + } + }, + "client/node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "client/node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "client/node_modules/prelude-ls": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "client/node_modules/pretty-bytes": { + "version": "5.6.0", + "license": "MIT", + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/cssdb": { - "version": "7.11.2", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "CC0-1.0" + "client/node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } }, - "client/node_modules/cssesc": { - "version": "3.0.0", + "client/node_modules/pretty-format": { + "version": "27.5.1", "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "client/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "client/node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "client/node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "client/node_modules/cssnano": { - "version": "5.1.15", + "client/node_modules/promise": { + "version": "8.3.0", "license": "MIT", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "asap": "~2.0.6" } }, - "client/node_modules/cssnano-preset-default": { - "version": "5.2.14", + "client/node_modules/prompts": { + "version": "2.4.2", "license": "MIT", "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 6" } }, - "client/node_modules/cssnano-utils": { - "version": "3.1.0", + "client/node_modules/prop-types": { + "version": "15.8.1", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "client/node_modules/csso": { - "version": "4.2.0", + "client/node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "client/node_modules/property-expr": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "client/node_modules/proxy-addr": { + "version": "2.0.7", "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.10" } }, - "client/node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", + "client/node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "client/node_modules/proxy-agent": { + "version": "6.5.0", + "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">=8.0.0" + "node": ">= 14" } }, - "client/node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "license": "CC0-1.0" - }, - "client/node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "client/node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "client/node_modules/cssom": { - "version": "0.4.4", + "client/node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, "license": "MIT" }, - "client/node_modules/cssstyle": { - "version": "2.3.0", + "client/node_modules/psl": { + "version": "1.15.0", "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "punycode": "^2.3.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "client/node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "license": "MIT" - }, - "client/node_modules/csstype": { - "version": "3.1.3", + "client/node_modules/pump": { + "version": "3.0.3", "dev": true, - "license": "MIT" - }, - "client/node_modules/damerau-levenshtein": { - "version": "1.0.8", - "license": "BSD-2-Clause" + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "client/node_modules/data-urls": { - "version": "2.0.0", + "client/node_modules/punycode": { + "version": "2.3.1", "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "client/node_modules/puppeteer": { + "version": "24.30.0", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "@puppeteer/browsers": "2.10.13", + "chromium-bidi": "11.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1521046", + "puppeteer-core": "24.30.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "client/node_modules/data-view-buffer": { - "version": "1.0.2", - "license": "MIT", + "client/node_modules/puppeteer-core": { + "version": "24.30.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "@puppeteer/browsers": "2.10.13", + "chromium-bidi": "11.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1521046", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.3.8", + "ws": "^8.18.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "client/node_modules/data-view-byte-length": { - "version": "1.0.2", + "client/node_modules/puppeteer/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "client/node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/inspect-js" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/data-view-byte-offset": { - "version": "1.0.1", + "client/node_modules/puppeteer/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "client/node_modules/q": { + "version": "1.5.1", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "client/node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.4" + "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/decimal.js": { - "version": "10.6.0", - "license": "MIT" - }, - "client/node_modules/dedent": { - "version": "0.7.0", + "client/node_modules/querystringify": { + "version": "2.2.0", "license": "MIT" }, - "client/node_modules/deep-is": { - "version": "0.1.4", + "client/node_modules/queue-microtask": { + "version": "1.2.3", + "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" }, - "client/node_modules/default-gateway": { - "version": "6.0.3", - "license": "BSD-2-Clause", + "client/node_modules/raf": { + "version": "3.4.1", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" + "performance-now": "^2.1.0" } }, - "client/node_modules/define-data-property": { - "version": "1.1.4", + "client/node_modules/randombytes": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "^5.1.0" } }, - "client/node_modules/define-lazy-prop": { - "version": "2.0.0", + "client/node_modules/range-parser": { + "version": "1.2.1", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "client/node_modules/define-properties": { - "version": "1.2.1", + "client/node_modules/raw-body": { + "version": "2.5.2", "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "client/node_modules/depd": { - "version": "2.0.0", + "client/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "client/node_modules/destroy": { - "version": "1.2.0", + "client/node_modules/react": { + "version": "18.3.1", "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.10.0" } }, - "client/node_modules/detect-node": { - "version": "2.1.0", - "license": "MIT" - }, - "client/node_modules/detect-port-alt": { - "version": "1.1.6", + "client/node_modules/react-app-polyfill": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" }, "engines": { - "node": ">= 4.2.1" + "node": ">=14" } }, - "client/node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", + "client/node_modules/react-dev-utils": { + "version": "12.0.1", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" } }, - "client/node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "client/node_modules/didyoumean": { - "version": "1.2.2", - "license": "Apache-2.0" + "client/node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "client/node_modules/diff-sequences": { - "version": "27.5.1", + "client/node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 12.13.0" } }, - "client/node_modules/dir-glob": { - "version": "3.0.1", + "client/node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/dlv": { - "version": "1.1.3", - "license": "MIT" - }, - "client/node_modules/dns-packet": { - "version": "5.6.1", + "client/node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/doctrine": { - "version": "3.0.0", - "license": "Apache-2.0", + "client/node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/dom-converter": { - "version": "0.2.0", + "client/node_modules/react-dom": { + "version": "18.3.1", "license": "MIT", + "peer": true, "dependencies": { - "utila": "~0.4" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" } }, - "client/node_modules/dom-serializer": { - "version": "1.4.1", + "client/node_modules/react-error-overlay": { + "version": "6.1.0", + "license": "MIT" + }, + "client/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT", + "peer": true + }, + "client/node_modules/react-redux": { + "version": "9.2.0", "license": "MIT", + "peer": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } } }, - "client/node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "client/node_modules/react-refresh": { + "version": "0.11.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, - "client/node_modules/domexception": { - "version": "2.0.1", + "client/node_modules/react-router": { + "version": "6.30.2", "license": "MIT", "dependencies": { - "webidl-conversions": "^5.0.0" + "@remix-run/router": "1.23.1" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" } }, - "client/node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "license": "BSD-2-Clause", + "client/node_modules/react-router-dom": { + "version": "6.30.2", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.1", + "react-router": "6.30.2" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "client/node_modules/domhandler": { - "version": "4.3.1", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" }, "engines": { - "node": ">= 4" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/domutils": { - "version": "2.8.0", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts/node_modules/@jest/console": { + "version": "27.5.1", + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/dot-case": { - "version": "3.0.4", + "client/node_modules/react-scripts/node_modules/@jest/core": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "client/node_modules/dotenv": { - "version": "10.0.0", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts/node_modules/@jest/environment": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, "engines": { - "node": ">=10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/dotenv-expand": { - "version": "5.1.0", - "license": "BSD-2-Clause" - }, - "client/node_modules/duplexer": { - "version": "0.1.2", - "license": "MIT" - }, - "client/node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "client/node_modules/ejs": { - "version": "3.1.10", - "license": "Apache-2.0", + "client/node_modules/react-scripts/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "license": "MIT", "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/emittery": { - "version": "0.8.1", + "client/node_modules/react-scripts/node_modules/@jest/globals": { + "version": "27.5.1", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "client/node_modules/emojis-list": { - "version": "3.0.0", + "client/node_modules/react-scripts/node_modules/@jest/reporters": { + "version": "27.5.1", "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, "engines": { - "node": ">= 4" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "client/node_modules/encodeurl": { - "version": "2.0.0", + "client/node_modules/react-scripts/node_modules/@jest/schemas": { + "version": "28.1.3", "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, "engines": { - "node": ">= 0.8" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/enhanced-resolve": { - "version": "5.18.3", + "client/node_modules/react-scripts/node_modules/@jest/source-map": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "client/node_modules/entities": { - "version": "2.2.0", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/es-abstract": { - "version": "1.24.0", + "client/node_modules/react-scripts/node_modules/@jest/test-result": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "license": "MIT" - }, - "client/node_modules/es-iterator-helpers": { - "version": "1.2.1", + "client/node_modules/react-scripts/node_modules/@jest/test-sequencer": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" }, "engines": { - "node": ">= 0.4" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/es-module-lexer": { - "version": "1.7.0", + "client/node_modules/react-scripts/node_modules/@sinclair/typebox": { + "version": "0.24.51", "license": "MIT" }, - "client/node_modules/es-shim-unscopables": { - "version": "1.1.0", - "license": "MIT", + "client/node_modules/react-scripts/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "license": "BSD-3-Clause", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "type-detect": "4.0.8" } }, - "client/node_modules/es-to-primitive": { - "version": "1.3.0", + "client/node_modules/react-scripts/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "client/node_modules/react-scripts/node_modules/@types/yargs": { + "version": "17.0.35", "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, + "@types/yargs-parser": "*" + } + }, + "client/node_modules/react-scripts/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/escape-html": { - "version": "1.0.3", + "client/node_modules/react-scripts/node_modules/cjs-module-lexer": { + "version": "1.4.3", "license": "MIT" }, - "client/node_modules/escape-string-regexp": { - "version": "4.0.0", + "client/node_modules/react-scripts/node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "client/node_modules/react-scripts/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "client/node_modules/react-scripts/node_modules/dedent": { + "version": "0.7.0", + "license": "MIT" + }, + "client/node_modules/react-scripts/node_modules/emittery": { + "version": "0.8.1", "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "client/node_modules/eslint": { - "version": "8.57.1", - "license": "MIT", - "peer": true, + "client/node_modules/react-scripts/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "license": "BSD-3-Clause", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10" } }, - "client/node_modules/eslint-config-react-app": { - "version": "7.0.1", + "client/node_modules/react-scripts/node_modules/jest": { + "version": "27.5.1", "license": "MIT", + "peer": true, "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=14.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "eslint": "^8.0.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "client/node_modules/eslint-import-resolver-node": { - "version": "0.3.9", + "client/node_modules/react-scripts/node_modules/jest-changed-files": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", + "client/node_modules/react-scripts/node_modules/jest-circus": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-module-utils": { - "version": "2.12.1", + "client/node_modules/react-scripts/node_modules/jest-cli": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=4" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "eslint": { + "node-notifier": { "optional": true } } }, - "client/node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", + "client/node_modules/react-scripts/node_modules/jest-config": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "ms": "^2.1.1" - } - }, - "client/node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "license": "BSD-3-Clause", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=12.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } } }, - "client/node_modules/eslint-plugin-import": { - "version": "2.32.0", + "client/node_modules/react-scripts/node_modules/jest-docblock": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", + "client/node_modules/react-scripts/node_modules/jest-each": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", + "client/node_modules/react-scripts/node_modules/jest-environment-node": { + "version": "27.5.1", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "client/node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-jest": { - "version": "25.7.0", + "client/node_modules/react-scripts/node_modules/jest-leak-detector": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", + "client/node_modules/react-scripts/node_modules/jest-mock": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" + "@jest/types": "^27.5.1", + "@types/node": "*" }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-react": { - "version": "7.37.5", + "client/node_modules/react-scripts/node_modules/jest-resolve-dependencies": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", + "client/node_modules/react-scripts/node_modules/jest-runner": { + "version": "27.5.1", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", + "client/node_modules/react-scripts/node_modules/jest-runtime": { + "version": "27.5.1", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", + "client/node_modules/react-scripts/node_modules/jest-snapshot": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "client/node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/eslint-plugin-testing-library": { - "version": "5.11.1", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.58.0" + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" + "jest": "^27.0.0 || ^28.0.0" } }, - "client/node_modules/eslint-scope": { - "version": "7.2.2", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "license": "Apache-2.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "client/node_modules/eslint-webpack-plugin": { - "version": "3.2.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", "license": "MIT", "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/types": { "version": "28.1.3", "license": "MIT", "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "client/node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "client/node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "client/node_modules/espree": { - "version": "9.6.1", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "client/node_modules/esquery": { - "version": "1.6.0", - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/estree-walker": { - "version": "1.0.1", - "license": "MIT" - }, - "client/node_modules/etag": { - "version": "1.8.1", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=12.20" } }, - "client/node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "client/node_modules/events": { - "version": "3.3.0", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.2", "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=0.8.x" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "client/node_modules/exit": { - "version": "0.1.2", + "client/node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "client/node_modules/expect": { + "client/node_modules/react-scripts/node_modules/jest-watcher": { "version": "27.5.1", "license": "MIT", "dependencies": { + "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "client/node_modules/express": { - "version": "4.21.2", - "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" - }, + "client/node_modules/react-scripts/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "client/node_modules/react-scripts/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=0.10.0" } }, - "client/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", + "client/node_modules/react-scripts/node_modules/v8-to-istanbul": { + "version": "8.1.1", + "license": "ISC", "dependencies": { - "ms": "2.0.0" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" } }, - "client/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "client/node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" + "client/node_modules/react-scripts/node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.6", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } }, - "client/node_modules/fast-glob": { - "version": "3.3.3", + "client/node_modules/react-scripts/node_modules/yargs": { + "version": "16.2.0", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8.6.0" + "node": ">=10" } }, - "client/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", + "client/node_modules/react-scripts/node_modules/yargs-parser": { + "version": "20.2.9", "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "client/node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "client/node_modules/fast-uri": { - "version": "3.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "client/node_modules/fastq": { - "version": "1.19.1", - "license": "ISC", + "client/node_modules/read-cache": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "pify": "^2.3.0" } }, - "client/node_modules/faye-websocket": { - "version": "0.11.4", - "license": "Apache-2.0", + "client/node_modules/read-package-up": { + "version": "11.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "websocket-driver": ">=0.5.1" + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/file-entry-cache": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, + "client/node_modules/read-package-up/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/file-loader": { - "version": "6.2.0", + "client/node_modules/read-pkg": { + "version": "9.0.1", + "dev": true, "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", + "client/node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/filelist": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" + "client/node_modules/read-pkg/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", + "client/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "client/node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10" - } - }, - "client/node_modules/filesize": { - "version": "8.0.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 0.4.0" + "node": ">= 6" } }, - "client/node_modules/finalhandler": { - "version": "1.3.1", + "client/node_modules/readdirp": { + "version": "3.6.0", "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" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8.10.0" } }, - "client/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", + "client/node_modules/recharts": { + "version": "3.5.1", "license": "MIT", + "workspaces": [ + "www" + ], "dependencies": { - "ms": "2.0.0" + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "client/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", + "client/node_modules/recharts/node_modules/eventemitter3": { + "version": "5.0.1", "license": "MIT" }, - "client/node_modules/find-cache-dir": { - "version": "3.3.2", + "client/node_modules/recharts/node_modules/immer": { + "version": "10.2.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "client/node_modules/recursive-readdir": { + "version": "2.2.3", "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">=6.0.0" } }, - "client/node_modules/flat-cache": { - "version": "3.2.0", + "client/node_modules/redent": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "client/node_modules/flatted": { - "version": "3.3.3", - "license": "ISC" + "client/node_modules/redux": { + "version": "5.0.1", + "license": "MIT", + "peer": true }, - "client/node_modules/follow-redirects": { - "version": "1.15.11", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "client/node_modules/redux-thunk": { + "version": "3.1.0", "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "peerDependencies": { + "redux": "^5.0.0" } }, - "client/node_modules/for-each": { - "version": "0.3.5", + "client/node_modules/reflect-metadata": { + "version": "0.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "client/node_modules/reflect.getprototypeof": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -5722,158 +14338,149 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", + "client/node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "client/node_modules/regenerate-unicode-properties": { + "version": "10.2.2", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "regenerate": "^1.4.2" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">=4" } }, - "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "license": "MIT", + "client/node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "client/node_modules/regex-parser": { + "version": "2.3.1", + "license": "MIT" + }, + "client/node_modules/regexp-match-indices": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" + "regexp-tree": "^0.1.11" } }, - "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", + "client/node_modules/regexp-tree": { + "version": "0.1.27", + "dev": true, "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", + "client/node_modules/regexp.prototype.flags": { + "version": "1.5.4", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", + "client/node_modules/regexpu-core": { + "version": "6.4.0", "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "client/node_modules/form-data": { - "version": "3.0.4", - "license": "MIT", + "client/node_modules/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "client/node_modules/regjsparser": { + "version": "0.13.0", + "license": "BSD-2-Clause", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" + "jsesc": "~3.1.0" }, - "engines": { - "node": ">= 6" + "bin": { + "regjsparser": "bin/parser" } }, - "client/node_modules/forwarded": { - "version": "0.2.0", + "client/node_modules/relateurl": { + "version": "0.2.7", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.10" } }, - "client/node_modules/fraction.js": { - "version": "4.3.7", + "client/node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "client/node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "node": ">=0.10" } }, - "client/node_modules/fresh": { - "version": "0.5.2", + "client/node_modules/require-directory": { + "version": "2.1.1", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "client/node_modules/fs-extra": { - "version": "10.1.0", + "client/node_modules/require-from-string": { + "version": "2.0.2", "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "client/node_modules/fs-monkey": { - "version": "1.1.0", - "license": "Unlicense" + "client/node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" }, - "client/node_modules/function.prototype.name": { - "version": "1.1.8", + "client/node_modules/reselect": { + "version": "5.1.1", + "license": "MIT" + }, + "client/node_modules/resolve": { + "version": "1.22.11", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "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" @@ -5882,176 +14489,223 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/functions-have-names": { - "version": "1.2.3", + "client/node_modules/resolve-cwd": { + "version": "3.0.0", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "client/node_modules/generator-function": { - "version": "2.0.1", + "client/node_modules/resolve-from": { + "version": "5.0.0", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "client/node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "license": "ISC" - }, - "client/node_modules/get-symbol-description": { - "version": "1.1.0", + "client/node_modules/resolve-url-loader": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8.9" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } } }, - "client/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "client/node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "client/node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "license": "ISC" + }, + "client/node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "license": "MIT", "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" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { - "node": "*" + "node": ">=6.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "client/node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "client/node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "client/node_modules/glob-to-regexp": { - "version": "0.4.1", - "license": "BSD-2-Clause" + "client/node_modules/resolve.exports": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "client/node_modules/global-modules": { - "version": "2.0.0", + "client/node_modules/retry": { + "version": "0.13.1", "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 4" } }, - "client/node_modules/global-prefix": { - "version": "3.0.0", + "client/node_modules/reusify": { + "version": "1.1.0", "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "client/node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/rollup": { + "version": "2.79.2", + "license": "MIT", + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "client/node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "license": "ISC", + "client/node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" }, - "bin": { - "which": "bin/which" + "peerDependencies": { + "rollup": "^2.0.0" } }, - "client/node_modules/globals": { - "version": "13.24.0", + "client/node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.13.0" } }, - "client/node_modules/globalthis": { - "version": "1.0.4", - "license": "MIT", + "client/node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "license": "BSD-3-Clause", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "randombytes": "^2.1.0" } }, - "client/node_modules/globby": { - "version": "11.1.0", + "client/node_modules/run-parallel": { + "version": "1.2.0", + "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": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "queue-microtask": "^1.2.2" } }, - "client/node_modules/graphemer": { - "version": "1.4.0", - "license": "MIT" - }, - "client/node_modules/gzip-size": { - "version": "6.0.0", + "client/node_modules/safe-array-concat": { + "version": "1.1.3", "license": "MIT", "dependencies": { - "duplexer": "^0.1.2" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=10" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/handle-thing": { - "version": "2.0.1", + "client/node_modules/safe-buffer": { + "version": "5.2.1", + "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" }, - "client/node_modules/harmony-reflect": { - "version": "1.6.2", - "license": "(Apache-2.0 OR MPL-1.1)" - }, - "client/node_modules/has-bigints": { - "version": "1.1.0", + "client/node_modules/safe-push-apply": { + "version": "1.0.0", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, "engines": { "node": ">= 0.4" }, @@ -6059,21 +14713,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "client/node_modules/has-proto": { - "version": "1.2.0", + "client/node_modules/safe-regex-test": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6082,361 +14728,333 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/he": { - "version": "1.2.0", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "client/node_modules/hoopy": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "client/node_modules/hpack.js": { - "version": "2.1.6", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "client/node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", + "client/node_modules/safer-buffer": { + "version": "2.1.2", "license": "MIT" }, - "client/node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "client/node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" + "client/node_modules/sanitize.css": { + "version": "13.0.0", + "license": "CC0-1.0" }, - "client/node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", + "client/node_modules/sass-loader": { + "version": "12.6.0", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } } }, - "client/node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "license": "MIT", + "client/node_modules/sax": { + "version": "1.2.4", + "license": "ISC" + }, + "client/node_modules/saxes": { + "version": "5.0.1", + "license": "ISC", "dependencies": { - "whatwg-encoding": "^1.0.5" + "xmlchars": "^2.2.0" }, "engines": { "node": ">=10" } }, - "client/node_modules/html-entities": { - "version": "2.6.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "client/node_modules/html-minifier-terser": { - "version": "6.1.0", + "client/node_modules/scheduler": { + "version": "0.23.2", "license": "MIT", "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" + "loose-envify": "^1.1.0" } }, - "client/node_modules/html-webpack-plugin": { - "version": "5.6.4", + "client/node_modules/schema-utils": { + "version": "4.3.3", "license": "MIT", "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://opencollective.com/webpack" } }, - "client/node_modules/htmlparser2": { - "version": "6.1.0", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "client/node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", "license": "MIT", + "peer": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "client/node_modules/http-deceiver": { - "version": "1.2.7", - "license": "MIT" - }, - "client/node_modules/http-errors": { - "version": "2.0.0", + "client/node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "client/node_modules/http-parser-js": { - "version": "0.5.10", + "client/node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", "license": "MIT" }, - "client/node_modules/http-proxy": { - "version": "1.18.1", + "client/node_modules/seed-random": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/selfsigned": { + "version": "2.4.1", "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "client/node_modules/http-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "client/node_modules/semver": { + "version": "7.7.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "client/node_modules/http-proxy-middleware": { - "version": "2.0.9", + "client/node_modules/send": { + "version": "0.19.0", "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "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": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": ">= 0.8.0" } }, - "client/node_modules/https-proxy-agent": { - "version": "5.0.1", + "client/node_modules/send/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "ms": "2.0.0" } }, - "client/node_modules/iconv-lite": { - "version": "0.6.3", + "client/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "client/node_modules/icss-utils": { - "version": "5.1.0", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "client/node_modules/serialize-javascript": { + "version": "6.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" } }, - "client/node_modules/idb": { - "version": "7.1.1", - "license": "ISC" - }, - "client/node_modules/identity-obj-proxy": { - "version": "3.0.0", + "client/node_modules/serve-index": { + "version": "1.9.1", "license": "MIT", "dependencies": { - "harmony-reflect": "^1.4.6" + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "client/node_modules/ignore": { - "version": "5.3.2", + "client/node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "client/node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 0.6" } }, - "client/node_modules/immer": { - "version": "9.0.21", + "client/node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "client/node_modules/ini": { - "version": "1.3.8", + "client/node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", "license": "ISC" }, - "client/node_modules/internal-slot": { + "client/node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "client/node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "license": "ISC" + }, + "client/node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "client/node_modules/ipaddr.js": { - "version": "2.2.0", + "client/node_modules/serve-static": { + "version": "1.16.2", "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, "engines": { - "node": ">= 10" + "node": ">= 0.8.0" } }, - "client/node_modules/is-array-buffer": { - "version": "3.0.5", + "client/node_modules/set-function-length": { + "version": "1.2.2", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-async-function": { - "version": "2.1.1", + "client/node_modules/set-function-name": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-bigint": { - "version": "1.1.0", + "client/node_modules/set-proto": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-binary-path": { - "version": "2.1.0", + "client/node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "client/node_modules/shebang-command": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "client/node_modules/is-boolean-object": { - "version": "1.2.2", + "client/node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "client/node_modules/shell-quote": { + "version": "1.8.3", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, "engines": { "node": ">= 0.4" }, @@ -6444,9 +15062,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-callable": { - "version": "1.2.7", + "client/node_modules/side-channel": { + "version": "1.1.0", "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" }, @@ -6454,11 +15079,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-core-module": { - "version": "2.16.1", + "client/node_modules/side-channel-list": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" @@ -6467,13 +15093,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-data-view": { - "version": "1.0.2", + "client/node_modules/side-channel-map": { + "version": "1.0.1", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" @@ -6482,12 +15109,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-date-object": { - "version": "1.1.0", + "client/node_modules/side-channel-weakmap": { + "version": "1.0.2", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", - "has-tostringtag": "^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" @@ -6496,4220 +15126,4369 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/is-docker": { - "version": "2.2.1", + "client/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "client/node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "client/node_modules/slash": { + "version": "3.0.0", "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/is-extglob": { - "version": "2.1.1", + "client/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "client/node_modules/is-finalizationregistry": { - "version": "1.1.1", + "client/node_modules/sockjs": { + "version": "0.3.24", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "client/node_modules/is-generator-function": { - "version": "1.1.2", + "client/node_modules/socks": { + "version": "2.8.7", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "client/node_modules/is-glob": { - "version": "4.0.3", + "client/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">=0.10.0" - } - }, - "client/node_modules/is-map": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "client/node_modules/is-module": { - "version": "1.0.0", + "client/node_modules/source-list-map": { + "version": "2.0.1", "license": "MIT" }, - "client/node_modules/is-negative-zero": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "client/node_modules/is-number-object": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, + "client/node_modules/source-map": { + "version": "0.7.6", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 12" } }, - "client/node_modules/is-obj": { - "version": "1.0.1", - "license": "MIT", + "client/node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "client/node_modules/is-plain-obj": { - "version": "3.0.0", + "client/node_modules/source-map-loader": { + "version": "3.0.2", "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=10" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "client/node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "license": "MIT" - }, - "client/node_modules/is-regex": { - "version": "1.2.1", + "client/node_modules/source-map-support": { + "version": "0.5.21", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "client/node_modules/is-regexp": { - "version": "1.0.0", - "license": "MIT", + "client/node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "client/node_modules/is-root": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" + "client/node_modules/sourcemap-codec": { + "version": "1.4.8", + "license": "MIT" + }, + "client/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "client/node_modules/is-set": { - "version": "2.0.3", + "client/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "client/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "client/node_modules/is-shared-array-buffer": { - "version": "1.0.4", + "client/node_modules/spdx-license-ids": { + "version": "3.0.22", + "dev": true, + "license": "CC0-1.0" + }, + "client/node_modules/spdy": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "client/node_modules/is-string": { - "version": "1.1.1", + "client/node_modules/spdy-transport": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "client/node_modules/is-symbol": { - "version": "1.1.1", + "client/node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "client/node_modules/stable": { + "version": "0.1.8", + "license": "MIT" + }, + "client/node_modules/stack-utils": { + "version": "2.0.6", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "client/node_modules/is-typed-array": { - "version": "1.1.15", + "client/node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "client/node_modules/is-typedarray": { - "version": "1.0.0", + "client/node_modules/stackframe": { + "version": "1.3.4", "license": "MIT" }, - "client/node_modules/is-weakmap": { + "client/node_modules/static-eval": { "version": "2.0.2", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "escodegen": "^1.8.1" } }, - "client/node_modules/is-weakref": { - "version": "1.1.1", - "license": "MIT", + "client/node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", "dependencies": { - "call-bound": "^1.0.3" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "client/node_modules/is-weakset": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, + "client/node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "client/node_modules/is-wsl": { - "version": "2.2.0", + "client/node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "client/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "client/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "license": "BSD-3-Clause", + "client/node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", "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" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": ">=8" - } - }, - "client/node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">= 0.8.0" } }, - "client/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, + "client/node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "client/node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "client/node_modules/static-eval/node_modules/source-map": { "version": "0.6.1", "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "client/node_modules/iterator.prototype": { - "version": "1.1.5", + "client/node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "client/node_modules/jackspeak": { - "version": "3.4.3", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "client/node_modules/jake": { - "version": "10.9.4", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "client/node_modules/jest": { - "version": "27.5.1", + "client/node_modules/statuses": { + "version": "2.0.1", "license": "MIT", - "peer": true, - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 0.8" } }, - "client/node_modules/jest-changed-files": { - "version": "27.5.1", + "client/node_modules/stop-iteration-iterator": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" } }, - "client/node_modules/jest-circus": { - "version": "27.5.1", + "client/node_modules/streamx": { + "version": "2.23.0", + "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "client/node_modules/jest-cli": { - "version": "27.5.1", + "client/node_modules/string_decoder": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, + "safe-buffer": "~5.2.0" + } + }, + "client/node_modules/string-argv": { + "version": "0.3.1", + "dev": true, + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=0.6.19" } }, - "client/node_modules/jest-config": { - "version": "27.5.1", + "client/node_modules/string-length": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "node": ">=10" } }, - "client/node_modules/jest-diff": { - "version": "27.5.1", + "client/node_modules/string-natural-compare": { + "version": "3.0.1", + "license": "MIT" + }, + "client/node_modules/string-width": { + "version": "4.2.3", "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-docblock": { - "version": "27.5.1", + "client/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-each": { - "version": "27.5.1", + "client/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "client/node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "client/node_modules/string.prototype.includes": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" } }, - "client/node_modules/jest-environment-jsdom": { - "version": "27.5.1", + "client/node_modules/string.prototype.matchall": { + "version": "4.0.12", "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/jest-environment-node": { - "version": "27.5.1", + "client/node_modules/string.prototype.repeat": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "client/node_modules/jest-get-type": { - "version": "27.5.1", + "client/node_modules/string.prototype.trim": { + "version": "1.2.10", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/jest-haste-map": { - "version": "27.5.1", + "client/node_modules/string.prototype.trimend": { + "version": "1.0.9", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/jest-jasmine2": { - "version": "27.5.1", + "client/node_modules/string.prototype.trimstart": { + "version": "1.0.8", "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/jest-leak-detector": { - "version": "27.5.1", - "license": "MIT", + "client/node_modules/stringify-object": { + "version": "3.3.0", + "license": "BSD-2-Clause", "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=4" } }, - "client/node_modules/jest-matcher-utils": { - "version": "27.5.1", + "client/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-message-util": { - "version": "27.5.1", + "client/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-mock": { - "version": "27.5.1", + "client/node_modules/strip-bom": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-regex-util": { - "version": "27.5.1", + "client/node_modules/strip-comments": { + "version": "2.0.1", "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" } }, - "client/node_modules/jest-resolve": { - "version": "27.5.1", + "client/node_modules/strip-final-newline": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6" } }, - "client/node_modules/jest-resolve-dependencies": { - "version": "27.5.1", + "client/node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "min-indent": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-runner": { - "version": "27.5.1", + "client/node_modules/strip-json-comments": { + "version": "3.1.1", "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "client/node_modules/style-loader": { + "version": "3.3.4", + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "client/node_modules/jest-runtime": { - "version": "27.5.1", + "client/node_modules/stylehacks": { + "version": "5.1.1", "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "client/node_modules/jest-serializer": { - "version": "27.5.1", + "client/node_modules/sucrase": { + "version": "3.35.0", "license": "MIT", "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=16 || 14 >=14.17" } }, - "client/node_modules/jest-snapshot": { - "version": "27.5.1", + "client/node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "balanced-match": "^1.0.0" + } + }, + "client/node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "client/node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "client/node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/jest-util": { - "version": "27.5.1", + "client/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-validate": { - "version": "27.5.1", + "client/node_modules/supports-hyperlinks": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-watch-typeahead": { - "version": "1.1.0", + "client/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", + "client/node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "client/node_modules/svgo": { + "version": "1.3.2", "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=4.0.0" } }, - "client/node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", + "client/node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "client/node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", + "client/node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=4" } }, - "client/node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", + "client/node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", "license": "MIT", "dependencies": { - "@jest/schemas": "^28.1.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" - }, + "color-name": "1.1.3" + } + }, + "client/node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "client/node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "client/node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "license": "BSD-2-Clause", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "client/node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.34", + "client/node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, - "client/node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "5.2.0", + "client/node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "client/node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "license": "BSD-2-Clause" + }, + "client/node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.8.0" } }, - "client/node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", + "client/node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "client/node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "client/node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "engines": { + "node": ">=4" } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", + "client/node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "client/node_modules/tailwindcss": { + "version": "3.4.18", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=14.0.0" } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", + "client/node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", + "client/node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "6.0.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", + "client/node_modules/tapable": { + "version": "2.3.0", "license": "MIT", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", + "client/node_modules/tar-fs": { + "version": "3.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" + "pump": "^3.0.0", + "tar-stream": "^3.1.5" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", + "client/node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "client/node_modules/tar-stream/node_modules/b4a": { + "version": "1.7.3", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, - "client/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { - "version": "6.0.1", + "client/node_modules/temp-dir": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "client/node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", + "client/node_modules/tempy": { + "version": "0.6.0", "license": "MIT", "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "client/node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "license": "MIT", + "client/node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", + "client/node_modules/terminal-link": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" }, "engines": { - "node": ">=12.20" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.2", - "license": "MIT", + "client/node_modules/terser": { + "version": "5.44.1", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "node": ">=12.20" + "node": ">=10" } }, - "client/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.2", + "client/node_modules/terser-webpack-plugin": { + "version": "5.3.14", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { - "node": ">=12" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "client/node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "client/node_modules/jest-watcher": { - "version": "27.5.1", - "license": "MIT", + "client/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "client/node_modules/test-exclude": { + "version": "6.0.0", + "license": "ISC", "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "client/node_modules/jest-worker": { - "version": "27.5.1", - "license": "MIT", + "client/node_modules/text-decoder": { + "version": "1.2.3", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" + "b4a": "^1.6.4" } }, - "client/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "client/node_modules/text-decoder/node_modules/b4a": { + "version": "1.7.3", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, - "client/node_modules/jiti": { - "version": "1.21.7", - "license": "MIT", - "peer": true, - "bin": { - "jiti": "bin/jiti.js" - } + "client/node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" }, - "client/node_modules/js-yaml": { - "version": "3.14.1", + "client/node_modules/thenify": { + "version": "3.3.1", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "any-promise": "^1.0.0" } }, - "client/node_modules/jsdom": { - "version": "16.7.0", + "client/node_modules/thenify-all": { + "version": "1.6.0", "license": "MIT", "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" + "thenify": ">= 3.1.0 < 4" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "engines": { + "node": ">=0.8" } }, - "client/node_modules/json-buffer": { - "version": "3.0.1", + "client/node_modules/throat": { + "version": "6.0.2", "license": "MIT" }, - "client/node_modules/json-schema": { - "version": "0.4.0", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "client/node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" }, - "client/node_modules/json-schema-traverse": { - "version": "0.4.1", + "client/node_modules/tiny-case": { + "version": "1.0.3", + "dev": true, "license": "MIT" }, - "client/node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", + "client/node_modules/tiny-invariant": { + "version": "1.3.3", "license": "MIT" }, - "client/node_modules/jsonfile": { - "version": "6.2.0", + "client/node_modules/tmpl": { + "version": "1.0.5", + "license": "BSD-3-Clause" + }, + "client/node_modules/to-regex-range": { + "version": "5.0.1", "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "is-number": "^7.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=8.0" } }, - "client/node_modules/jsonpath": { - "version": "1.1.1", + "client/node_modules/toidentifier": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" + "engines": { + "node": ">=0.6" } }, - "client/node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "client/node_modules/toposort": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "client/node_modules/tough-cookie": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "client/node_modules/jsonpointer": { - "version": "5.0.1", + "client/node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "client/node_modules/jsx-ast-utils": { - "version": "3.3.5", + "client/node_modules/tr46": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "punycode": "^2.1.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "client/node_modules/keyv": { - "version": "4.5.4", + "client/node_modules/tryer": { + "version": "1.0.1", + "license": "MIT" + }, + "client/node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" + "engines": { + "node": ">=6.10" } }, - "client/node_modules/kind-of": { - "version": "6.0.3", + "client/node_modules/ts-interface-checker": { + "version": "0.1.13", + "license": "Apache-2.0" + }, + "client/node_modules/tsconfig-paths": { + "version": "3.15.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "client/node_modules/kleur": { - "version": "3.0.3", + "client/node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "client/node_modules/klona": { - "version": "2.0.6", + "client/node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=4" } }, - "client/node_modules/language-subtag-registry": { - "version": "0.3.23", - "license": "CC0-1.0" + "client/node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" }, - "client/node_modules/language-tags": { - "version": "1.0.9", + "client/node_modules/tsutils": { + "version": "3.21.0", "license": "MIT", "dependencies": { - "language-subtag-registry": "^0.3.20" + "tslib": "^1.8.1" }, "engines": { - "node": ">=0.10" + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "client/node_modules/launch-editor": { - "version": "2.12.0", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } + "client/node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" }, - "client/node_modules/levn": { - "version": "0.4.1", + "client/node_modules/type-check": { + "version": "0.4.0", "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, - "client/node_modules/lilconfig": { - "version": "2.1.0", + "client/node_modules/type-detect": { + "version": "4.0.8", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "client/node_modules/loader-runner": { - "version": "4.3.1", - "license": "MIT", + "client/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { - "node": ">=6.11.5" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/loader-utils": { - "version": "2.0.4", + "client/node_modules/type-is": { + "version": "1.6.18", "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=8.9.0" + "node": ">= 0.6" } }, - "client/node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "client/node_modules/lodash.uniq": { - "version": "4.5.0", - "license": "MIT" - }, - "client/node_modules/magic-string": { - "version": "0.25.9", + "client/node_modules/typed-array-buffer": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" } }, - "client/node_modules/make-dir": { - "version": "3.1.0", + "client/node_modules/typed-array-byte-length": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "client/node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/mdn-data": { - "version": "2.0.4", - "license": "CC0-1.0" - }, - "client/node_modules/memfs": { - "version": "3.5.3", - "license": "Unlicense", + "client/node_modules/typed-array-length": { + "version": "1.0.7", + "license": "MIT", "dependencies": { - "fs-monkey": "^1.0.4" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { - "node": ">= 4.0.0" - } - }, - "client/node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/merge2": { - "version": "1.4.1", + "client/node_modules/typed-query-selector": { + "version": "2.12.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/typedarray-to-buffer": { + "version": "3.1.5", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "client/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", + "client/node_modules/typescript": { + "version": "4.9.5", + "license": "Apache-2.0", + "peer": true, "bin": { - "mime": "cli.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4" + "node": ">=4.2.0" } }, - "client/node_modules/mini-css-extract-plugin": { - "version": "2.9.4", + "client/node_modules/unbox-primitive": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" + "client/node_modules/underscore": { + "version": "1.12.1", + "license": "MIT" }, - "client/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "client/node_modules/undici-types": { + "version": "7.16.0", + "license": "MIT" }, - "client/node_modules/multicast-dns": { - "version": "7.2.5", + "client/node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">=4" } }, - "client/node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "client/node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=4" } }, - "client/node_modules/natural-compare-lite": { - "version": "1.4.0", - "license": "MIT" - }, - "client/node_modules/negotiator": { - "version": "0.6.4", + "client/node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "client/node_modules/node-forge": { - "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" + "node": ">=4" } }, - "client/node_modules/normalize-range": { - "version": "0.1.2", + "client/node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "client/node_modules/normalize-url": { - "version": "6.1.0", + "client/node_modules/unicorn-magic": { + "version": "0.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/nth-check": { - "version": "2.1.1", - "license": "BSD-2-Clause", + "client/node_modules/unique-string": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "crypto-random-string": "^2.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=8" } }, - "client/node_modules/nwsapi": { - "version": "2.2.22", - "license": "MIT" + "client/node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } }, - "client/node_modules/object-hash": { - "version": "3.0.0", + "client/node_modules/unpipe": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "client/node_modules/object-keys": { + "client/node_modules/unquote": { "version": "1.1.1", + "license": "MIT" + }, + "client/node_modules/upath": { + "version": "1.2.0", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=4", + "yarn": "*" } }, - "client/node_modules/object.assign": { - "version": "4.1.7", + "client/node_modules/update-browserslist-db": { + "version": "1.1.4", + "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": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "update-browserslist-db": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "client/node_modules/object.entries": { - "version": "1.1.9", + "client/node_modules/upper-case-first": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "tslib": "^2.0.3" } }, - "client/node_modules/object.fromentries": { - "version": "2.0.8", - "license": "MIT", + "client/node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "punycode": "^2.1.0" } }, - "client/node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", + "client/node_modules/url-parse": { + "version": "1.5.10", "license": "MIT", "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.8" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "client/node_modules/use-sync-external-store": { + "version": "1.6.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "client/node_modules/util-arity": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "client/node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "client/node_modules/util.promisify": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/object.groupby": { - "version": "1.0.3", + "client/node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "client/node_modules/utils-merge": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4.0" } }, - "client/node_modules/object.values": { - "version": "1.2.1", + "client/node_modules/uuid": { + "version": "8.3.2", "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "client/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "client/node_modules/obuf": { + "client/node_modules/vary": { "version": "1.1.2", - "license": "MIT" - }, - "client/node_modules/on-finished": { - "version": "2.4.1", "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { "node": ">= 0.8" } }, - "client/node_modules/on-headers": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "client/node_modules/victory-vendor": { + "version": "37.3.6", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" } }, - "client/node_modules/open": { - "version": "8.4.2", + "client/node_modules/w3c-hr-time": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "browser-process-hrtime": "^1.0.0" } }, - "client/node_modules/optionator": { - "version": "0.9.4", + "client/node_modules/w3c-xmlserializer": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "xml-name-validator": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "client/node_modules/own-keys": { - "version": "1.0.1", - "license": "MIT", + "client/node_modules/walker": { + "version": "1.0.8", + "license": "Apache-2.0", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "makeerror": "1.0.12" } }, - "client/node_modules/p-retry": { - "version": "4.6.2", + "client/node_modules/watchpack": { + "version": "2.4.4", "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "client/node_modules/param-case": { - "version": "3.0.4", + "client/node_modules/wbuf": { + "version": "1.7.3", "license": "MIT", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "minimalistic-assert": "^1.0.0" } }, - "client/node_modules/parse5": { - "version": "6.0.1", - "license": "MIT" + "client/node_modules/webdriver-bidi-protocol": { + "version": "0.3.8", + "dev": true, + "license": "Apache-2.0" }, - "client/node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", + "client/node_modules/webidl-conversions": { + "version": "6.1.0", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8" + "node": ">=10.4" } }, - "client/node_modules/pascal-case": { - "version": "3.1.2", + "client/node_modules/webpack": { + "version": "5.102.1", "license": "MIT", + "peer": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "client/node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "client/node_modules/path-scurry": { - "version": "1.11.1", - "license": "BlueOak-1.0.0", + "client/node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "client/node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "license": "ISC" - }, - "client/node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, - "client/node_modules/path-type": { - "version": "4.0.0", + "client/node_modules/webpack-dev-server": { + "version": "4.15.2", "license": "MIT", + "peer": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, "engines": { - "node": ">=8" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "client/node_modules/performance-now": { - "version": "2.1.0", - "license": "MIT" - }, - "client/node_modules/picomatch": { - "version": "2.3.1", + "client/node_modules/webpack-manifest-plugin": { + "version": "4.1.1", "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, "engines": { - "node": ">=8.6" + "node": ">=12.22.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" } }, - "client/node_modules/pify": { - "version": "2.3.0", - "license": "MIT", + "client/node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "client/node_modules/pkg-up": { - "version": "3.1.0", + "client/node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", "license": "MIT", "dependencies": { - "find-up": "^3.0.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "client/node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", + "client/node_modules/webpack-sources": { + "version": "3.3.3", "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "client/node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", + "client/node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "client/node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", + "client/node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "client/node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", "dependencies": { - "p-limit": "^2.0.0" + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" }, "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "client/node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", + "client/node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": ">=0.8.0" } }, - "client/node_modules/possible-typed-array-names": { - "version": "1.1.0", + "client/node_modules/whatwg-encoding": { + "version": "1.0.5", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "iconv-lite": "0.4.24" } }, - "client/node_modules/postcss": { - "version": "8.5.6", - "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" - } - ], + "client/node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", "license": "MIT", - "peer": true, "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "client/node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", + "client/node_modules/whatwg-fetch": { + "version": "3.6.20", + "license": "MIT" + }, + "client/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "client/node_modules/whatwg-url": { + "version": "8.7.0", "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=10" } }, - "client/node_modules/postcss-browser-comments": { - "version": "4.0.0", - "license": "CC0-1.0", - "engines": { - "node": ">=8" + "client/node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "client/node_modules/postcss-calc": { - "version": "8.2.4", + "client/node_modules/which-boxed-primitive": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, - "peerDependencies": { - "postcss": "^8.2.2" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/postcss-clamp": { - "version": "4.1.0", + "client/node_modules/which-builtin-type": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=7.6.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.4.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "license": "CC0-1.0", + "client/node_modules/which-collection": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", + "client/node_modules/which-typed-array": { + "version": "1.1.19", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" + "url": "https://github.com/sponsors/ljharb" + } + }, + "client/node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "client/node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "license": "CC0-1.0", + "client/node_modules/workbox-background-sync": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "idb": "^7.0.1", + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-colormin": { - "version": "5.3.1", + "client/node_modules/workbox-broadcast-update": { + "version": "6.6.0", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-convert-values": { - "version": "5.1.3", + "client/node_modules/workbox-build": { + "version": "6.6.0", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10.0.0" } }, - "client/node_modules/postcss-custom-media": { - "version": "8.0.2", + "client/node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=10" }, "peerDependencies": { - "postcss": "^8.3" + "ajv": ">=8" } }, - "client/node_modules/postcss-custom-properties": { - "version": "12.1.11", + "client/node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", "license": "MIT", + "peer": true, "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "client/node_modules/postcss-custom-selectors": { - "version": "6.0.3", + "client/node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">=10" } }, - "client/node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "license": "CC0-1.0", + "client/node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "client/node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "license": "BSD-3-Clause", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "whatwg-url": "^7.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">= 8" } }, - "client/node_modules/postcss-discard-comments": { - "version": "5.1.2", + "client/node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "punycode": "^2.1.0" } }, - "client/node_modules/postcss-discard-duplicates": { - "version": "5.1.0", + "client/node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "client/node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "client/node_modules/postcss-discard-empty": { - "version": "5.1.1", + "client/node_modules/workbox-cacheable-response": { + "version": "6.6.0", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-discard-overridden": { - "version": "5.1.0", + "client/node_modules/workbox-core": { + "version": "6.6.0", + "license": "MIT" + }, + "client/node_modules/workbox-expiration": { + "version": "6.6.0", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "license": "CC0-1.0", + "client/node_modules/workbox-google-analytics": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "client/node_modules/postcss-env-function": { - "version": "4.0.6", - "license": "CC0-1.0", + "client/node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "workbox-core": "6.6.0" + } + }, + "client/node_modules/workbox-precaching": { + "version": "6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "client/node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", + "client/node_modules/workbox-range-requests": { + "version": "6.6.0", "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.4" + "dependencies": { + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-focus-visible": { - "version": "6.0.4", - "license": "CC0-1.0", + "client/node_modules/workbox-recipes": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "client/node_modules/postcss-focus-within": { - "version": "5.0.4", - "license": "CC0-1.0", + "client/node_modules/workbox-routing": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-font-variant": { - "version": "5.0.0", + "client/node_modules/workbox-strategies": { + "version": "6.6.0", "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" + "dependencies": { + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-gap-properties": { - "version": "3.0.5", - "license": "CC0-1.0", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "client/node_modules/workbox-streams": { + "version": "6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" } }, - "client/node_modules/postcss-image-set-function": { - "version": "4.0.7", - "license": "CC0-1.0", + "client/node_modules/workbox-sw": { + "version": "6.6.0", + "license": "MIT" + }, + "client/node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.2" + "webpack": "^4.4.0 || ^5.9.0" } }, - "client/node_modules/postcss-import": { - "version": "15.1.0", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "client/node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "node": ">=0.10.0" } }, - "client/node_modules/postcss-initial": { - "version": "4.0.1", + "client/node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.0" + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, - "client/node_modules/postcss-js": { - "version": "4.1.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "client/node_modules/workbox-window": { + "version": "6.6.0", "license": "MIT", "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" } }, - "client/node_modules/postcss-lab-function": { - "version": "4.2.1", - "license": "CC0-1.0", + "client/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "client/node_modules/postcss-loader": { - "version": "6.2.1", + "client/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "client/node_modules/postcss-logical": { - "version": "5.0.4", - "license": "CC0-1.0", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "client/node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "client/node_modules/write-file-atomic": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "client/node_modules/postcss-media-minmax": { - "version": "5.0.0", + "client/node_modules/ws": { + "version": "8.18.3", "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "client/node_modules/postcss-merge-longhand": { - "version": "5.1.7", + "client/node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "client/node_modules/xmlbuilder": { + "version": "15.1.1", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8.0" } }, - "client/node_modules/postcss-merge-rules": { - "version": "5.1.4", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, + "client/node_modules/xmlchars": { + "version": "2.2.0", + "license": "MIT" + }, + "client/node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "client/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "client/node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 6" } }, - "client/node_modules/postcss-minify-font-values": { - "version": "5.1.0", + "client/node_modules/yargs": { + "version": "17.7.2", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "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": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=12" } }, - "client/node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, + "client/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=12" } }, - "client/node_modules/postcss-minify-params": { - "version": "5.1.4", + "client/node_modules/yauzl": { + "version": "2.10.0", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "client/node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/postcss-minify-selectors": { - "version": "5.2.1", + "client/node_modules/yup": { + "version": "1.7.0", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" } }, - "client/node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "license": "ISC", + "client/node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=12.20" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", + "client/node_modules/zod": { + "version": "3.25.76", + "dev": true, "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "client/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", + "node_modules/@actions/core": { + "version": "1.11.1", + "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" } }, - "client/node_modules/postcss-modules-scope": { - "version": "3.2.1", - "license": "ISC", + "node_modules/@actions/exec": { + "version": "1.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "@actions/io": "^1.0.1" } }, - "client/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", + "node_modules/@actions/http-client": { + "version": "2.2.3", + "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "tunnel": "^0.0.6", + "undici": "^5.25.4" } }, - "client/node_modules/postcss-modules-values": { - "version": "4.0.0", - "license": "ISC", + "node_modules/@actions/io": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-nested": { - "version": "6.2.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-nesting": { - "version": "10.2.0", - "license": "CC0-1.0", + "node_modules/@babel/core": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "@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": "^12 || ^14 || >=16" + "node": ">=6.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "client/node_modules/postcss-normalize": { - "version": "10.0.1", - "license": "CC0-1.0", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" + "url": "https://opencollective.com/babel" } }, - "client/node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "client/node_modules/postcss-normalize-display-values": { - "version": "5.1.0", + "node_modules/@babel/generator": { + "version": "7.28.5", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "@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" } }, - "client/node_modules/postcss-normalize-positions": { - "version": "5.1.1", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@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": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-normalize-string": { - "version": "5.1.0", + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@babel/core": "^7.0.0" } }, - "client/node_modules/postcss-normalize-unicode": { - "version": "5.1.1", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-normalize-url": { - "version": "5.1.0", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "dev": true, "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-ordered-values": { - "version": "5.1.3", + "node_modules/@babel/helpers": { + "version": "7.28.4", + "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "client/node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "license": "CC0-1.0", + "node_modules/@babel/parser": { + "version": "7.28.5", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@babel/types": "^7.28.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=6.0.0" } }, - "client/node_modules/postcss-page-break": { - "version": "3.0.4", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "client/node_modules/postcss-place": { - "version": "7.0.5", - "license": "CC0-1.0", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=6.9.0" }, "peerDependencies": { - "postcss": "^8.2" + "@babel/core": "^7.0.0-0" } }, - "client/node_modules/postcss-preset-env": { - "version": "7.8.3", - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "dev": true, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=6.9.0" } }, - "client/node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "license": "CC0-1.0", + "node_modules/@babel/traverse": { + "version": "7.28.5", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "@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": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=6.9.0" } }, - "client/node_modules/postcss-reduce-initial": { - "version": "5.1.2", + "node_modules/@badeball/cypress-cucumber-preprocessor": { + "version": "24.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/badeball" + } + ], "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "@cucumber/ci-environment": "^12.0.0", + "@cucumber/cucumber": "^12.0.0", + "@cucumber/cucumber-expressions": "^18.0.0", + "@cucumber/gherkin": "^37.0.0", + "@cucumber/html-formatter": "^22.2.0", + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "^31.0.0", + "@cucumber/pretty-formatter": "^1.0.1", + "@cucumber/tag-expressions": "^8.0.0", + "@jridgewell/trace-mapping": "^0.3.31", + "base64-js": "^1.5.1", + "chalk": "^4.1.2", + "cli-table": "^0.3.11", + "common-ancestor-path": "^2.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.3.6", + "error-stack-parser": "^2.1.4", + "find-cypress-specs": "^1.45.2", + "fp-ts": "^2.16.11", + "glob": "^13.0.0", + "io-ts": "^2.2.22", + "mocha": "^11.0.0", + "seedrandom": "^3.0.5", + "split": "^1.0.1", + "uuid": "^13.0.0" + }, + "bin": { + "cucumber-html-formatter": "dist/bin/cucumber-html-formatter.js", + "cucumber-json-formatter": "dist/bin/cucumber-json-formatter.js", + "cucumber-merge-messages": "dist/bin/cucumber-merge-messages.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^20.12.0 || ^21.7.0 || >=22" }, "peerDependencies": { - "postcss": "^8.2.15" + "cypress": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0" } }, - "client/node_modules/postcss-reduce-transforms": { - "version": "5.1.0", + "node_modules/@bahmutov/cypress-esbuild-preprocessor": { + "version": "2.2.8", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "debug": "4.4.3" }, + "peerDependencies": { + "esbuild": ">=0.17.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=0.1.90" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=12" } }, - "client/node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", + "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==", + "devOptional": true, "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "client/node_modules/postcss-selector-not": { - "version": "6.0.1", + "node_modules/@cucumber/ci-environment": { + "version": "12.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cucumber/cucumber": { + "version": "12.4.0", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "@cucumber/ci-environment": "12.0.0", + "@cucumber/cucumber-expressions": "18.0.1", + "@cucumber/gherkin": "37.0.0", + "@cucumber/gherkin-streams": "6.0.0", + "@cucumber/gherkin-utils": "10.0.0", + "@cucumber/html-formatter": "22.2.0", + "@cucumber/junit-xml-formatter": "0.9.0", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "31.0.0", + "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/tag-expressions": "8.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.5", + "commander": "^14.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^13.0.0", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.7.2", + "mime": "^3.0.0", + "mkdirp": "^3.0.0", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-package-up": "^12.0.0", + "semver": "7.7.3", + "string-argv": "0.3.1", + "supports-color": "^8.1.1", + "type-fest": "^4.41.0", + "util-arity": "^1.1.0", + "yaml": "^2.2.2", + "yup": "1.7.1" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "20 || 22 || >=24" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/cucumber" } }, - "client/node_modules/postcss-selector-parser": { - "version": "6.1.2", + "node_modules/@cucumber/cucumber-expressions": { + "version": "18.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "37.0.0", + "dev": true, "license": "MIT", "peer": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "@cucumber/messages": ">=31.0.0 <32" } }, - "client/node_modules/postcss-svgo": { - "version": "5.1.0", + "node_modules/@cucumber/gherkin-streams": { + "version": "6.0.0", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "commander": "14.0.0", + "source-map-support": "0.5.21" }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "gherkin-javascript": "bin/gherkin" }, "peerDependencies": { - "postcss": "^8.2.15" + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" } }, - "client/node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", + "node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "14.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=20" } }, - "client/node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", + "node_modules/@cucumber/gherkin-utils": { + "version": "10.0.0", + "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "@cucumber/gherkin": "^34.0.0", + "@cucumber/messages": "^29.0.0", + "@teppeis/multimaps": "3.0.0", + "commander": "14.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "gherkin-utils": "bin/gherkin-utils" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { + "version": "34.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <29" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { + "version": "28.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "11.1.0" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "29.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/commander": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/uuid": { + "version": "11.1.0", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "22.2.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/@cucumber/junit-xml-formatter": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/query": "^14.0.1", + "@teppeis/multimaps": "^3.0.0", + "luxon": "^3.5.0", + "xmlbuilder": "^15.1.1" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "@cucumber/messages": "*" } }, - "client/node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "license": "CC0-1.0" + "node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } }, - "client/node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/@cucumber/messages": { + "version": "31.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" } }, - "client/node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", + "node_modules/@cucumber/pretty-formatter": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" } }, - "client/node_modules/postcss-unique-selectors": { - "version": "5.1.1", + "node_modules/@cucumber/query": { + "version": "14.7.0", + "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@teppeis/multimaps": "3.0.0", + "lodash.sortby": "^4.7.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@cucumber/messages": "*" } }, - "client/node_modules/postcss-value-parser": { - "version": "4.2.0", + "node_modules/@cucumber/tag-expressions": { + "version": "8.1.0", + "dev": true, "license": "MIT" }, - "client/node_modules/prelude-ls": { - "version": "1.2.1", - "license": "MIT", + "node_modules/@cypress/request": { + "version": "3.0.9", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.4", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.14.0", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "client/node_modules/pretty-bytes": { - "version": "5.6.0", + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "uuid": "dist/bin/uuid" } }, - "client/node_modules/pretty-error": { - "version": "4.0.0", + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "debug": "^3.1.0", + "lodash.once": "^4.1.1" } }, - "client/node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "client/node_modules/promise": { - "version": "8.3.0", + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", "dependencies": { - "asap": "~2.0.6" + "ms": "^2.1.1" } }, - "client/node_modules/prompts": { - "version": "2.4.2", + "node_modules/@dependents/detective-less": { + "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">= 6" - } - }, - "client/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": ">=18" } }, - "client/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "dev": true, "license": "MIT" }, - "client/node_modules/proxy-addr": { - "version": "2.0.7", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.10" + "node": ">=18" } }, - "client/node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", + "node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.10" - } - }, - "client/node_modules/psl": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" + "node": ">=18" } }, - "client/node_modules/punycode": { - "version": "2.3.1", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "client/node_modules/q": { - "version": "1.5.1", + "node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": ">=18" } }, - "client/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "client/node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, - "client/node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" ], - "license": "MIT" - }, - "client/node_modules/raf": { - "version": "3.4.1", "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "client/node_modules/randombytes": { - "version": "2.1.0", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "client/node_modules/range-parser": { - "version": "1.2.1", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "client/node_modules/raw-body": { - "version": "2.5.2", + "node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "client/node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "client/node_modules/react-app-polyfill": { - "version": "3.0.0", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" + "node": ">=18" } }, - "client/node_modules/react-dev-utils": { - "version": "12.0.1", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" + "node": ">=18" } }, - "client/node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "client/node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12.13.0" + "node": ">=18" } }, - "client/node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "client/node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "client/node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", + "node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "client/node_modules/react-error-overlay": { - "version": "6.1.0", - "license": "MIT" - }, - "client/node_modules/react-refresh": { - "version": "0.11.0", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "client/node_modules/react-scripts": { - "version": "5.0.1", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "client/node_modules/read-cache": { - "version": "1.0.0", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "pify": "^2.3.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "client/node_modules/readdirp": { - "version": "3.6.0", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8.10.0" + "node": ">=18" } }, - "client/node_modules/recursive-readdir": { - "version": "2.2.3", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "client/node_modules/reflect.getprototypeof": { - "version": "1.0.10", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "client/node_modules/regenerate": { - "version": "1.4.2", - "license": "MIT" - }, - "client/node_modules/regenerate-unicode-properties": { - "version": "10.2.2", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "client/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, - "client/node_modules/regex-parser": { - "version": "2.3.1", - "license": "MIT" - }, - "client/node_modules/regexp.prototype.flags": { - "version": "1.5.4", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "client/node_modules/regexpu-core": { - "version": "6.4.0", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "client/node_modules/regjsgen": { - "version": "0.8.0", - "license": "MIT" - }, - "client/node_modules/regjsparser": { - "version": "0.13.0", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" } }, - "client/node_modules/relateurl": { - "version": "0.2.7", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": "20 || >=22" } }, - "client/node_modules/renderkid": { - "version": "3.0.0", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, - "client/node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "client/node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, - "client/node_modules/resolve": { - "version": "1.22.11", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "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" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "client/node_modules/resolve-url-loader": { - "version": "4.0.0", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, "license": "MIT", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, "license": "MIT" }, - "client/node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "license": "ISC" + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "client/node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "client/node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "client/node_modules/resolve.exports": { - "version": "1.1.1", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "client/node_modules/retry": { - "version": "0.13.1", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "client/node_modules/reusify": { - "version": "1.1.0", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "devOptional": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "client/node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "client/node_modules/rollup": { - "version": "2.79.2", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, "license": "MIT", - "peer": true, - "bin": { - "rollup": "dist/bin/rollup" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 8" } }, - "client/node_modules/rollup-plugin-terser": { - "version": "7.0.2", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" + "engines": { + "node": ">= 8" } }, - "client/node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8" } }, - "client/node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "license": "BSD-3-Clause", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@teppeis/multimaps": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "devOptional": 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==", + "devOptional": 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==", + "devOptional": 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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.2", + "devOptional": true, + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "undici-types": "~7.16.0" } }, - "client/node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "queue-microtask": "^1.2.2" + "@types/node": "*" } }, - "client/node_modules/safe-array-concat": { - "version": "1.1.3", + "node_modules/@typescript-eslint/project-service": { + "version": "8.49.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" + "@typescript-eslint/tsconfig-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "client/node_modules/safe-push-apply": { - "version": "1.0.0", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.49.0", + "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "client/node_modules/safe-regex-test": { - "version": "1.1.0", + "node_modules/@typescript-eslint/types": { + "version": "8.49.0", + "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "client/node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "client/node_modules/sanitize.css": { - "version": "13.0.0", - "license": "CC0-1.0" - }, - "client/node_modules/sass-loader": { - "version": "12.6.0", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.49.0", + "dev": true, "license": "MIT", "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" + "@typescript-eslint/project-service": "8.49.0", + "@typescript-eslint/tsconfig-utils": "8.49.0", + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/visitor-keys": "8.49.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "typescript": ">=4.8.4 <6.0.0" } }, - "client/node_modules/sax": { - "version": "1.2.4", - "license": "ISC" - }, - "client/node_modules/saxes": { - "version": "5.0.1", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, "license": "ISC", "dependencies": { - "xmlchars": "^2.2.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/schema-utils": { - "version": "4.3.3", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.49.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@typescript-eslint/types": "8.49.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 10.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" } }, - "client/node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "client/node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" } }, - "client/node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "client/node_modules/select-hose": { - "version": "2.0.0", - "license": "MIT" + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } }, - "client/node_modules/selfsigned": { - "version": "2.4.1", + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "dev": true, "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" } }, - "client/node_modules/semver": { - "version": "7.7.3", - "license": "ISC", + "node_modules/@vue/shared": { + "version": "3.5.25", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "devOptional": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "client/node_modules/send": { - "version": "0.19.0", + "node_modules/acorn-walk": { + "version": "8.3.4", + "devOptional": true, "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" + "acorn": "^8.11.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.4.0" } }, - "client/node_modules/send/node_modules/debug": { - "version": "2.6.9", + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "client/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "client/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "client/node_modules/serialize-javascript": { - "version": "6.0.2", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">=6" } }, - "client/node_modules/serve-index": { - "version": "1.9.1", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", + "node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "client/node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", + "node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "license": "ISC" - }, - "client/node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", + "node_modules/any-promise": { + "version": "1.3.0", + "dev": true, "license": "MIT" }, - "client/node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "license": "ISC" + "node_modules/app-module-path": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause" }, - "client/node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/arch": { + "version": "2.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "client/node_modules/serve-static": { - "version": "1.16.2", - "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/arg": { + "version": "5.0.2", + "dev": true, + "license": "MIT" }, - "client/node_modules/set-function-length": { - "version": "1.2.2", + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/set-function-name": { - "version": "2.0.2", + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "safer-buffer": "~2.1.0" } }, - "client/node_modules/set-proto": { + "node_modules/assert-plus": { "version": "1.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.8" } }, - "client/node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "client/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "client/node_modules/sisteransi": { - "version": "1.0.5", - "license": "MIT" - }, - "client/node_modules/sockjs": { - "version": "0.3.24", + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" } }, - "client/node_modules/source-list-map": { - "version": "2.0.1", - "license": "MIT" + "node_modules/ast-module-types": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "client/node_modules/source-map": { - "version": "0.7.6", - "license": "BSD-3-Clause", + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=8" } }, - "client/node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "client/node_modules/source-map-loader": { - "version": "3.0.2", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/sourcemap-codec": { - "version": "1.4.8", + "node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "dev": true, "license": "MIT" }, - "client/node_modules/spdy": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "client/node_modules/spdy-transport": { - "version": "3.0.0", - "license": "MIT", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "tweetnacl": "^0.14.3" } }, - "client/node_modules/stable": { - "version": "0.1.8", + "node_modules/blob-util": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, "license": "MIT" }, - "client/node_modules/static-eval": { + "node_modules/brace-expansion": { "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "escodegen": "^1.8.1" - } - }, - "client/node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "client/node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "balanced-match": "^1.0.0" } }, - "client/node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", + "node_modules/braces": { + "version": "3.0.3", + "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "client/node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.28.1", + "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", + "peer": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">= 0.8.0" - } - }, - "client/node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "client/node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "client/node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "client/node_modules/statuses": { - "version": "2.0.1", + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/cachedir": { + "version": "2.4.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "client/node_modules/stop-iteration-iterator": { - "version": "1.1.0", + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/string-natural-compare": { - "version": "3.0.1", - "license": "MIT" - }, - "client/node_modules/string.prototype.includes": { - "version": "2.0.1", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, - "client/node_modules/string.prototype.matchall": { - "version": "4.0.12", + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -10718,4669 +19497,4659 @@ "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/string.prototype.repeat": { - "version": "1.0.0", + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "engines": { + "node": ">=6" } }, - "client/node_modules/string.prototype.trim": { - "version": "1.2.10", + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/string.prototype.trimend": { - "version": "1.0.9", + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "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/capital-case": { + "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "client/node_modules/string.prototype.trimstart": { - "version": "1.0.8", + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "client/node_modules/stringify-object": { - "version": "3.3.0", - "license": "BSD-2-Clause", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "client/node_modules/strip-comments": { - "version": "2.0.1", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "client/node_modules/style-loader": { - "version": "3.3.4", + "node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=8" } }, - "client/node_modules/stylehacks": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, + "node_modules/class-transformer": { + "version": "0.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6" } }, - "client/node_modules/sucrase": { - "version": "3.35.0", + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "client/node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "license": "MIT", + "node_modules/cli-table": { + "version": "0.3.11", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" } }, - "client/node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", + "node_modules/cli-table3": { + "version": "0.6.5", + "dev": true, "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, "engines": { - "node": ">= 6" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "client/node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "license": "ISC", + "node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "client/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "client/node_modules/supports-hyperlinks": { - "version": "2.3.0", + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "client/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "node_modules/commander": { + "version": "14.0.2", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=20" } }, - "client/node_modules/svg-parser": { - "version": "2.0.4", - "license": "MIT" + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } }, - "client/node_modules/svgo": { - "version": "1.3.2", + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, "engines": { "node": ">=4.0.0" } }, - "client/node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "8.2.2", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">=4" + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "client/node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", + "node_modules/console.table": { + "version": "0.10.0", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "easy-table": "1.1.0" }, "engines": { - "node": ">=4" + "node": "> 0.10" } }, - "client/node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "client/node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", + "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==", + "devOptional": true, "license": "MIT" }, - "client/node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "license": "BSD-2-Clause", + "node_modules/cross-env": { + "version": "10.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "client/node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=20" } }, - "client/node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "client/node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "license": "BSD-2-Clause", + "node_modules/cypress": { + "version": "15.7.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "@cypress/request": "^3.0.9", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "@types/tmp": "^0.2.3", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "ci-info": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-table3": "0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "hasha": "5.2.2", + "is-installed-globally": "~0.4.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "systeminformation": "5.27.7", + "tmp": "~0.2.4", + "tree-kill": "1.2.2", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^20.1.0 || ^22.0.0 || >=24.0.0" } }, - "client/node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "license": "BSD-2-Clause" + "node_modules/cypress/node_modules/cli-table3": { + "version": "0.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } }, - "client/node_modules/svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/cypress/node_modules/colors": { + "version": "1.4.0", + "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=0.8.0" + "node": ">=0.1.90" } }, - "client/node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/cypress/node_modules/commander": { + "version": "6.2.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 6" } }, - "client/node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "license": "BSD-2-Clause", + "node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "~1.0.0" + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "client/node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/date-fns": { + "version": "2.30.0", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">=4" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "client/node_modules/symbol-tree": { - "version": "3.2.4", + "node_modules/dayjs": { + "version": "1.11.19", + "dev": true, "license": "MIT" }, - "client/node_modules/tailwindcss": { - "version": "3.4.18", + "node_modules/debug": { + "version": "4.4.3", + "dev": true, "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "ms": "^2.1.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "client/node_modules/tailwindcss/node_modules/lilconfig": { - "version": "3.1.3", + "node_modules/decamelize": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "6.0.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/tapable": { - "version": "2.3.0", + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "optional": true, + "dependencies": { + "clone": "^1.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/temp-dir": { - "version": "2.0.0", + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/tempy": { - "version": "0.6.0", + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, "license": "MIT", "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "license": "(MIT OR CC0-1.0)", + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.4.0" + } + }, + "node_modules/dependency-tree": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^12.1.0", + "filing-cabinet": "^5.0.3", + "precinct": "^12.2.0", + "typescript": "^5.8.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "dependency-tree": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/dependency-tree/node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-amd": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-module-types": "^6.0.1", + "escodegen": "^2.1.0", + "get-amd-module-type": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "client/node_modules/terminal-link": { - "version": "2.1.1", + "node_modules/detective-cjs": { + "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "client/node_modules/terser": { - "version": "5.44.1", - "license": "BSD-2-Clause", + "node_modules/detective-es6": { + "version": "5.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "client/node_modules/terser-webpack-plugin": { - "version": "5.3.14", + "node_modules/detective-postcss": { + "version": "7.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^14.0.0 || >=16.0.0" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "postcss": "^8.4.47" } }, - "client/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "client/node_modules/text-table": { - "version": "0.2.0", - "license": "MIT" - }, - "client/node_modules/throat": { - "version": "6.0.2", - "license": "MIT" + "node_modules/detective-sass": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } }, - "client/node_modules/thunky": { - "version": "1.1.0", - "license": "MIT" + "node_modules/detective-scss": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } }, - "client/node_modules/toidentifier": { - "version": "1.0.1", + "node_modules/detective-stylus": { + "version": "5.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=18" } }, - "client/node_modules/tough-cookie": { - "version": "4.1.4", - "license": "BSD-3-Clause", + "node_modules/detective-typescript": { + "version": "14.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "@typescript-eslint/typescript-estree": "^8.23.0", + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" } }, - "client/node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", + "node_modules/detective-vue2": { + "version": "2.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@dependents/detective-less": "^5.0.1", + "@vue/compiler-sfc": "^3.5.13", + "detective-es6": "^5.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" } }, - "client/node_modules/tr46": { - "version": "2.1.0", + "node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "client/node_modules/tryer": { - "version": "1.0.1", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, "license": "MIT" }, - "client/node_modules/ts-interface-checker": { - "version": "0.1.13", - "license": "Apache-2.0" - }, - "client/node_modules/tsconfig-paths": { - "version": "3.15.0", + "node_modules/easy-table": { + "version": "1.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "optionalDependencies": { + "wcwidth": ">=1.0.1" } }, - "client/node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "client/node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "once": "^1.4.0" } }, - "client/node_modules/tsutils": { - "version": "3.21.0", + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^1.8.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=10.13.0" } }, - "client/node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "client/node_modules/type-check": { - "version": "0.4.0", + "node_modules/enquirer": { + "version": "2.4.1", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "prelude-ls": "^1.2.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.6" } }, - "client/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "peer": true, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "client/node_modules/typed-array-buffer": { - "version": "1.0.3", + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "client/node_modules/typed-array-byte-length": { - "version": "1.0.3", + "node_modules/es-errors": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/typed-array-byte-offset": { - "version": "1.0.4", + "node_modules/es-object-atoms": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/typed-array-length": { - "version": "1.0.7", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "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.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, - "client/node_modules/typedarray-to-buffer": { - "version": "3.1.5", + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" + "engines": { + "node": ">=6" } }, - "client/node_modules/unbox-primitive": { - "version": "1.1.0", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "client/node_modules/underscore": { - "version": "1.12.1", - "license": "MIT" - }, - "client/node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "license": "MIT", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "client/node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "client/node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "license": "MIT", + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=4" + "node": ">=4.0" } }, - "client/node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "license": "MIT", + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "client/node_modules/unique-string": { - "version": "2.0.0", + "node_modules/eventemitter2": { + "version": "6.4.7", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { - "crypto-random-string": "^2.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "client/node_modules/universalify": { - "version": "2.0.1", + "node_modules/executable": { + "version": "4.1.1", + "dev": true, "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=4" } }, - "client/node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, "engines": { - "node": ">= 0.8" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "client/node_modules/unquote": { - "version": "1.1.1", + "node_modules/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT" }, - "client/node_modules/upath": { - "version": "1.2.0", + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=8.6.0" } }, - "client/node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", "dependencies": { - "punycode": "^2.1.0" + "reusify": "^1.0.4" } }, - "client/node_modules/url-parse": { - "version": "1.5.10", + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "pend": "~1.2.0" } }, - "client/node_modules/util.promisify": { - "version": "1.0.1", + "node_modules/figures": { + "version": "3.2.0", + "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" + "escape-string-regexp": "^1.0.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "client/node_modules/utila": { - "version": "0.4.0", - "license": "MIT" - }, - "client/node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/uuid": { - "version": "8.3.2", + "node_modules/filing-cabinet": { + "version": "5.0.3", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "client/node_modules/v8-to-istanbul": { - "version": "8.1.1", - "license": "ISC", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "app-module-path": "^2.2.0", + "commander": "^12.1.0", + "enhanced-resolve": "^5.18.0", + "module-definition": "^6.0.1", + "module-lookup-amd": "^9.0.3", + "resolve": "^1.22.10", + "resolve-dependency-path": "^4.0.1", + "sass-lookup": "^6.1.0", + "stylus-lookup": "^6.1.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3" + }, + "bin": { + "filing-cabinet": "bin/cli.js" }, "engines": { - "node": ">=10.12.0" + "node": ">=18" } }, - "client/node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "client/node_modules/vary": { - "version": "1.1.2", + "node_modules/filing-cabinet/node_modules/commander": { + "version": "12.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "client/node_modules/w3c-hr-time": { - "version": "1.0.2", + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, "license": "MIT", "dependencies": { - "browser-process-hrtime": "^1.0.0" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "client/node_modules/w3c-xmlserializer": { - "version": "2.0.0", + "node_modules/find-cypress-specs": { + "version": "1.54.8", + "dev": true, "license": "MIT", "dependencies": { - "xml-name-validator": "^3.0.0" + "@actions/core": "^1.10.0", + "arg": "^5.0.1", + "console.table": "^0.10.0", + "debug": "^4.3.3", + "find-test-names": "1.29.19", + "minimatch": "^5.1.4", + "pluralize": "^8.0.0", + "require-and-forget": "^1.0.1", + "shelljs": "^0.10.0", + "spec-change": "^1.11.17", + "tinyglobby": "^0.2.15", + "tsx": "^4.19.3" + }, + "bin": { + "find-cypress-specs": "bin/find.js" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "client/node_modules/watchpack": { - "version": "2.4.4", + "node_modules/find-test-names": { + "version": "1.29.19", + "dev": true, "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "@babel/parser": "^7.27.2", + "@babel/plugin-syntax-jsx": "^7.27.1", + "acorn-walk": "^8.2.0", + "debug": "^4.3.3", + "simple-bin-help": "^1.8.0", + "tinyglobby": "^0.2.13" }, - "engines": { - "node": ">=10.13.0" + "bin": { + "find-test-names": "bin/find-test-names.js", + "print-tests": "bin/print-tests.js", + "update-test-count": "bin/update-test-count.js" } }, - "client/node_modules/wbuf": { - "version": "1.7.3", + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "client/node_modules/webidl-conversions": { - "version": "6.1.0", - "license": "BSD-2-Clause", + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=10.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/webpack": { - "version": "5.102.1", + "node_modules/find-up-simple": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.26.3", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, "engines": { - "node": ">=10.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/webpack-dev-middleware": { - "version": "5.3.4", + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "is-callable": "^1.2.7" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/webpack-dev-server": { - "version": "4.15.2", - "license": "MIT", - "peer": true, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "license": "MIT", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">=14" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/webpack-manifest-plugin": { - "version": "4.1.1", + "node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.5", "license": "MIT", "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" + "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": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" + "node": ">= 6" } }, - "client/node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "node_modules/fp-ts": { + "version": "2.16.11", + "dev": true, + "license": "MIT", + "peer": true }, - "client/node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", + "node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, "license": "MIT", "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=10" } }, - "client/node_modules/webpack-sources": { - "version": "3.3.3", + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", - "engines": { - "node": ">=10.13.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=6.9.0" } }, - "client/node_modules/websocket-driver": { - "version": "0.7.4", - "license": "Apache-2.0", + "node_modules/get-amd-module-type": { + "version": "6.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "client/node_modules/websocket-extensions": { - "version": "0.1.4", - "license": "Apache-2.0", + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.8.0" - } - }, - "client/node_modules/whatwg-encoding": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" + "node": "6.* || 8.* || >= 10.*" } }, - "client/node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", + "node_modules/get-intrinsic": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "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.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/whatwg-fetch": { - "version": "3.6.20", - "license": "MIT" - }, - "client/node_modules/whatwg-mimetype": { - "version": "2.3.0", - "license": "MIT" + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "dev": true, + "license": "ISC" }, - "client/node_modules/whatwg-url": { - "version": "8.7.0", + "node_modules/get-proto": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "client/node_modules/which-boxed-primitive": { - "version": "1.1.1", + "node_modules/get-stream": { + "version": "5.2.0", + "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" + "pump": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/which-builtin-type": { - "version": "1.2.1", + "node_modules/get-tsconfig": { + "version": "4.13.0", + "devOptional": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "client/node_modules/which-collection": { - "version": "1.0.2", + "node_modules/getpass": { + "version": "0.1.7", + "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "13.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/which-typed-array": { - "version": "1.1.19", - "license": "MIT", + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "client/node_modules/word-wrap": { - "version": "1.2.5", - "license": "MIT", + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "client/node_modules/workbox-background-sync": { - "version": "6.6.0", + "node_modules/global-dirs": { + "version": "3.0.1", + "dev": true, "license": "MIT", "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/workbox-broadcast-update": { - "version": "6.6.0", + "node_modules/gonzales-pe": { + "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" } }, - "client/node_modules/workbox-build": { - "version": "6.6.0", + "node_modules/gopd": { + "version": "1.2.0", "license": "MIT", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/has-ansi": { + "version": "4.0.1", + "dev": true, "license": "MIT", "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" + "node": ">=8" } }, - "client/node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "client/node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "license": "BSD-3-Clause", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "whatwg-url": "^7.0.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", + "node_modules/hasha": { + "version": "5.2.2", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "license": "BSD-2-Clause" + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } }, - "client/node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", + "node_modules/hasown": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "client/node_modules/workbox-cacheable-response": { - "version": "6.6.0", + "node_modules/he": { + "version": "1.2.0", + "dev": true, "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "workbox-core": "6.6.0" + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "client/node_modules/workbox-core": { - "version": "6.6.0", - "license": "MIT" + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.4", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, - "client/node_modules/workbox-expiration": { - "version": "6.6.0", + "node_modules/http-signature": { + "version": "1.4.0", + "dev": true, "license": "MIT", "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" } }, - "client/node_modules/workbox-google-analytics": { - "version": "6.6.0", - "license": "MIT", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "node_modules/human-signals": { + "version": "1.1.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" } }, - "client/node_modules/workbox-navigation-preload": { - "version": "6.6.0", + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/workbox-precaching": { - "version": "6.6.0", + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "engines": { + "node": ">=8" } }, - "client/node_modules/workbox-range-requests": { - "version": "6.6.0", + "node_modules/index-to-position": { + "version": "1.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "client/node_modules/workbox-recipes": { - "version": "6.6.0", - "license": "MIT", + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "client/node_modules/workbox-routing": { - "version": "6.6.0", - "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0" + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" } }, - "client/node_modules/workbox-strategies": { - "version": "6.6.0", + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, - "client/node_modules/workbox-streams": { - "version": "6.6.0", + "node_modules/io-ts": { + "version": "2.2.22", + "dev": true, "license": "MIT", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" + "peerDependencies": { + "fp-ts": "^2.5.0" } }, - "client/node_modules/workbox-sw": { - "version": "6.6.0", - "license": "MIT" - }, - "client/node_modules/workbox-webpack-plugin": { - "version": "6.6.0", + "node_modules/is-arguments": { + "version": "1.2.0", + "dev": true, "license": "MIT", "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "client/node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, "license": "MIT", "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/workbox-window": { - "version": "6.6.0", + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/write-file-atomic": { - "version": "3.0.3", - "license": "ISC", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/ws": { - "version": "7.5.10", + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/xml-name-validator": { - "version": "3.0.0", - "license": "Apache-2.0" - }, - "client/node_modules/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "client/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/yargs": { - "version": "16.2.0", + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "client/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, - "license": "MIT" - }, - "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==", "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": ">=8" } }, - "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==", + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.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==", + "node_modules/is-installed-globally": { + "version": "0.4.0", + "dev": true, "license": "MIT", - "peer": true, "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" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "node_modules/is-map": { + "version": "2.0.3", + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/generator/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==", + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=0.12.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==", + "node_modules/is-number-object": { + "version": "1.1.1", + "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" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/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==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/is-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "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==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "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==", + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-regexp": { + "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.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==", + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "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==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/is-url": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/is-url-superb": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "MIT", + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@isaacs/cliui": "^8.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.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==", + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "argparse": "^2.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "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==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "bin": { + "json5": "lib/cli.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6" } }, - "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==", + "node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "universalify": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "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==", + "node_modules/jsprim": { + "version": "2.0.2", + "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.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==", - "license": "MIT", + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "seed-random": "~2.2.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==", + "node_modules/lazy-ass": { + "version": "2.0.3", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "> 0.8" } }, - "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==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "3.14.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "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==", + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/log-update": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "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==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "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" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "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==", + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.0.3" } }, - "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==", - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/lru-cache": { + "version": "5.1.1", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "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==", - "devOptional": true, + "node_modules/luxon": { + "version": "3.7.2", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, "engines": { "node": ">=12" } }, - "node_modules/@cucumber/ci-environment": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.1.tgz", - "integrity": "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cucumber/cucumber": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-12.2.0.tgz", - "integrity": "sha512-b7W4snvXYi1T2puUjxamASCCNhNzVSzb/fQUuGSkdjm/AFfJ24jo8kOHQyOcaoArCG71sVQci4vkZaITzl/V1w==", + "node_modules/magic-string": { + "version": "0.30.21", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@cucumber/ci-environment": "10.0.1", - "@cucumber/cucumber-expressions": "18.0.1", - "@cucumber/gherkin": "34.0.0", - "@cucumber/gherkin-streams": "5.0.1", - "@cucumber/gherkin-utils": "9.2.0", - "@cucumber/html-formatter": "21.14.0", - "@cucumber/junit-xml-formatter": "0.8.1", - "@cucumber/message-streams": "4.0.1", - "@cucumber/messages": "28.1.0", - "@cucumber/pretty-formatter": "1.0.1", - "@cucumber/tag-expressions": "6.2.0", - "assertion-error-formatter": "^3.0.0", - "capital-case": "^1.0.4", - "chalk": "^4.1.2", - "cli-table3": "0.6.5", - "commander": "^14.0.0", - "debug": "^4.3.4", - "error-stack-parser": "^2.1.4", - "figures": "^3.2.0", - "glob": "^11.0.0", - "has-ansi": "^4.0.1", - "indent-string": "^4.0.0", - "is-installed-globally": "^0.4.0", - "is-stream": "^2.0.0", - "knuth-shuffle-seeded": "^1.0.6", - "lodash.merge": "^4.6.2", - "lodash.mergewith": "^4.6.2", - "luxon": "3.7.1", - "mime": "^3.0.0", - "mkdirp": "^3.0.0", - "mz": "^2.7.0", - "progress": "^2.0.3", - "read-package-up": "^11.0.0", - "semver": "7.7.2", - "string-argv": "0.3.1", - "supports-color": "^8.1.1", - "type-fest": "^4.41.0", - "util-arity": "^1.1.0", - "yaml": "^2.2.2", - "yup": "1.7.0" - }, - "bin": { - "cucumber-js": "bin/cucumber.js" - }, + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", "engines": { - "node": "20 || 22 || >=24" - }, - "funding": { - "url": "https://opencollective.com/cucumber" + "node": ">= 0.4" } }, - "node_modules/@cucumber/cucumber-expressions": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-18.0.1.tgz", - "integrity": "sha512-NSid6bI+7UlgMywl5octojY5NXnxR9uq+JisjOrO52VbFsQM6gTWuQFE8syI10KnIBEdPzuEUSVEeZ0VFzRnZA==", + "node_modules/merge-stream": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "regexp-match-indices": "1.0.2" - } + "license": "MIT" }, - "node_modules/@cucumber/cucumber/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/@cucumber/gherkin": { - "version": "34.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-34.0.0.tgz", - "integrity": "sha512-659CCFsrsyvuBi/Eix1fnhSheMnojSfnBcqJ3IMPNawx7JlrNJDcXYSSdxcUw3n/nG05P+ptCjmiZY3i14p+tA==", + "node_modules/micromatch": { + "version": "4.0.8", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@cucumber/messages": ">=19.1.4 <29" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/@cucumber/gherkin-streams": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", - "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "node_modules/mime": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "commander": "9.1.0", - "source-map-support": "0.5.21" - }, "bin": { - "gherkin-javascript": "bin/gherkin" + "mime": "cli.js" }, - "peerDependencies": { - "@cucumber/gherkin": ">=22.0.0", - "@cucumber/message-streams": ">=4.0.0", - "@cucumber/messages": ">=17.1.1" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@cucumber/gherkin-streams/node_modules/commander": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", - "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">= 0.6" } }, - "node_modules/@cucumber/gherkin-utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-9.2.0.tgz", - "integrity": "sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "@cucumber/gherkin": "^31.0.0", - "@cucumber/messages": "^27.0.0", - "@teppeis/multimaps": "3.0.0", - "commander": "13.1.0", - "source-map-support": "^0.5.21" + "mime-db": "1.52.0" }, - "bin": { - "gherkin-utils": "bin/gherkin-utils" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { - "version": "31.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-31.0.0.tgz", - "integrity": "sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw==", + "node_modules/mimic-fn": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@cucumber/messages": ">=19.1.4 <=26" + "engines": { + "node": ">=6" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz", - "integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==", + "node_modules/minimatch": { + "version": "5.1.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/uuid": "10.0.0", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "10.0.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "node_modules/minimist": { + "version": "1.2.8", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.2.0.tgz", - "integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==", + "node_modules/minipass": { + "version": "7.1.2", "dev": true, - "license": "MIT", - "dependencies": { - "@types/uuid": "10.0.0", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "11.0.5" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "node_modules/mkdirp": { + "version": "3.0.1", "dev": true, "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "node_modules/mocha": { + "version": "11.7.5", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, "bin": { - "uuid": "dist/esm/bin/uuid" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@cucumber/html-formatter": { - "version": "21.14.0", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.14.0.tgz", - "integrity": "sha512-vQqbmQZc0QiN4c+cMCffCItpODJlOlYtPG7pH6We096dBOa7u0ttDMjT6KrMAnQlcln54rHL46r408IFpuznAw==", + "node_modules/mocha/node_modules/diff": { + "version": "7.0.0", "dev": true, - "license": "MIT", - "peerDependencies": { - "@cucumber/messages": ">=18" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "node_modules/@cucumber/junit-xml-formatter": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.8.1.tgz", - "integrity": "sha512-FT1Y96pyd9/ifbE9I7dbkTCjkwEdW9C0MBobUZoKD13c8EnWAt0xl1Yy/v/WZLTk4XfCLte1DATtLx01jt+YiA==", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@cucumber/query": "^13.0.2", - "@teppeis/multimaps": "^3.0.0", - "luxon": "^3.5.0", - "xmlbuilder": "^15.1.1" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@cucumber/messages": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@cucumber/message-streams": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", - "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "node_modules/mocha/node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "@cucumber/messages": ">=17.1.1" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@cucumber/messages": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-28.1.0.tgz", - "integrity": "sha512-2LzZtOwYKNlCuNf31ajkrekoy2M4z0Z1QGiPH40n4gf5t8VOUFb7m1ojtR4LmGvZxBGvJZP8voOmRqDWzBzYKA==", + "node_modules/mocha/node_modules/lru-cache": { + "version": "10.4.3", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/uuid": "10.0.0", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "11.1.0" - } + "license": "ISC" }, - "node_modules/@cucumber/pretty-formatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.1.tgz", - "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^5.0.0", - "cli-table3": "^0.6.0", - "figures": "^3.2.0", - "ts-dedent": "^2.0.0" + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "@cucumber/cucumber": ">=7.0.0", - "@cucumber/messages": "*" - } - }, - "node_modules/@cucumber/pretty-formatter/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" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@cucumber/query": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-13.6.0.tgz", - "integrity": "sha512-tiDneuD5MoWsJ9VKPBmQok31mSX9Ybl+U4wqDoXeZgsXHDURqzM3rnpWVV3bC34y9W6vuFxrlwF/m7HdOxwqRw==", + "node_modules/mocha/node_modules/path-scurry": { + "version": "1.11.1", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@teppeis/multimaps": "3.0.0", - "lodash.sortby": "^4.7.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, - "peerDependencies": { - "@cucumber/messages": "*" + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@cucumber/tag-expressions": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.2.0.tgz", - "integrity": "sha512-KIF0eLcafHbWOuSDWFw0lMmgJOLdDRWjEL1kfXEWrqHmx2119HxVAr35WuEd9z542d3Yyg+XNqSr+81rIKqEdg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "node_modules/module-definition": { + "version": "6.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "module-definition": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "node_modules/module-lookup-amd": { + "version": "9.0.5", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "commander": "^12.1.0", + "glob": "^7.2.3", + "requirejs": "^2.3.7", + "requirejs-config-file": "^4.0.0" + }, + "bin": { + "lookup-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "node_modules/module-lookup-amd/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "node_modules/module-lookup-amd/node_modules/commander": { + "version": "12.1.0", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=18" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "node_modules/module-lookup-amd/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" + "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": "20 || >=22" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/module-lookup-amd/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=12" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/node-source-walk": { + "version": "7.0.1", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/parser": "^7.26.7" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "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==", - "license": "ISC", + "node_modules/normalize-package-data": { + "version": "8.0.0", + "dev": true, + "license": "BSD-2-Clause", "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" + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "path-key": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/console": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "node_modules/object-is": { + "version": "1.1.6", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@jest/core": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "node_modules/object-keys": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/@jest/core/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==", + "node_modules/object.assign": { + "version": "4.1.7", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" } }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "node_modules/onetime": { + "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core/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==", + "node_modules/ospath": { + "version": "1.2.2", "dev": true, "license": "MIT" }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/environment": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "node_modules/p-map": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pad-right": { + "version": "0.2.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "repeat-string": "^1.5.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.10.0" } }, - "node_modules/@jest/fake-timers": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "callsites": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6" } }, - "node_modules/@jest/globals": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "devOptional": true, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/reporters": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/@jest/reporters/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==", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "node_modules/path-parse": { + "version": "1.0.7", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/reporters/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", "dev": true, "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": "20 || >=22" } }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", "dev": true, "license": "ISC" }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/picomatch": { + "version": "2.3.1", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/reporters/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/pify": { + "version": "2.3.0", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "devOptional": true, + "node_modules/pluralize": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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", + "peer": true, "dependencies": { - "@sinclair/typebox": "^0.34.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "node_modules/postcss-values-parser": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "color-name": "^1.1.4", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.2.9" } }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "node_modules/precinct": { + "version": "12.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@dependents/detective-less": "^5.0.1", + "commander": "^12.1.0", + "detective-amd": "^6.0.1", + "detective-cjs": "^6.0.1", + "detective-es6": "^5.0.1", + "detective-postcss": "^7.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0", + "detective-vue2": "^2.2.0", + "module-definition": "^6.0.1", + "node-source-walk": "^7.0.1", + "postcss": "^8.5.1", + "typescript": "^5.7.3" + }, + "bin": { + "precinct": "bin/cli.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18" } }, - "node_modules/@jest/source-map/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==", + "node_modules/precinct/node_modules/commander": { + "version": "12.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=18" } }, - "node_modules/@jest/test-result": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "node_modules/pretty-bytes": { + "version": "5.6.0", "dev": true, "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "node_modules/process": { + "version": "0.11.10", "dev": true, "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.6.0" } }, - "node_modules/@jest/transform": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "node_modules/progress": { + "version": "2.0.3", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.4.0" } }, - "node_modules/@jest/transform/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==", + "node_modules/property-expr": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", - "devOptional": true, - "license": "MIT", + "node_modules/qs": { + "version": "6.14.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "side-channel": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/@jridgewell/gen-mapping/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==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "node_modules/quote-unquote": { + "version": "1.0.0", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "safe-buffer": "^5.1.0" } }, - "node_modules/@jridgewell/remapping/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==", + "node_modules/read-package-up": { + "version": "12.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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==", - "license": "MIT", + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" + }, "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==", - "license": "MIT" - }, - "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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.3.1", "dev": true, - "license": "MIT", - "optional": true, + "license": "(MIT OR CC0-1.0)", "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/read-pkg": { + "version": "10.0.0", "dev": true, "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=16" }, "funding": { - "url": "https://opencollective.com/pkgr" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", - "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "5.3.1", "dev": true, - "license": "Apache-2.0", + "license": "(MIT OR CC0-1.0)", "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.3", - "tar-fs": "^3.1.1", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/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" + "node": ">=20" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", - "devOptional": 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==", + "node_modules/readdirp": { + "version": "4.1.2", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "node_modules/reflect-metadata": { + "version": "0.2.2", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0" + }, + "node_modules/regexp-match-indices": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^3.0.1" + "regexp-tree": "^0.1.11" } }, - "node_modules/@teppeis/multimaps": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-3.0.0.tgz", - "integrity": "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==", + "node_modules/regexp-tree": { + "version": "0.1.27", "dev": true, "license": "MIT", - "engines": { - "node": ">=14" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "node_modules/repeat-string": { + "version": "1.6.1", "dev": true, "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=0.10" } }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "node_modules/request-progress": { + "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } }, - "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "node_modules/require-and-forget": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5" + "debug": "4.3.4" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "node": ">=6" } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "node_modules/require-and-forget/node_modules/debug": { + "version": "4.3.4", "dev": true, "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=6.0" }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "node_modules/require-and-forget/node_modules/ms": { + "version": "2.1.2", "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "devOptional": 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==", - "devOptional": 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==", - "devOptional": 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==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "node_modules/require-directory": { + "version": "2.1.1", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "node_modules/requirejs": { + "version": "2.3.8", "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==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" } }, - "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==", + "node_modules/requirejs-config-file": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "esprima": "^4.0.0", + "stringify-object": "^3.2.1" + }, + "engines": { + "node": ">=10.13.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==", + "node_modules/resolve": { + "version": "1.22.11", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "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/@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==", + "node_modules/resolve-dependency-path": { + "version": "4.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "engines": { + "node": ">=4" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "devOptional": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "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/express": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz", - "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", + "node_modules/restore-cursor": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "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==", - "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==", + "node_modules/rfdc": { + "version": "1.4.1", + "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==", - "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==", + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "queue-microtask": "^1.2.2" } }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "node_modules/rxjs": { + "version": "7.8.2", "dev": true, - "license": "MIT", - "peer": true, + "license": "Apache-2.0", "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" + "tslib": "^2.1.0" } }, - "node_modules/@types/jest/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==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-lookup": { + "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "commander": "^12.1.0", + "enhanced-resolve": "^5.18.0" + }, + "bin": { + "sass-lookup": "bin/cli.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18" } }, - "node_modules/@types/jest/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==", + "node_modules/sass-lookup/node_modules/commander": { + "version": "12.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "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==", + "node_modules/seed-random": { + "version": "2.2.0", "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==", + "node_modules/seedrandom": { + "version": "3.0.5", + "dev": true, "license": "MIT" }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "node_modules/semver": { + "version": "7.7.3", "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "undici-types": "~7.16.0" + "randombytes": "^2.1.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "node_modules/set-function-length": { + "version": "1.2.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/@types/puppeteer": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.7.tgz", - "integrity": "sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==", + "node_modules/set-function-name": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", - "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==", - "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==", + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/shell-quote": { + "version": "1.8.3", + "dev": true, "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "MIT" + "node_modules/shelljs": { + "version": "0.10.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^5.1.1", + "fast-glob": "^3.3.2" + }, + "engines": { + "node": ">=18" + } }, - "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==", + "node_modules/shelljs/node_modules/execa": { + "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" + "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/@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==", + "node_modules/shelljs/node_modules/get-stream": { + "version": "6.0.1", "dev": true, "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "node_modules/shelljs/node_modules/human-signals": { + "version": "2.1.0", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "devOptional": true, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "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/@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==", - "license": "MIT" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "node_modules/side-channel-list": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@types/node": "*" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], + "node_modules/side-channel-map": { + "version": "1.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "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/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], + "node_modules/side-channel-weakmap": { + "version": "1.0.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "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/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "license": "ISC" }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], + "node_modules/simple-bin-help": { + "version": "1.8.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=14.16" + } }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], + "node_modules/slice-ansi": { + "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], + "node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], + "node_modules/source-map-js": { + "version": "1.2.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], + "node_modules/source-map-support": { + "version": "0.5.21", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], + "node_modules/spawn-command": { + "version": "0.0.2", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], + "node_modules/spdx-exceptions": { + "version": "2.5.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "CC-BY-3.0" }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], + "node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], + "node_modules/spdx-license-ids": { + "version": "3.0.22", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "CC0-1.0" }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], + "node_modules/spec-change": { + "version": "1.11.20", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "arg": "^5.0.2", + "debug": "^4.3.4", + "deep-equal": "^2.2.3", + "dependency-tree": "^11.1.1", + "lazy-ass": "^2.0.3", + "tinyglobby": "^0.2.0" + }, + "bin": { + "spec-change": "bin/spec-change.js" + } }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], + "node_modules/split": { + "version": "1.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], + "node_modules/sshpk": { + "version": "1.18.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=14.0.0" + "node": ">=0.10.0" } }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], + "node_modules/stackframe": { + "version": "1.3.4", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], + "node_modules/string-argv": { + "version": "0.3.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=0.6.19" + } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "devOptional": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/stringify-object": { + "version": "3.3.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "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==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/ansi-regex": { + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "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==", + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "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/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "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==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "node_modules/student-manager-client": { + "resolved": "client", + "link": true }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "node_modules/stylus-lookup": { + "version": "6.1.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "commander": "^12.1.0" + }, + "bin": { + "stylus-lookup": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/assertion-error-formatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", - "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "node_modules/stylus-lookup/node_modules/commander": { + "version": "12.1.0", "dev": true, "license": "MIT", - "dependencies": { - "diff": "^4.0.1", - "pad-right": "^0.2.2", - "repeat-string": "^1.6.1" + "engines": { + "node": ">=18" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/supports-color": { + "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/babel-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@jest/transform": "30.2.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "node_modules/systeminformation": { + "version": "5.27.7", "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" + "bin": { + "systeminformation": "lib/cli.js" }, "engines": { - "node": ">=12" + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "node_modules/tagged-tag": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" + "engines": { + "node": ">=20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/teaching-assistant-server": { + "resolved": "server", + "link": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "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" + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-preset-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { - "bare-abort-controller": "*" + "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { - "bare-abort-controller": { + "picomatch": { "optional": true } } }, - "node_modules/bare-fs": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.1.tgz", - "integrity": "sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, + "license": "MIT", + "peer": true, "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" + "node": ">=12" }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "node_modules/tldts": { + "version": "6.1.86", "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "node_modules/tldts-core": { + "version": "6.1.86", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" } }, - "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" + "is-number": "^7.0.0" }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } + "engines": { + "node": ">=8.0" } }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "node_modules/toposort": { + "version": "2.0.2", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "bare-path": "^3.0.0" + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", - "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==", - "license": "Apache-2.0", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "tree-kill": "cli.js" } }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "node_modules/ts-api-utils": { + "version": "2.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/ts-dedent": { + "version": "2.2.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "@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/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "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" - } - ], + "node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" }, "bin": { - "browserslist": "cli.js" + "tsx": "dist/cli.mjs" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "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==", + "node_modules/tunnel": { + "version": "0.0.6", "dev": true, "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, "engines": { - "node": ">= 6" + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "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==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "dev": true, "license": "Apache-2.0", "dependencies": { - "node-int64": "^0.4.0" + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/tweetnacl": { + "version": "0.14.5", "dev": true, - "license": "MIT", + "license": "Unlicense" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "*" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" + "node_modules/typescript": { + "version": "5.9.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10.16.0" + "node": ">=14.17" } }, - "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==", + "node_modules/undici": { + "version": "5.29.0", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0" } }, - "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==", + "node_modules/undici-types": { + "version": "7.16.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 10.0.0" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/untildify": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "dev": true, "funding": [ { "type": "opencollective", @@ -15388,1502 +24157,1426 @@ }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" - }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=10" + "bin": { + "update-browserslist-db": "cli.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/chalk/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==", + "node_modules/upper-case-first": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=10" + "tslib": "^2.0.3" } }, - "node_modules/chromium-bidi": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", - "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", + "node_modules/util-arity": { + "version": "1.1.0", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } + "license": "MIT" }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "devOptional": true, + "node_modules/uuid": { + "version": "13.0.0", + "dev": true, "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "engines": { - "node": ">=8" + "bin": { + "uuid": "dist-node/bin/uuid" } }, - "node_modules/cjs-module-lexer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz", - "integrity": "sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==", - "dev": true, + "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==", + "devOptional": true, "license": "MIT" }, - "node_modules/class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/verror": { + "version": "1.10.0", "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT", "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "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==", + "node_modules/wcwidth": { + "version": "1.0.1", "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" + "defaults": "^1.0.3" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.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==", - "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==", - "license": "MIT", + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8" } }, - "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==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "node_modules/which-collection": { + "version": "1.0.2", "dev": true, "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, "engines": { - "node": ">=20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/which-typed-array": { + "version": "1.1.19", "dev": true, "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "node_modules/workerpool": { + "version": "9.3.4", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "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/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^14.13.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", - "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/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", - "devOptional": 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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "node_modules/wrappy": { + "version": "1.0.2", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/xmlbuilder": { + "version": "15.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": ">=8.0" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "node_modules/y18n": { + "version": "5.0.8", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=0.11" + "node": ">= 14.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "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": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=12" } }, - "node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", "dev": true, "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/yocto-queue": { + "version": "0.1.0", "dev": true, "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "1.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 14" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { + "server": { + "name": "teaching-assistant-server", "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2", + "multer": "^2.0.2", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/jest": "^30.0.0", + "@types/multer": "^2.0.0", + "@types/node": "^20.5.0", + "@types/supertest": "^6.0.3", + "cross-env": "^10.1.0", + "jest": "^30.2.0", + "jest-cucumber": "^4.5.0", + "supertest": "^7.1.4", + "ts-jest": "^29.4.5", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.1.6" + } + }, + "server/node_modules/@babel/code-frame": { + "version": "7.27.1", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "server/node_modules/@babel/compat-data": { + "version": "7.28.5", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "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==", + "server/node_modules/@babel/core": { + "version": "7.28.5", + "dev": true, "license": "MIT", + "peer": true, + "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": ">=8" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1521046", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", - "integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "server/node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", "dev": true, - "license": "ISC", + "license": "MIT", "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==", - "devOptional": true, - "license": "BSD-3-Clause", + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.3.1" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "server/node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", "dev": true, "license": "MIT" }, - "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==", + "server/node_modules/@babel/generator": { + "version": "7.28.5", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "@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": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.253", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.253.tgz", - "integrity": "sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==", - "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==", + "server/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/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==", + "server/node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "@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/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "server/node_modules/@babel/helper-globals": { + "version": "7.28.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "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==", + "server/node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "server/node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "dev": true, "license": "MIT", "dependencies": { - "stackframe": "^1.3.4" - } - }, - "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", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "server/node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "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==", + "server/node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "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==", + "server/node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "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": ">=6.9.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "server/node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "server/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": ">=0.8.0" + "node": ">=6.9.0" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", + "server/node_modules/@babel/parser": { + "version": "7.28.5", + "dev": true, + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" + "@babel/types": "^7.28.5" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=6.0.0" } }, - "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==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "server/node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "server/node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "server/node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "bare-events": "^2.7.0" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "server/node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "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" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/execa/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==", + "server/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "server/node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "server/node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "server/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 10.17.0" + "node": ">=6.9.0" }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "server/node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "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==", + "server/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "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==", - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "bser": "2.1.1" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "server/node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { - "pend": "~1.2.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "server/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "server/node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "server/node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "server/node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", + "server/node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=14" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "server/node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "server/node_modules/@babel/template": { + "version": "7.27.2", "dev": true, "license": "MIT", "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "node": ">=6.9.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "server/node_modules/@babel/traverse": { + "version": "7.28.5", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "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": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6.9.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==", + "server/node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "server/node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@babel/types": { + "version": "7.28.5", + "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/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==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "server/node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" }, - "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==", + "server/node_modules/@cucumber/gherkin": { + "version": "28.0.0", + "dev": true, "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" + "@cucumber/messages": ">=19.1.4 <=24" } }, - "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==", + "server/node_modules/@cucumber/messages": { + "version": "24.1.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8.0.0" + "dependencies": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "server/node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.1", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "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", + "server/node_modules/@epic-web/invariant": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "server/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "server/node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", "dev": true, "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "server/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "server/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "server/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", "dev": true, "license": "MIT", "dependencies": { - "ini": "2.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "server/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "server/node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "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": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=8" } }, - "node_modules/has-ansi": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", - "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "server/node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "server/node_modules/@jest/console": { + "version": "30.2.0", "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/@jest/core": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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==", + "server/node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/@jest/environment": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "server/node_modules/@jest/expect": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "server/node_modules/@jest/expect-utils": { + "version": "30.2.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "@jest/get-type": "30.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "server/node_modules/@jest/fake-timers": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">= 14" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "server/node_modules/@jest/get-type": { + "version": "30.1.0", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", - "license": "Apache-2.0", + "server/node_modules/@jest/globals": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, "engines": { - "node": ">=10.17.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "server/node_modules/@jest/pattern": { + "version": "30.0.1", + "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@types/node": "*", + "jest-regex-util": "30.0.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/@jest/reporters": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "server/node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.19" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "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==", + "server/node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "server/node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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.", + "server/node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "server/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "server/node_modules/@jest/snapshot-utils": { + "version": "30.2.0", "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, "engines": { - "node": ">= 12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", - "license": "MIT" - }, - "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==", + "server/node_modules/@jest/source-map": { + "version": "30.0.1", + "dev": true, "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "server/node_modules/@jest/test-result": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "server/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "server/node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.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==", + "server/node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "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==", - "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "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==", + "server/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "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" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "server/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/istanbul-lib-report/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==", + "server/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "server/node_modules/@jridgewell/remapping": { + "version": "2.3.5", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { + "server/node_modules/@jridgewell/remapping/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": { @@ -16891,1807 +25584,1589 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "server/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "server/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, + "license": "MIT" + }, + "server/node_modules/@noble/hashes": { + "version": "1.8.0", + "dev": true, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "^14.21.3 || >=16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "server/node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@jest/core": "30.2.0", - "@jest/types": "30.2.0", - "import-local": "^3.2.0", - "jest-cli": "30.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@noble/hashes": "^1.1.5" } }, - "node_modules/jest-changed-files": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "server/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.2.0", - "p-limit": "^3.1.0" - }, + "optional": true, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" } }, - "node_modules/jest-changed-files/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==", + "server/node_modules/@pkgr/core": { + "version": "0.2.9", "dev": true, "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/jest-circus": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "server/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "server/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "server/node_modules/@types/babel__core": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "p-limit": "^3.1.0", - "pretty-format": "30.2.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/jest-circus/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==", + "server/node_modules/@types/babel__generator": { + "version": "7.27.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/jest-circus/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==", + "server/node_modules/@types/babel__template": { + "version": "7.4.4", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/@types/babel__traverse": { + "version": "7.28.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "@babel/types": "^7.28.2" } }, - "node_modules/jest-circus/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==", + "server/node_modules/@types/body-parser": { + "version": "1.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "server/node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "server/node_modules/@types/cookiejar": { + "version": "2.1.5", "dev": true, "license": "MIT" }, - "node_modules/jest-cli": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "server/node_modules/@types/cors": { + "version": "2.8.19", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@types/node": "*" } }, - "node_modules/jest-config": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "server/node_modules/@types/express": { + "version": "4.17.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "server/node_modules/@types/express-serve-static-core": { + "version": "4.19.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.2.0", - "@jest/types": "30.2.0", - "babel-jest": "30.2.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.2.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-runner": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "micromatch": "^4.0.8", - "parse-json": "^5.2.0", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/jest-config/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==", + "server/node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "server/node_modules/@types/istanbul-reports": { + "version": "3.0.4", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/istanbul-lib-report": "*" } }, - "node_modules/jest-config/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "server/node_modules/@types/jest": { + "version": "30.0.0", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "peer": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, - "node_modules/jest-config/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "server/node_modules/@types/methods": { + "version": "1.1.4", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "server/node_modules/@types/mime": { + "version": "1.3.5", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/jest-config/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "server/node_modules/@types/multer": { + "version": "2.0.0", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/express": "*" } }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/@types/node": { + "version": "20.19.24", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "undici-types": "~6.21.0" } }, - "node_modules/jest-config/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==", + "server/node_modules/@types/qs": { + "version": "6.14.0", "dev": true, "license": "MIT" }, - "node_modules/jest-cucumber": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jest-cucumber/-/jest-cucumber-4.5.0.tgz", - "integrity": "sha512-EGVqkeE6xM/wnpWuLuB3AMQs4vNkLDwOuH3bsH2AigphAqDp+k3E+AIh0FAKhJ/1IjLTfZKyupIPRlYN62YZ+A==", + "server/node_modules/@types/range-parser": { + "version": "1.2.7", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "server/node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", "dependencies": { - "@cucumber/gherkin": "^28.0.0", - "callsites": "^3.0.0", - "glob": "^10.3.10", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "@types/jest": ">=29.5.12", - "jest": ">=29.7.0", - "vitest": ">=1.4.0" - }, - "peerDependenciesMeta": { - "@types/jest": { - "optional": true - }, - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } + "@types/node": "*" } }, - "node_modules/jest-cucumber/node_modules/@cucumber/gherkin": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", - "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", + "server/node_modules/@types/serve-static": { + "version": "1.15.10", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/messages": ">=19.1.4 <=24" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" } }, - "node_modules/jest-cucumber/node_modules/@cucumber/messages": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", - "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", + "server/node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", "dev": true, "license": "MIT", "dependencies": { - "@types/uuid": "9.0.8", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.1", - "uuid": "9.0.1" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/jest-cucumber/node_modules/@cucumber/messages/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "server/node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@types/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@types/superagent": { + "version": "8.1.9", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "server/node_modules/@types/supertest": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" } }, - "node_modules/jest-cucumber/node_modules/@types/uuid": { + "server/node_modules/@types/uuid": { "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, - "node_modules/jest-cucumber/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "server/node_modules/@types/yargs": { + "version": "17.0.35", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@types/yargs-parser": "*" + } + }, + "server/node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "server/node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "server/node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "server/node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "server/node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.6" } }, - "node_modules/jest-cucumber/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "server/node_modules/adler-32": { + "version": "1.3.1", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "server/node_modules/ansi-escapes": { + "version": "4.3.2", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cucumber/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "server/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/jest-cucumber/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "server/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cucumber/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "server/node_modules/anymatch": { + "version": "3.1.3", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/jest-cucumber/node_modules/reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", - "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", - "dev": true, - "license": "Apache-2.0" + "server/node_modules/append-field": { + "version": "1.0.0", + "license": "MIT" }, - "node_modules/jest-cucumber/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "server/node_modules/argparse": { + "version": "1.0.10", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/jest-diff": { + "server/node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "server/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "server/node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "server/node_modules/babel-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, - "node_modules/jest-diff/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==", + "server/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=12" } }, - "node_modules/jest-diff/node_modules/pretty-format": { + "server/node_modules/babel-plugin-jest-hoist": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "@types/babel__core": "^7.20.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-diff/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/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "server/node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "detect-newline": "^3.1.0" + "@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" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, - "node_modules/jest-each": { + "server/node_modules/babel-preset-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "jest-util": "30.2.0", - "pretty-format": "30.2.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, - "node_modules/jest-each/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==", + "server/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "server/node_modules/baseline-browser-mapping": { + "version": "2.9.4", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "server/node_modules/binary-extensions": { + "version": "2.3.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, + "server/node_modules/body-parser": { + "version": "1.20.3", "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/jest-each/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==", + "server/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/jest-environment-node": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "server/node_modules/braces": { + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0" + "fill-range": "^7.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-haste-map": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", - "devOptional": true, + "server/node_modules/browserslist": { + "version": "4.28.1", + "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", + "peer": true, "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "micromatch": "^4.0.8", - "walker": "^1.0.8" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "server/node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "server/node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "server/node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "server/node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" + "node": ">=10.16.0" + } + }, + "server/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/jest-leak-detector": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", - "dev": true, + "server/node_modules/call-bind-apply-helpers": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.2.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-leak-detector/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, + "server/node_modules/call-bound": { + "version": "1.0.4", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/callsites": { + "version": "3.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6" } }, - "node_modules/jest-leak-detector/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==", + "server/node_modules/camelcase": { + "version": "5.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "server/node_modules/caniuse-lite": { + "version": "1.0.30001759", "dev": true, - "license": "MIT", + "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" + }, + "server/node_modules/cfb": { + "version": "1.2.2", + "license": "Apache-2.0", "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.8" } }, - "node_modules/jest-matcher-utils/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==", + "server/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/char-regex": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" } }, - "node_modules/jest-matcher-utils/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/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "server/node_modules/chokidar": { + "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util/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" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/ci-info": { + "version": "4.3.1", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-message-util/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==", + "server/node_modules/cjs-module-lexer": { + "version": "2.1.1", "dev": true, "license": "MIT" }, - "node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "server/node_modules/class-transformer": { + "version": "0.5.1", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "server/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-util": "30.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12" } }, - "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==", + "server/node_modules/co": { + "version": "4.6.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "devOptional": true, - "license": "MIT", + "server/node_modules/codepage": { + "version": "1.15.0", + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.8" } }, - "node_modules/jest-resolve": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", - "devOptional": true, + "server/node_modules/collect-v8-coverage": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "server/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "color-name": "~1.1.4" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=7.0.0" } }, - "node_modules/jest-resolve-dependencies": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "server/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "server/node_modules/combined-stream": { + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.2.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.8" } }, - "node_modules/jest-runner": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "server/node_modules/component-emitter": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "server/node_modules/concat-map": { + "version": "0.0.1", "dev": true, + "license": "MIT" + }, + "server/node_modules/concat-stream": { + "version": "2.0.0", + "engines": [ + "node >= 6.0" + ], "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/environment": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-leak-detector": "30.2.0", - "jest-message-util": "30.2.0", - "jest-resolve": "30.2.0", - "jest-runtime": "30.2.0", - "jest-util": "30.2.0", - "jest-watcher": "30.2.0", - "jest-worker": "30.2.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "server/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.6" } }, - "node_modules/jest-runner/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, + "server/node_modules/content-type": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/jest-runner/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==", + "server/node_modules/convert-source-map": { + "version": "2.0.0", "dev": true, + "license": "MIT" + }, + "server/node_modules/cookie": { + "version": "0.7.1", "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/jest-runtime": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "server/node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "server/node_modules/cookiejar": { + "version": "2.1.4", "dev": true, + "license": "MIT" + }, + "server/node_modules/cors": { + "version": "2.8.5", "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/globals": "30.2.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.10" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, + "server/node_modules/crc-32": { + "version": "1.2.2", + "license": "Apache-2.0", "bin": { - "glob": "dist/esm/bin.mjs" + "crc32": "bin/crc32.njs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=0.8" } }, - "node_modules/jest-runtime/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "server/node_modules/cross-env": { + "version": "10.1.0", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-runtime/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=20" } }, - "node_modules/jest-runtime/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "server/node_modules/cross-spawn": { + "version": "7.0.6", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/jest-snapshot": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", - "dev": true, + "server/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "pretty-format": "30.2.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "ms": "2.0.0" } }, - "node_modules/jest-snapshot/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==", + "server/node_modules/dedent": { + "version": "1.7.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "server/node_modules/deepmerge": { + "version": "4.3.1", "dev": true, "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-snapshot/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==", + "server/node_modules/delayed-stream": { + "version": "1.0.0", "dev": true, - "license": "MIT" - }, - "node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", - "devOptional": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.4.0" } }, - "node_modules/jest-validate": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", - "devOptional": true, + "server/node_modules/depd": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.2.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.8" } }, - "node_modules/jest-validate/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==", - "devOptional": true, + "server/node_modules/destroy": { + "version": "1.2.0", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "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==", - "devOptional": true, + "server/node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "devOptional": true, + "server/node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "server/node_modules/dunder-proto": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-validate/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==", - "devOptional": true, + "server/node_modules/dynamic-dedupe": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "server/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "server/node_modules/ee-first": { + "version": "1.1.1", "license": "MIT" }, - "node_modules/jest-watcher": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "server/node_modules/electron-to-chromium": { + "version": "1.5.266", + "dev": true, + "license": "ISC" + }, + "server/node_modules/emittery": { + "version": "0.13.1", "dev": true, "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.2.0", - "string-length": "^4.0.2" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/jest-worker": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", - "devOptional": true, + "server/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "server/node_modules/encodeurl": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.8" } }, - "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==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "server/node_modules/error-ex": { + "version": "1.3.4", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "is-arrayish": "^0.2.1" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "server/node_modules/es-define-property": { + "version": "1.0.1", "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "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==", - "license": "MIT" + "server/node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "server/node_modules/es-object-atoms": { + "version": "1.1.1", "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "es-errors": "^1.3.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/knuth-shuffle-seeded": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", - "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "server/node_modules/es-set-tostringtag": { + "version": "2.1.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "seed-random": "~2.2.0" + "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/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==", + "server/node_modules/escalade": { + "version": "3.2.0", + "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==", + "server/node_modules/escape-html": { + "version": "1.0.3", "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==", + "server/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "server/node_modules/esprima": { + "version": "4.0.1", "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, + "license": "BSD-2-Clause", "bin": { - "loose-envify": "cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "server/node_modules/etag": { + "version": "1.8.1", "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" + "engines": { + "node": ">= 0.6" } }, - "node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "server/node_modules/execa": { + "version": "5.1.1", "dev": true, - "license": "ISC", + "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": "20 || >=22" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/luxon": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", + "server/node_modules/exit-x": { + "version": "0.2.2", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "server/node_modules/expect": { + "version": "30.2.0", "dev": true, "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/express": { + "version": "4.21.2", "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "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": ">=10" + "node": ">= 0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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==", - "devOptional": true, - "license": "ISC" + "server/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", + "server/node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "server/node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tmpl": "1.0.5" + "bser": "2.1.1" } }, - "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==", + "server/node_modules/fill-range": { + "version": "7.1.1", + "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "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==", + "server/node_modules/finalhandler": { + "version": "1.3.1", "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.6" + "node": ">= 0.8" } }, - "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==", - "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==", + "server/node_modules/find-up": { + "version": "4.1.0", + "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", + "server/node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", + "server/node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">=8.6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "server/node_modules/form-data": { + "version": "4.0.5", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "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": ">=10.0.0" + "node": ">= 6" } }, - "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==", + "server/node_modules/formidable": { + "version": "3.5.4", + "dev": true, "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "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==", + "server/node_modules/forwarded": { + "version": "0.2.0", "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==", - "license": "MIT", + "server/node_modules/frac": { + "version": "1.1.2", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=0.8" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, + "server/node_modules/fresh": { + "version": "0.5.2", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "server/node_modules/fs.realpath": { + "version": "1.0.0", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "server/node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "server/node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6.9.0" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "server/node_modules/get-caller-file": { + "version": "2.0.5", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "server/node_modules/get-intrinsic": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "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" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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" + "server/node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "server/node_modules/get-proto": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 10.16.0" + "node": ">= 0.4" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "server/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" + "server/node_modules/glob": { + "version": "7.2.3", + "dev": 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": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "*" }, "funding": { - "url": "https://opencollective.com/napi-postinstall" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "server/node_modules/glob-parent": { + "version": "5.1.2", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 6" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "server/node_modules/gopd": { + "version": "1.2.0", "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "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==", - "license": "MIT" + "server/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "server/node_modules/handlebars": { + "version": "4.7.8", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "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==", + "server/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, "engines": { "node": ">=8" } }, - "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==", + "server/node_modules/has-symbols": { + "version": "1.1.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "server/node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -18699,1245 +27174,1228 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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", + "server/node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", "dependencies": { - "wrappy": "1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "server/node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "server/node_modules/http-errors": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "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==", + "server/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "server/node_modules/iconv-lite": { + "version": "0.4.24", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "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==", + "server/node_modules/import-local": { + "version": "3.2.0", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "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/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==", + "server/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "server/node_modules/inflight": { + "version": "1.0.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, + "once": "^1.3.0", + "wrappy": "1" + } + }, + "server/node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "server/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 0.10" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "server/node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "server/node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pad-right": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", - "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "server/node_modules/is-core-module": { + "version": "2.16.1", "dev": true, "license": "MIT", "dependencies": { - "repeat-string": "^1.5.2" + "hasown": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "server/node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "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==", + "server/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "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/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==", + "server/node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "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==", + "server/node_modules/is-glob": { + "version": "4.0.3", + "dev": true, "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "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==", + "server/node_modules/is-number": { + "version": "7.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/path-scurry": { + "server/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "server/node_modules/isexe": { + "version": "2.0.0", "dev": true, - "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==", "license": "ISC" }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "devOptional": true, - "license": "MIT", + "server/node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "server/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "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" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=10" } }, - "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==", - "license": "MIT", + "server/node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "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==", - "license": "MIT", + "server/node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "find-up": "^4.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "license": "MIT", + "server/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" } }, - "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==", + "server/node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "server/node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.3", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "server/node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", "dev": true, "license": "MIT" }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "server/node_modules/istanbul-reports": { + "version": "3.2.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "server/node_modules/jackspeak": { + "version": "3.4.3", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/puppeteer": { - "version": "24.30.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.30.0.tgz", - "integrity": "sha512-A5OtCi9WpiXBQgJ2vQiZHSyrAzQmO/WDsvghqlN4kgw21PhxA5knHUaUQq/N3EMt8CcvSS0RM+kmYLJmedR3TQ==", + "server/node_modules/jest": { + "version": "30.2.0", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", + "license": "MIT", + "peer": true, "dependencies": { - "@puppeteer/browsers": "2.10.13", - "chromium-bidi": "11.0.0", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1521046", - "puppeteer-core": "24.30.0", - "typed-query-selector": "^2.12.0" + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" }, "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" + "jest": "bin/jest.js" }, "engines": { - "node": ">=18" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/puppeteer-core": { - "version": "24.30.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.30.0.tgz", - "integrity": "sha512-2S3Smy0t0W4wJnNvDe7W0bE7wDmZjfZ3ljfMgJd6hn2Hq/f0jgN+x9PULZo2U3fu5UUIJ+JP8cNUGllu8P91Pg==", + "server/node_modules/jest-changed-files": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@puppeteer/browsers": "2.10.13", - "chromium-bidi": "11.0.0", - "debug": "^4.4.3", - "devtools-protocol": "0.0.1521046", - "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.8", - "ws": "^8.18.3" + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">=18" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "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.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "server/node_modules/jest-circus": { + "version": "30.2.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.1.0" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "server/node_modules/jest-cli": { + "version": "30.2.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0" + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "server/node_modules/jest-config": { + "version": "30.2.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "react": "^18.3.1" + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "server/node_modules/jest-config/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "balanced-match": "^1.0.0" + } + }, + "server/node_modules/jest-config/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=18" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "server/node_modules/jest-config/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "server/node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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", + "server/node_modules/jest-cucumber": { + "version": "4.5.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@cucumber/gherkin": "^28.0.0", + "callsites": "^3.0.0", + "glob": "^10.3.10", + "uuid": "^10.0.0" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@types/jest": ">=29.5.12", + "jest": ">=29.7.0", + "vitest": ">=1.4.0" + }, + "peerDependenciesMeta": { + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "server/node_modules/jest-cucumber/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/regexp-match-indices": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz", - "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "server/node_modules/jest-cucumber/node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "regexp-tree": "^0.1.11" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, - "license": "MIT", + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, "bin": { - "regexp-tree": "bin/regexp-tree" + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "server/node_modules/jest-cucumber/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", + "license": "ISC", "dependencies": { - "resolve-from": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/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==", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "server/node_modules/jest-diff": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "server/node_modules/jest-docblock": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "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/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/seed-random": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", - "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "detect-newline": "^3.1.0" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-each": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-environment-node": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "server/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, "engines": { - "node": ">= 0.4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "^2.3.3" } }, - "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==", + "server/node_modules/jest-leak-detector": { + "version": "30.2.0", + "dev": true, "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" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-mock": { + "version": "30.2.0", + "dev": true, "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" + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "server/node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=6" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "server/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-resolve": { + "version": "30.2.0", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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==", + "server/node_modules/jest-resolve-dependencies": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "server/node_modules/jest-runner": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">= 14" - } - }, - "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "server/node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "server/node_modules/jest-runtime": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "server/node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "server/node_modules/jest-runtime/node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "CC0-1.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==", - "license": "BSD-3-Clause" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", + "server/node_modules/jest-runtime/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", "dependencies": { - "escape-string-regexp": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stack-utils/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==", + "server/node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "server/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, "engines": { - "node": ">=10.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "server/node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.3", "dev": true, - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "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==", + "server/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "server/node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", "dev": true, "license": "MIT", "engines": { - "node": ">=0.6.19" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "server/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "server/node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": 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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "server/node_modules/jest-watcher": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", + "server/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "server/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/strip-bom": { + "server/node_modules/js-tokens": { "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" + }, + "server/node_modules/js-yaml": { + "version": "3.14.2", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "server/node_modules/jsesc": { + "version": "3.1.0", + "dev": true, "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "server/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "server/node_modules/json5": { + "version": "2.2.3", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=8" + "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==", + "server/node_modules/leven": { + "version": "3.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/student-manager-client": { - "resolved": "client", - "link": true + "server/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" }, - "node_modules/superagent": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", + "server/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.4", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "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==", + "server/node_modules/lodash.memoize": { + "version": "4.1.2", "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } + "license": "MIT" }, - "node_modules/supertest": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", + "server/node_modules/lru-cache": { + "version": "5.1.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "methods": "^1.1.2", - "superagent": "^10.2.3" - }, - "engines": { - "node": ">=14.18.0" + "yallist": "^3.0.2" } }, - "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==", - "devOptional": true, + "server/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "server/node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" + "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "server/node_modules/makeerror": { + "version": "1.0.12", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "tmpl": "1.0.5" } }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, + "server/node_modules/math-intrinsics": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "server/node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "server/node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "server/node_modules/merge-stream": { + "version": "2.0.0", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } + "license": "MIT" + }, + "server/node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/teaching-assistant-server": { - "resolved": "server", - "link": true - }, - "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==", - "license": "ISC", + "server/node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/test-exclude/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==", + "server/node_modules/mime": { + "version": "1.6.0", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "server/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "server/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", "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" + "mime-db": "1.52.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.6" + } + }, + "server/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/test-exclude/node_modules/minimatch": { + "server/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -19946,1498 +28404,1453 @@ "node": "*" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "server/node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "server/node_modules/minipass": { + "version": "7.1.2", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "server/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "server/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "server/node_modules/multer": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "any-promise": "^1.0.0" + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "server/node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", "license": "MIT", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "server/node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" }, "engines": { - "node": ">=0.8" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" } }, - "node_modules/tiny-case": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", + "server/node_modules/natural-compare": { + "version": "1.4.0", "dev": true, "license": "MIT" }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "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==", + "server/node_modules/negotiator": { + "version": "0.6.3", "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">= 0.6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "server/node_modules/neo-async": { + "version": "2.6.2", "dev": true, "license": "MIT" }, - "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==", + "server/node_modules/node-int64": { + "version": "0.4.0", "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } + "license": "MIT" }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "server/node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "server/node_modules/normalize-path": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6.10" + "node": ">=0.10.0" } }, - "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==", + "server/node_modules/npm-run-path": { + "version": "4.0.1", "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" + "path-key": "^3.0.0" }, "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": ">=8" } }, - "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" - }, + "server/node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "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==", - "devOptional": true, + "server/node_modules/object-inspect": { + "version": "1.13.4", "license": "MIT", - "peer": true, - "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" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "server/node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">= 0.8" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "server/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, - "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==", + "server/node_modules/onetime": { + "version": "5.1.2", + "dev": true, "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "server/node_modules/p-limit": { + "version": "3.1.0", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=16" + "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==", + "server/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "server/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", "dev": true, - "license": "MIT" - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "server/node_modules/p-try": { + "version": "2.2.0", "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" + "server/node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "server/node_modules/parse-json": { + "version": "5.2.0", "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": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "devOptional": true, - "hasInstallScript": true, + "server/node_modules/parseurl": { + "version": "1.3.3", "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + "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==", - "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" - } - ], + "server/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=8" } }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "server/node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/util-arity": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", - "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "server/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "server/node_modules/path-parse": { + "version": "1.0.7", "dev": true, "license": "MIT" }, - "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==", + "server/node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "server/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "server/node_modules/path-to-regexp": { + "version": "0.1.12", "license": "MIT" }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "server/node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "server/node_modules/picomatch": { + "version": "2.3.1", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", - "devOptional": true, - "license": "MIT" + "server/node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "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==", + "server/node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=10.12.0" + "node": ">=8" + } + }, + "server/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/v8-to-istanbul/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==", + "server/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", + "server/node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", + "server/node_modules/pure-rand": { + "version": "7.0.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "server/node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", "dependencies": { - "makeerror": "1.0.12" + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webdriver-bidi-protocol": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.8.tgz", - "integrity": "sha512-21Yi2GhGntMc671vNBCjiAeEVknXjVRoyu+k+9xOMShu+ZQfpGQwnBqbNz/Sv4GXZ6JmutlPAi2nIJcrymAWuQ==", - "dev": true, - "license": "Apache-2.0" + "server/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "server/node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.8" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "server/node_modules/react-is": { + "version": "18.3.1", "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==", + "server/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 6" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "server/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8.10.0" } }, - "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" + "server/node_modules/reflect-metadata": { + "version": "0.2.1", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "server/node_modules/require-directory": { + "version": "2.1.1", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "server/node_modules/resolve": { + "version": "1.22.11", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "bin": { + "resolve": "bin/resolve" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "server/node_modules/resolve-cwd": { + "version": "3.0.0", "dev": true, "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "server/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.4" + "node": ">=8" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "server/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, "license": "ISC", - "engines": { - "node": ">=10" + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" + "server/node_modules/safe-buffer": { + "version": "5.2.1", + "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/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "server/node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "server/node_modules/semver": { + "version": "6.3.1", "dev": true, "license": "ISC", "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" + "semver": "bin/semver.js" } }, - "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, + "server/node_modules/send": { + "version": "0.19.0", "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" + "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": ">=12" + "node": ">= 0.8.0" } }, - "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", + "server/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "server/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "server/node_modules/serve-static": { + "version": "1.16.2", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "server/node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "server/node_modules/shebang-command": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, + "server/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "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==", + "server/node_modules/side-channel": { + "version": "1.1.0", "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": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/yup": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.0.tgz", - "integrity": "sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==", - "dev": true, + "server/node_modules/side-channel-list": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - }, - "node_modules/yup/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=12.20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, + "server/node_modules/side-channel-map": { + "version": "1.0.1", "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/colinhacks" + "url": "https://github.com/sponsors/ljharb" } }, - "server": { - "name": "teaching-assistant-server", - "version": "1.0.0", - "license": "ISC", + "server/node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "cors": "^2.8.5", - "express": "^4.18.2", - "multer": "^2.0.2" + "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" }, - "devDependencies": { - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/jest": "^30.0.0", - "@types/multer": "^2.0.0", - "@types/node": "^20.5.0", - "@types/supertest": "^6.0.3", - "jest": "^30.2.0", - "supertest": "^7.1.4", - "ts-jest": "^29.4.5", - "ts-node-dev": "^2.0.0", - "typescript": "^5.1.6" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "server/node_modules/@types/cors": { - "version": "2.8.19", + "server/node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "license": "ISC" }, - "server/node_modules/@types/express": { - "version": "4.17.25", + "server/node_modules/slash": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "engines": { + "node": ">=8" } }, - "server/node_modules/@types/express-serve-static-core": { - "version": "4.19.7", + "server/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "server/node_modules/@types/node": { - "version": "20.19.24", + "server/node_modules/source-map-support": { + "version": "0.5.21", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "server/node_modules/@types/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "server/node_modules/@types/strip-json-comments": { - "version": "0.0.30", + "server/node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "server/node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", + "server/node_modules/ssf": { + "version": "0.11.2", + "license": "Apache-2.0", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "frac": "~1.1.2" }, "engines": { - "node": ">= 0.6" + "node": ">=0.8" } }, - "server/node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "server/node_modules/binary-extensions": { - "version": "2.3.0", + "server/node_modules/stack-utils": { + "version": "2.0.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "escape-string-regexp": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "server/node_modules/body-parser": { - "version": "1.20.3", + "server/node_modules/statuses": { + "version": "2.0.1", "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": ">= 0.8" } }, - "server/node_modules/brace-expansion": { - "version": "1.1.12", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "server/node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" } }, - "server/node_modules/bytes": { - "version": "3.1.2", + "server/node_modules/string_decoder": { + "version": "1.3.0", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "server/node_modules/chokidar": { - "version": "3.6.0", + "server/node_modules/string-length": { + "version": "4.0.2", "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" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=10" } }, - "server/node_modules/content-disposition": { - "version": "0.5.4", + "server/node_modules/string-width": { + "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "server/node_modules/content-type": { - "version": "1.0.5", + "server/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "server/node_modules/cookie": { - "version": "0.7.1", + "server/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "server/node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "server/node_modules/cors": { - "version": "2.8.5", + "server/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "server/node_modules/debug": { - "version": "2.6.9", + "server/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=4" } }, - "server/node_modules/depd": { + "server/node_modules/strip-final-newline": { "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "server/node_modules/destroy": { - "version": "1.2.0", + "server/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.10.0" } }, - "server/node_modules/dynamic-dedupe": { - "version": "0.3.0", + "server/node_modules/superagent": { + "version": "10.2.3", "dev": true, "license": "MIT", "dependencies": { - "xtend": "^4.0.0" + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.4", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.2" + }, + "engines": { + "node": ">=14.18.0" } }, - "server/node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "server/node_modules/encodeurl": { - "version": "2.0.0", + "server/node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">= 0.8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "server/node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "server/node_modules/etag": { - "version": "1.8.1", + "server/node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "server/node_modules/express": { - "version": "4.21.2", + "server/node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "server/node_modules/supertest": { + "version": "7.1.4", + "dev": true, "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" + "methods": "^1.1.2", + "superagent": "^10.2.3" }, "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=14.18.0" } }, - "server/node_modules/finalhandler": { - "version": "1.3.1", + "server/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, "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" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "server/node_modules/forwarded": { - "version": "0.2.0", + "server/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "server/node_modules/fresh": { - "version": "0.5.2", + "server/node_modules/synckit": { + "version": "0.11.11", + "dev": true, "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, "engines": { - "node": ">= 0.6" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, - "server/node_modules/glob": { - "version": "7.2.3", + "server/node_modules/test-exclude": { + "version": "6.0.0", "dev": 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" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "server/node_modules/glob-parent": { - "version": "5.1.2", + "server/node_modules/tmpl": { + "version": "1.0.5", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause" + }, + "server/node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8.0" } }, - "server/node_modules/http-errors": { - "version": "2.0.0", + "server/node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "server/node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "server/node_modules/ts-jest": { + "version": "29.4.6", + "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "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": ">= 0.8" + "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 + } } }, - "server/node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "server/node_modules/ts-jest/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "server/node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", + "server/node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.10" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "server/node_modules/is-binary-path": { - "version": "2.1.0", + "server/node_modules/ts-node-dev": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "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": ">=8" + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "server/node_modules/is-core-module": { - "version": "2.16.1", + "server/node_modules/tsconfig": { + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" } }, - "server/node_modules/is-extglob": { - "version": "2.1.1", + "server/node_modules/type-detect": { + "version": "4.0.8", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "server/node_modules/is-glob": { - "version": "4.0.3", + "server/node_modules/type-fest": { + "version": "0.21.3", "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" - } - }, - "server/node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", + "node": ">=10" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "server/node_modules/mime": { - "version": "1.6.0", + "server/node_modules/type-is": { + "version": "1.6.18", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "server/node_modules/minimatch": { - "version": "3.1.2", + "server/node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "server/node_modules/typescript": { + "version": "5.9.3", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "*" + "node": ">=14.17" } }, - "server/node_modules/mkdirp": { - "version": "1.0.4", + "server/node_modules/uglify-js": { + "version": "3.19.3", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "optional": true, "bin": { - "mkdirp": "bin/cmd.js" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=10" + "node": ">=0.8.0" } }, - "server/node_modules/ms": { - "version": "2.0.0", + "server/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, "license": "MIT" }, - "server/node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "server/node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "server/node_modules/parseurl": { - "version": "1.3.3", + "server/node_modules/unpipe": { + "version": "1.0.0", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "server/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "server/node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, - "server/node_modules/picomatch": { - "version": "2.3.1", + "server/node_modules/unrs-resolver": { + "version": "1.11.1", "dev": true, + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "napi-postinstall": "^0.3.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, - "server/node_modules/proxy-addr": { - "version": "2.0.7", + "server/node_modules/update-browserslist-db": { + "version": "1.2.2", + "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": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">= 0.10" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "server/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, + "server/node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "server/node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4.0" } }, - "server/node_modules/range-parser": { - "version": "1.2.1", + "server/node_modules/uuid": { + "version": "10.0.0", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": ">= 0.6" + "bin": { + "uuid": "dist/bin/uuid" } }, - "server/node_modules/raw-body": { - "version": "2.5.2", - "license": "MIT", + "server/node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10.12.0" } }, - "server/node_modules/readdirp": { - "version": "3.6.0", + "server/node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "server/node_modules/vary": { + "version": "1.1.2", + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 0.8" } }, - "server/node_modules/resolve": { - "version": "1.22.11", + "server/node_modules/walker": { + "version": "1.0.8", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "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" + "makeerror": "1.0.12" } }, - "server/node_modules/rimraf": { - "version": "2.7.1", + "server/node_modules/which": { + "version": "2.0.2", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "isexe": "^2.0.0" }, "bin": { - "rimraf": "bin.js" - } - }, - "server/node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "server/node_modules/send": { - "version": "0.19.0", - "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" + "node-which": "bin/node-which" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8" } }, - "server/node_modules/send/node_modules/encodeurl": { + "server/node_modules/wmf": { "version": "1.0.2", - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "server/node_modules/send/node_modules/ms": { - "version": "2.1.3", + "server/node_modules/word": { + "version": "0.3.0", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "server/node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, "license": "MIT" }, - "server/node_modules/serve-static": { - "version": "1.16.2", + "server/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "server/node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "server/node_modules/statuses": { - "version": "2.0.1", + "server/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "server/node_modules/strip-bom": { - "version": "3.0.0", + "server/node_modules/wrappy": { + "version": "1.0.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } + "license": "ISC" }, - "server/node_modules/strip-json-comments": { - "version": "2.0.1", + "server/node_modules/write-file-atomic": { + "version": "5.0.1", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "server/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "server/node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "server/node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" + "url": "https://github.com/sponsors/isaacs" } }, - "server/node_modules/ts-node-dev": { - "version": "2.0.0", - "dev": true, - "license": "MIT", + "server/node_modules/xlsx": { + "version": "0.18.5", + "license": "Apache-2.0", "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" + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" }, "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" + "xlsx": "bin/xlsx.njs" }, "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=0.8" } }, - "server/node_modules/tsconfig": { - "version": "7.0.0", - "dev": true, + "server/node_modules/xtend": { + "version": "4.0.2", "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" + "engines": { + "node": ">=0.4" } }, - "server/node_modules/typescript": { - "version": "5.9.3", + "server/node_modules/y18n": { + "version": "5.0.8", "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "ISC", "engines": { - "node": ">=14.17" + "node": ">=10" } }, - "server/node_modules/undici-types": { - "version": "6.21.0", + "server/node_modules/yallist": { + "version": "3.1.1", "dev": true, - "license": "MIT" + "license": "ISC" }, - "server/node_modules/unpipe": { - "version": "1.0.0", + "server/node_modules/yargs": { + "version": "17.7.2", + "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": ">= 0.8" + "node": ">=12" } }, - "server/node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", + "server/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "server/node_modules/vary": { - "version": "1.1.2", + "server/node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/package.json b/package.json index 598c2a90..56a3013c 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,21 @@ "install:client": "npm install --prefix client", "dev": "concurrently \"npm run server\" \"npm run client\"", "start": "concurrently \"npm run server\" \"npm run client\"", - "server": "PORT=3005 npm run dev --prefix server", - "client": "PORT=3004 npm start --prefix client", + "server": "cross-env PORT=3005 npm run dev --prefix server", + "client": "cross-env PORT=3004 npm start --prefix client", "build": "npm run build --prefix client", "test": "npm test --prefix client", - "lint": "npm run lint --prefix client" + "lint": "npm run lint --prefix client", + "cypress:open": "cypress open", + "cypress:run": "cypress run", + "test:e2e": "cypress run" }, "devDependencies": { - "concurrently": "^8.2.2" + "@badeball/cypress-cucumber-preprocessor": "^24.0.0", + "@bahmutov/cypress-esbuild-preprocessor": "^2.2.8", + "concurrently": "^8.2.2", + "cross-env": "^10.1.0", + "cypress": "^15.7.1" }, "keywords": [ "react", @@ -31,5 +38,10 @@ "workspaces": [ "client", "server" - ] -} \ No newline at end of file + ], + "dependencies": { + "esbuild": "^0.27.1", + "form-data": "^4.0.4", + "node-fetch": "^2.7.0" + } +} diff --git a/server/JEST_TESTING.md b/server/JEST_TESTING.md deleted file mode 100644 index 7aee1b77..00000000 --- a/server/JEST_TESTING.md +++ /dev/null @@ -1,254 +0,0 @@ -# Guia de Testes com Jest - -Este documento descreve como criar e executar testes unitários do servidor usando Jest. - -## Pré-requisitos - -Certifique-se de que as dependências estão instaladas: - -```bash -npm install -``` - -## Estrutura dos Testes - -Os testes estão localizados no diretório `src/__tests__/`: - -- `Student.test.ts` - Testes para a classe Student -- `server.test.ts` - Testes para as rotas da API -- `setup.ts` - Configuração inicial dos testes - -## Configuração do Jest - -A configuração do Jest está definida em `jest.config.json`: - -- **Test Environment**: Node.js -- **Preset**: ts-jest (para suporte a TypeScript) -- **Test Match**: Arquivos `*.test.ts` e `*.spec.ts` no diretório `__tests__` -- **Coverage**: Coleta cobertura de todos os arquivos `.ts` em `src/`, exceto `server.ts`, `index.ts` e arquivos `.d.ts` - -## Como Criar Testes - -### Estrutura Básica de um Teste - -Crie um arquivo com sufixo `.test.ts` no diretório `src/__tests__/`: - -```typescript -import { describe, test, expect } from '@jest/globals'; - -describe('Nome do Componente/Classe', () => { - test('deve descrever o comportamento esperado', () => { - // Arrange (preparar) - const valor = 2 + 2; - - // Act (executar) - // ... código a ser testado - - // Assert (verificar) - expect(valor).toBe(4); - }); -}); -``` - -### Testando Classes - -Exemplo de teste para uma classe: - -```typescript -import { Student } from '../models/Student'; - -describe('Student', () => { - test('deve criar um estudante com os dados corretos', () => { - const student = new Student('123', 'João Silva', 'joao@example.com', 'CPF123'); - - expect(student.getId()).toBe('123'); - expect(student.getName()).toBe('João Silva'); - expect(student.getEmail()).toBe('joao@example.com'); - }); - - test('deve lançar erro quando dados são inválidos', () => { - expect(() => { - new Student('', 'Nome', 'email@test.com', 'CPF123'); - }).toThrow(); - }); -}); -``` - -### Testando Rotas da API - -Use `supertest` para testar endpoints HTTP: - -```typescript -import request from 'supertest'; -import app from '../server'; - -describe('POST /students', () => { - test('deve criar um novo estudante', async () => { - const newStudent = { - id: '123', - name: 'Maria Santos', - email: 'maria@example.com', - cpf: 'CPF456' - }; - - const response = await request(app) - .post('/students') - .send(newStudent) - .expect(201); - - expect(response.body).toMatchObject(newStudent); - }); - - test('deve retornar erro 400 com dados inválidos', async () => { - const invalidStudent = { name: 'Sem ID' }; - - await request(app) - .post('/students') - .send(invalidStudent) - .expect(400); - }); -}); -``` - -### Setup e Teardown - -Use `beforeEach`, `afterEach`, `beforeAll`, `afterAll` para preparar e limpar o ambiente de testes: - -```typescript -describe('Testes que precisam de setup', () => { - beforeEach(() => { - // Executado antes de cada teste - }); - - afterEach(() => { - // Executado após cada teste - }); - - beforeAll(() => { - // Executado uma vez antes de todos os testes - }); - - afterAll(() => { - // Executado uma vez após todos os testes - }); -}); -``` - -### Mocks e Spies - -Para testar código que depende de serviços externos: - -```typescript -import { jest } from '@jest/globals'; - -test('deve usar um mock', () => { - const mockFunction = jest.fn(); - mockFunction.mockReturnValue('valor mockado'); - - const result = mockFunction(); - - expect(result).toBe('valor mockado'); - expect(mockFunction).toHaveBeenCalledTimes(1); -}); -``` - -## Comandos de Teste - -### Executar todos os testes - -Para executar todos os testes uma vez: - -```bash -npm test -``` - -### Executar testes em modo watch - -Para executar os testes em modo watch (reexecuta automaticamente quando há mudanças nos arquivos): - -```bash -npm run test:watch -``` - -### Executar testes com cobertura - -Para executar os testes e gerar relatório de cobertura: - -```bash -npm run test:coverage -``` - -O relatório de cobertura será gerado no diretório `coverage/` e você pode visualizar o relatório HTML em `coverage/index.html`. - -### Executar um teste específico - -```bash -npm test -- Student.test.ts -``` - -### Executar testes com verbose output - -```bash -npm test -- --verbose -``` - -### Executar testes e atualizar snapshots - -```bash -npm test -- -u -``` - -## Visualizando Relatórios de Cobertura - -Após executar `npm run test:coverage`, abra o arquivo de relatório no navegador: - -```bash -# Linux -xdg-open coverage/index.html - -# macOS -open coverage/index.html - -# Windows -start coverage/index.html -``` - -## Matchers Úteis - -```typescript -// Igualdade -expect(value).toBe(4); // Igualdade estrita (===) -expect(obj).toEqual({ name: 'João' }); // Igualdade profunda - -// Verdade -expect(value).toBeTruthy(); -expect(value).toBeFalsy(); -expect(value).toBeNull(); -expect(value).toBeUndefined(); - -// Números -expect(value).toBeGreaterThan(3); -expect(value).toBeLessThan(5); -expect(value).toBeCloseTo(0.3); // Para floats - -// Strings -expect(string).toMatch(/pattern/); -expect(string).toContain('substring'); - -// Arrays -expect(array).toContain(item); -expect(array).toHaveLength(3); - -// Objetos -expect(obj).toHaveProperty('key'); -expect(obj).toMatchObject({ name: 'João' }); - -// Exceções -expect(() => fn()).toThrow(); -expect(() => fn()).toThrow('mensagem de erro'); - -// Funções mockadas -expect(mockFn).toHaveBeenCalled(); -expect(mockFn).toHaveBeenCalledTimes(2); -expect(mockFn).toHaveBeenCalledWith(arg1, arg2); -``` diff --git a/server/cucumber.js b/server/cucumber.js new file mode 100644 index 00000000..59ffd269 --- /dev/null +++ b/server/cucumber.js @@ -0,0 +1,53 @@ +/** + * Cucumber Configuration for Server-Side Tests + * + * This configuration handles: + * - Unit Tests (@unit tag) + * - Service Tests (@service tag) + * - Integration Tests (@integration tag) + */ + +module.exports = { + default: { + requireModule: ['ts-node/register'], + require: ['src/step-definitions/**/*.ts'], + format: [ + 'progress-bar', + 'html:reports/cucumber-report.html' + ], + formatOptions: { + snippetInterface: 'async-await' + }, + publishQuiet: true + }, + + // Unit tests - fastest, run frequently + unit: { + requireModule: ['ts-node/register'], + require: ['src/step-definitions/unit/**/*.ts'], + paths: ['src/features/unit/**/*.feature'], + tags: '@unit', + format: ['progress-bar'], + publishQuiet: true + }, + + // Service tests - API layer with mocks + service: { + requireModule: ['ts-node/register'], + require: ['src/step-definitions/service/**/*.ts'], + paths: ['src/features/service/**/*.feature'], + tags: '@service', + format: ['progress-bar'], + publishQuiet: true + }, + + // Integration tests - data layer, slower + integration: { + requireModule: ['ts-node/register'], + require: ['src/step-definitions/integration/**/*.ts'], + paths: ['src/features/integration/**/*.feature'], + tags: '@integration', + format: ['progress-bar'], + publishQuiet: true + } +}; diff --git a/server/data/app-data.json b/server/data/app-data.json index fbadf223..fe8a7600 100644 --- a/server/data/app-data.json +++ b/server/data/app-data.json @@ -19,6 +19,26 @@ "name": "Joana Refatoração", "cpf": "55555555555", "email": "jr@gmail.com" + }, + { + "name": "Ana Silva", + "cpf": "44444444444", + "email": "ana.silva@cin.ufpe.br" + }, + { + "name": "Carlos Santos", + "cpf": "66666666666", + "email": "carlos.santos@cin.ufpe.br" + }, + { + "name": "Beatriz Costa", + "cpf": "77777777777", + "email": "beatriz.costa@cin.ufpe.br" + }, + { + "name": "Diego Oliveira", + "cpf": "88888888888", + "email": "diego.oliveira@cin.ufpe.br" } ], "classes": [ @@ -33,9 +53,12 @@ "MANA": 0 }, "pesosDasMetas": { - "Gerência de Configuração": 1, - "Gerência de Projeto": 1, - "Qualidade de Software": 1 + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 } }, "enrollments": [ @@ -127,9 +150,12 @@ "MANA": 0 }, "pesosDasMetas": { - "Gerência de Configuração": 1, - "Gerência de Projeto": 1, - "Qualidade de Software": 1 + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 } }, "enrollments": [ @@ -192,6 +218,485 @@ ] } ] + }, + { + "topic": "Engenharia de Software e Sistemas", + "semester": 2, + "year": 2024, + "especificacaoDoCalculoDaMedia": { + "pesosDosConceitos": { + "MA": 10, + "MPA": 7, + "MANA": 0 + }, + "pesosDasMetas": { + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 + } + }, + "enrollments": [ + { + "studentCPF": "11111111111", + "evaluations": [ + { + "goal": "Requirements", + "grade": "MA" + }, + { + "goal": "Configuration Management", + "grade": "MA" + }, + { + "goal": "Project Management", + "grade": "MA" + }, + { + "goal": "Design", + "grade": "MA" + }, + { + "goal": "Tests", + "grade": "MA" + }, + { + "goal": "Refactoring", + "grade": "MA" + } + ] + }, + { + "studentCPF": "44444444444", + "evaluations": [ + { + "goal": "Requirements", + "grade": "MA" + }, + { + "goal": "Configuration Management", + "grade": "MA" + }, + { + "goal": "Project Management", + "grade": "MPA" + }, + { + "goal": "Design", + "grade": "MA" + }, + { + "goal": "Tests", + "grade": "MA" + }, + { + "goal": "Refactoring", + "grade": "MA" + } + ] + }, + { + "studentCPF": "66666666666", + "evaluations": [ + { + "goal": "Requirements", + "grade": "MPA" + }, + { + "goal": "Configuration Management", + "grade": "MA" + }, + { + "goal": "Project Management", + "grade": "MANA" + }, + { + "goal": "Design", + "grade": "MPA" + }, + { + "goal": "Tests", + "grade": "MA" + }, + { + "goal": "Refactoring", + "grade": "MA" + } + ] + }, + { + "studentCPF": "77777777777", + "evaluations": [ + { + "goal": "Requirements", + "grade": "MANA" + }, + { + "goal": "Configuration Management", + "grade": "MANA" + }, + { + "goal": "Project Management", + "grade": "MANA" + } + ] + } + ] + }, + { + "topic": "Análise e Design de Sistemas", + "semester": 1, + "year": 2025, + "especificacaoDoCalculoDaMedia": { + "pesosDosConceitos": { + "MA": 10, + "MPA": 7, + "MANA": 0 + }, + "pesosDasMetas": { + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 + } + }, + "enrollments": [ + { + "studentCPF": "11111111111", + "evaluations": [ + { + "goal": "Requirements Analysis", + "grade": "MA" + }, + { + "goal": "Use Cases", + "grade": "MA" + }, + { + "goal": "Architecture", + "grade": "MPA" + }, + { + "goal": "Database Design", + "grade": "MA" + } + ] + }, + { + "studentCPF": "22222222222", + "evaluations": [ + { + "goal": "Requirements Analysis", + "grade": "MA" + }, + { + "goal": "Use Cases", + "grade": "MA" + }, + { + "goal": "Architecture", + "grade": "MA" + }, + { + "goal": "Database Design", + "grade": "MA" + } + ] + }, + { + "studentCPF": "44444444444", + "evaluations": [ + { + "goal": "Requirements Analysis", + "grade": "MPA" + }, + { + "goal": "Use Cases", + "grade": "MPA" + }, + { + "goal": "Architecture", + "grade": "MPA" + }, + { + "goal": "Database Design", + "grade": "MPA" + } + ] + }, + { + "studentCPF": "66666666666", + "evaluations": [ + { + "goal": "Requirements Analysis", + "grade": "MA" + }, + { + "goal": "Use Cases", + "grade": "MA" + }, + { + "goal": "Architecture", + "grade": "MA" + }, + { + "goal": "Database Design", + "grade": "MA" + } + ] + }, + { + "studentCPF": "77777777777", + "evaluations": [ + { + "goal": "Requirements Analysis", + "grade": "MA" + }, + { + "goal": "Use Cases", + "grade": "MA" + }, + { + "goal": "Architecture", + "grade": "MA" + }, + { + "goal": "Database Design", + "grade": "MA" + } + ] + } + ] + }, + { + "topic": "Padrões de Projeto", + "semester": 2, + "year": 2024, + "especificacaoDoCalculoDaMedia": { + "pesosDosConceitos": { + "MA": 10, + "MPA": 7, + "MANA": 0 + }, + "pesosDasMetas": { + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 + } + }, + "enrollments": [ + { + "studentCPF": "11111111111", + "evaluations": [ + { + "goal": "Creational Patterns", + "grade": "MA" + }, + { + "goal": "Structural Patterns", + "grade": "MA" + }, + { + "goal": "Behavioral Patterns", + "grade": "MPA" + } + ] + }, + { + "studentCPF": "22222222222", + "evaluations": [ + { + "goal": "Creational Patterns", + "grade": "MPA" + }, + { + "goal": "Structural Patterns", + "grade": "MPA" + }, + { + "goal": "Behavioral Patterns", + "grade": "MANA" + } + ] + }, + { + "studentCPF": "33333333333", + "evaluations": [ + { + "goal": "Creational Patterns", + "grade": "MA" + }, + { + "goal": "Structural Patterns", + "grade": "MA" + }, + { + "goal": "Behavioral Patterns", + "grade": "MA" + } + ] + }, + { + "studentCPF": "55555555555", + "evaluations": [ + { + "goal": "Creational Patterns", + "grade": "MA" + }, + { + "goal": "Structural Patterns", + "grade": "MA" + }, + { + "goal": "Behavioral Patterns", + "grade": "MA" + } + ] + }, + { + "studentCPF": "88888888888", + "evaluations": [ + { + "goal": "Creational Patterns", + "grade": "MANA" + }, + { + "goal": "Structural Patterns", + "grade": "MANA" + } + ] + } + ] + }, + { + "topic": "Testes de Software", + "semester": 1, + "year": 2024, + "especificacaoDoCalculoDaMedia": { + "pesosDosConceitos": { + "MA": 10, + "MPA": 7, + "MANA": 0 + }, + "pesosDasMetas": { + "Requirements": 1, + "Configuration Management": 1, + "Project Management": 1, + "Design": 1, + "Tests": 1, + "Refactoring": 1 + } + }, + "enrollments": [ + { + "studentCPF": "22222222222", + "evaluations": [ + { + "goal": "Unit Testing", + "grade": "MA" + }, + { + "goal": "Integration Testing", + "grade": "MA" + }, + { + "goal": "System Testing", + "grade": "MA" + }, + { + "goal": "Performance Testing", + "grade": "MPA" + } + ] + }, + { + "studentCPF": "33333333333", + "evaluations": [ + { + "goal": "Unit Testing", + "grade": "MA" + }, + { + "goal": "Integration Testing", + "grade": "MA" + }, + { + "goal": "System Testing", + "grade": "MA" + }, + { + "goal": "Performance Testing", + "grade": "MA" + } + ] + }, + { + "studentCPF": "55555555555", + "evaluations": [ + { + "goal": "Unit Testing", + "grade": "MPA" + }, + { + "goal": "Integration Testing", + "grade": "MPA" + }, + { + "goal": "System Testing", + "grade": "MPA" + }, + { + "goal": "Performance Testing", + "grade": "MPA" + } + ] + }, + { + "studentCPF": "77777777777", + "evaluations": [ + { + "goal": "Unit Testing", + "grade": "MA" + }, + { + "goal": "Integration Testing", + "grade": "MA" + }, + { + "goal": "System Testing", + "grade": "MA" + }, + { + "goal": "Performance Testing", + "grade": "MA" + } + ] + }, + { + "studentCPF": "88888888888", + "evaluations": [ + { + "goal": "Unit Testing", + "grade": "MA" + }, + { + "goal": "Integration Testing", + "grade": "MA" + }, + { + "goal": "System Testing", + "grade": "MPA" + } + ] + } + ] } ] } \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 0bb93186..98eb81b3 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "cors": "^2.8.5", "express": "^4.18.2", - "multer": "^2.0.2" + "multer": "^2.0.2", + "xlsx": "^0.18.5" }, "devDependencies": { "@types/cors": "^2.8.13", @@ -20,7 +21,9 @@ "@types/multer": "^2.0.0", "@types/node": "^20.5.0", "@types/supertest": "^6.0.3", + "cross-env": "^10.1.0", "jest": "^30.2.0", + "jest-cucumber": "^4.5.0", "supertest": "^7.1.4", "ts-jest": "^29.4.5", "ts-node-dev": "^2.0.0", @@ -598,6 +601,43 @@ "node": ">=12" } }, + "node_modules/@cucumber/gherkin": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", + "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=24" + } + }, + "node_modules/@cucumber/messages": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@emnapi/core": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", @@ -632,6 +672,13 @@ "tslib": "^2.4.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1531,6 +1578,7 @@ "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "expect": "^30.0.0", "pretty-format": "^30.0.0" @@ -1663,6 +1711,13 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -1995,6 +2050,15 @@ "node": ">=0.4.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2201,9 +2265,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.31", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", - "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", + "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2272,9 +2336,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -2293,11 +2357,11 @@ "license": "MIT", "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -2405,9 +2469,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001757", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", - "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", "dev": true, "funding": [ { @@ -2425,6 +2489,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2500,6 +2577,13 @@ "dev": true, "license": "MIT" }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "dev": true, + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2526,6 +2610,15 @@ "node": ">= 0.12.0" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", @@ -2661,6 +2754,18 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2668,6 +2773,24 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2815,9 +2938,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.260", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz", - "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==", + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", "dev": true, "license": "ISC" }, @@ -3196,6 +3319,15 @@ "node": ">= 0.6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4009,6 +4141,82 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-cucumber": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jest-cucumber/-/jest-cucumber-4.5.0.tgz", + "integrity": "sha512-EGVqkeE6xM/wnpWuLuB3AMQs4vNkLDwOuH3bsH2AigphAqDp+k3E+AIh0FAKhJ/1IjLTfZKyupIPRlYN62YZ+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@cucumber/gherkin": "^28.0.0", + "callsites": "^3.0.0", + "glob": "^10.3.10", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@types/jest": ">=29.5.12", + "jest": ">=29.7.0", + "vitest": ">=1.4.0" + }, + "peerDependenciesMeta": { + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/jest-cucumber/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-cucumber/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-cucumber/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-diff": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", @@ -5318,6 +5526,14 @@ "node": ">=8.10.0" } }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5622,6 +5838,18 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -5933,9 +6161,9 @@ } }, "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==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -6235,9 +6463,9 @@ } }, "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, "funding": [ { @@ -6280,6 +6508,20 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "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", @@ -6348,6 +6590,24 @@ "node": ">= 8" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -6426,6 +6686,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/server/package.json b/server/package.json index a30ce9e0..599e4a2c 100644 --- a/server/package.json +++ b/server/package.json @@ -14,7 +14,8 @@ "dependencies": { "cors": "^2.8.5", "express": "^4.18.2", - "multer": "^2.0.2" + "multer": "^2.0.2", + "xlsx": "^0.18.5" }, "devDependencies": { "@types/cors": "^2.8.13", @@ -23,9 +24,12 @@ "@types/multer": "^2.0.0", "@types/node": "^20.5.0", "@types/supertest": "^6.0.3", + "cross-env": "^10.1.0", "jest": "^30.2.0", + "jest-cucumber": "^4.5.0", "supertest": "^7.1.4", "ts-jest": "^29.4.5", + "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "typescript": "^5.1.6" }, diff --git a/server/src/features/integration/data_persistence.feature b/server/src/features/integration/data_persistence.feature new file mode 100644 index 00000000..5ee4c742 --- /dev/null +++ b/server/src/features/integration/data_persistence.feature @@ -0,0 +1,58 @@ +@integration @persistence +Feature: Data Persistence & Consistency + + As a Backend Engineer + I need data changes (Writes) to be immediately available to API queries (Reads) + So that the reports reflect the real-time state of the database + + Background: + Given the API is connected to the Test Database + And a fresh class "Integration-101" exists + + @write-read + Scenario: New student enrollment updates the report total + Given the class "Integration-101" has exactly "2" existing students + When I enroll a new student with CPF "999.999.999-99" + And I request the report for "Integration-101" + Then the "totalEnrolled" count should be 3 + + @deletion + Scenario: Unenrolling a student removes them from the report + Given the class "Integration-101" has the following students: + | Name | CPF | + | Student A | 111.111.111-11 | + | Student B | 222.222.222-22 | + | Student C | 333.333.333-33 | + When I unenroll the student "333.333.333-33" + And I request the report for "Integration-101" + Then the "totalEnrolled" count should be 2 + And the student "Student C" should NOT be present in the list + + @update @logic + Scenario: Updating a grade changes the calculated status + Given the class "Integration-101" has a student "Grade Tester" + And "Grade Tester" has the grades: + | Requirements | MA | + | Configuration Management | MA | + | Project Management | MA | + | Design | MANA | + | Tests | MA | + | Refactoring | MA | + When I update "Grade Tester" grade for "Design" to "MA" + And I request the report for "Integration-101" + Then "Grade Tester" should have status "APPROVED" + And the "approvedCount" should be 1 + + @integrity @sequence + Scenario: Multiple add/remove operations maintain correct count + Given the class "Integration-101" is empty + When I perform the following operations in order: + | Action | Student Name | CPF | + | Enroll | Alice | 100.000.000-01 | + | Enroll | Bob | 200.000.000-02 | + | Enroll | Charlie | 300.000.000-03 | + | Unenroll | - | 200.000.000-02 | + And I request the report for "Integration-101" + Then the "totalEnrolled" count should be 2 + And the list should contain "Alice" and "Charlie" + And the list should NOT contain "Bob" \ No newline at end of file diff --git a/server/src/features/service/report_api.feature b/server/src/features/service/report_api.feature new file mode 100644 index 00000000..441641fe --- /dev/null +++ b/server/src/features/service/report_api.feature @@ -0,0 +1,63 @@ +@service @api +Feature: Class Report API + + As an API consumer + I need the Report endpoint to aggregate student data correctly + So that the frontend receives pre-calculated statistics + + Background: + Given the API Controller is ready + + @contract @schema + Scenario: Response matches the defined JSON Contract + Given a class exists with ID "SE-101" containing students + When I request the report for class "SE-101" + Then the response status should be 200 + And the response body should match the "Report" JSON schema + And the payload should contain the following root keys: + | classId | + | totalEnrolled | + | studentsAverage | + | evaluationPerformance | + | students | + + @logic @calculation + Scenario: Aggregation logic correctly counts statuses + Given the repository returns a class "Math-101" with: + | Name | Grades | Expected Status | + | Alice | MA, MA, MA, MA, MA, MA | APPROVED | + | Bob | MANA, MANA, MANA, MANA, MANA, MANA | FAILED | + | Charlie | MPA, MPA, MPA | PENDING | + When I request the report for class "Math-101" + Then the response status should be 200 + And the aggregated statistics should be: + | field | value | + | totalEnrolled | 3 | + | approvedCount | 1 | + | notApprovedCount | 1 | + | pendingCount | 1 | + | studentsAverage | 5.0 | + + @edge-case @pending-logic + Scenario: Class with students but no evaluations + Given a class exists with "5" students having "0" evaluations + When I request the report for this class + Then the response status should be 200 + And the "studentsAverage" field should be null + And the "pendingCount" should equal "5" + And the "evaluationPerformance" list should be empty + + @edge-case @empty-class + Scenario: Class with zero enrolled students + Given a class exists with "0" students + When I request the report for this class + Then the response status should be 200 + And the "totalEnrolled" field should be 0 + And the "students" list should be empty + + @error + Scenario: Requesting a non-existent class ID + Given the repository finds no class with ID "ghost-class-404" + When I request the report for class "ghost-class-404" + Then the response status should be 404 + And the error message should indicate "Class not found" \ No newline at end of file diff --git a/server/src/features/unit/grade_calculations.feature b/server/src/features/unit/grade_calculations.feature new file mode 100644 index 00000000..4e56a3c7 --- /dev/null +++ b/server/src/features/unit/grade_calculations.feature @@ -0,0 +1,63 @@ +@unit +Feature: Grade Calculations - Domain Logic + + As a Domain Developer + I need to perform accurate grade calculations + So that student performance is correctly evaluated + + @average + Scenario: Calculate average ignoring null values + Given I have a list of grades with values [10, null, 5] + When I calculate the grade average + Then the result should be 7.5 + + @average @edge-case + Scenario: Calculate average returns 0 for empty grade list + Given I have an empty list of grades + When I calculate the grade average + Then the result should be 0 + + @grouping + Scenario: Group students by status correctly + Given I have a list of students with statuses: + | name | status | + | Alice | APPROVED | + | Bob | APPROVED | + | Charlie | FAILED | + When I aggregate the student statuses + Then the grouping should return: + | status | count | + | APPROVED | 2 | + | FAILED | 1 | + + @conversion + Scenario Outline: Convert grade acronym to numeric value + Given I have a grade acronym "" + When I convert it to a numeric value + Then the result should be + + Examples: + | acronym | value | + | MA | 10 | + | MPA | 7 | + | MANA | 0 | + + @status @happy-path + Scenario: Student with all MA grades should be APPROVED + Given a student has the following grades: + | goal | grade | + | Requirements | MA | + | Design | MA | + | Tests | MA | + When I evaluate the student's final status + Then the status should be "APPROVED" + + @status @edge-case + Scenario: Student with all MANA grades should be FAILED + Given a student has the following grades: + | goal | grade | + | Requirements | MANA | + | Design | MANA | + | Tests | MANA | + When I evaluate the student's final status + Then the status should be "FAILED" \ No newline at end of file diff --git a/server/src/models/ApprovalCriteria.ts b/server/src/models/ApprovalCriteria.ts new file mode 100644 index 00000000..a956c042 --- /dev/null +++ b/server/src/models/ApprovalCriteria.ts @@ -0,0 +1,66 @@ +import { Enrollment } from './Enrollment'; + +export type StudentStatus = + | 'APPROVED' + | 'APPROVED_FINAL' + | 'FAILED' + | 'FAILED_BY_ABSENCE' + | 'PENDING'; + +export interface IApprovalCriteria { + readonly directApprovalThreshold: number; + readonly finalExamEligibilityThreshold: number; + readonly postFinalApprovalThreshold: number; + + /** + * Determines the student status based on their grades and enrollment data. + * @param enrollment The student's enrollment data + * @param mediaPreFinal The calculated pre-final average (null if no data) + * @returns Student's approval status + */ + determineStatus(enrollment: Enrollment, mediaPreFinal: number | null): StudentStatus; +} + +/** + * Default approval criteria. + * + * Thresholds: + * - Direct approval: average >= 7.0 + * - Final exam eligibility: average >= 3.0 and < 7.0 + * - Post-final approval: final average >= 5.0 + * - Direct failure: average < 3.0 + */ +export class DefaultApprovalCriteria implements IApprovalCriteria { + readonly directApprovalThreshold: number = 7.0; + readonly finalExamEligibilityThreshold: number = 3.0; + readonly postFinalApprovalThreshold: number = 5.0; + + determineStatus(enrollment: Enrollment, mediaPreFinal: number | null): StudentStatus { + if (enrollment.getReprovadoPorFalta()) { + return 'FAILED_BY_ABSENCE'; + } + + const mediaPosFinal = enrollment.getMediaPosFinal(); + + if (mediaPosFinal !== null && mediaPosFinal !== 0) { + if (mediaPosFinal >= this.postFinalApprovalThreshold) { + return 'APPROVED_FINAL'; + } + return 'FAILED'; + } + + if (mediaPreFinal === null) { + return 'PENDING'; + } + + if (mediaPreFinal >= this.directApprovalThreshold) { + return 'APPROVED'; + } + + if (mediaPreFinal < this.finalExamEligibilityThreshold) { + return 'FAILED'; + } + + return 'PENDING'; + } +} diff --git a/server/src/models/EspecificacaoDoCalculoDaMedia.ts b/server/src/models/EspecificacaoDoCalculoDaMedia.ts index 7abcab51..5eddcc4f 100644 --- a/server/src/models/EspecificacaoDoCalculoDaMedia.ts +++ b/server/src/models/EspecificacaoDoCalculoDaMedia.ts @@ -52,6 +52,14 @@ export class EspecificacaoDoCalculoDaMedia { // Reconstrói uma instância a partir de dados serializados static fromJSON(data: any): EspecificacaoDoCalculoDaMedia { + // Handle undefined or null data by returning default instance + if (!data) { + return new EspecificacaoDoCalculoDaMedia( + DEFAULT_PESOS_DOS_CONCEITOS, + DEFAULT_PESOS_DAS_METAS + ); + } + const normalize = (x: any): Map => { if (!x) return new Map(); // já é objeto { key: value, ... } @@ -86,9 +94,12 @@ const DEFAULT_PESOS_DOS_CONCEITOS = new Map([ ]); const DEFAULT_PESOS_DAS_METAS = new Map([ - ['Gerência de Configuração', 1], - ['Gerência de Projeto', 1], - ['Qualidade de Software', 1], + ['Requirements', 1], + ['Configuration Management', 1], + ['Project Management', 1], + ['Design', 1], + ['Tests', 1], + ['Refactoring', 1], ]); export const DEFAULT_ESPECIFICACAO_DO_CALCULO_DA_MEDIA = new EspecificacaoDoCalculoDaMedia( diff --git a/server/src/models/Report.ts b/server/src/models/Report.ts index 0174f811..5a7eac6b 100644 --- a/server/src/models/Report.ts +++ b/server/src/models/Report.ts @@ -1,10 +1,13 @@ import { Class } from './Class'; import { Enrollment } from './Enrollment'; import { Grade } from './Evaluation'; +import { StudentStatus, IApprovalCriteria, DefaultApprovalCriteria } from './ApprovalCriteria'; + +export { StudentStatus } from './ApprovalCriteria'; export interface EvaluationPerformance { goal: string; - averageGrade: number; + averageGrade: number | null; gradeDistribution: { MANA: number; MPA: number; @@ -13,12 +16,10 @@ export interface EvaluationPerformance { evaluatedStudents: number; } -export type StudentStatus = 'APPROVED' | 'APPROVED_FINAL' | 'FAILED'; - export interface StudentEntry { studentId: string; name: string; - finalGrade: number; + finalGrade: number | null; status: StudentStatus; } @@ -28,81 +29,263 @@ export interface ReportData { semester: number; year: number; totalEnrolled: number; - studentsAverage: number; + studentsAverage: number | null; approvedCount: number; approvedFinalCount: number; notApprovedCount: number; + failedByAbsenceCount: number; + pendingCount: number; evaluationPerformance: EvaluationPerformance[]; - students: StudentEntry[]; + students: StudentEntry[]; generatedAt: Date; } export interface IReportGenerator { generate(): ReportData; + + toJSON(): ReportData; } export class Report implements IReportGenerator { private classObj: Class; + private approvalCriteria: IApprovalCriteria; - constructor(classObj: Class) { + constructor(classObj: Class, approvalCriteria: IApprovalCriteria = new DefaultApprovalCriteria()) { this.classObj = classObj; + this.approvalCriteria = approvalCriteria; } - /** - * Generates the full class report. - * @returns ReportData object compliant with the interface. - */ - public generate(): ReportData { - // Not implemented yet. - - return { - classId: this.classObj.getClassId(), - topic: this.classObj.getTopic(), - semester: this.classObj.getSemester(), - year: this.classObj.getYear(), - totalEnrolled: 0, - studentsAverage: 0, - approvedCount: 0, - approvedFinalCount: 0, - notApprovedCount: 0, - evaluationPerformance: [], - students: [], - generatedAt: new Date() + // Gets the grade values from the class specification or returns defaults. + private getGradeValues(): Record { + const defaultValues: Record = { + 'MA': 10, + 'MPA': 7, + 'MANA': 0 }; + + try { + const especificacao = this.classObj.getEspecificacaoDoCalculoDaMedia(); + const json = especificacao.toJSON(); + if (json.pesosDosConceitos) { + return { + 'MA': json.pesosDosConceitos['MA'] ?? defaultValues['MA'], + 'MPA': json.pesosDosConceitos['MPA'] ?? defaultValues['MPA'], + 'MANA': json.pesosDosConceitos['MANA'] ?? defaultValues['MANA'] + }; + } + } catch { + // Use default values + } + + return defaultValues; } - - private calculateStudentAverage(enrollment: Enrollment): number { - // Not implemented yet. - return 0; + // Calculates the student average. Returns null if no grade data is available. + private calculateStudentAverage(enrollment: Enrollment): number | null { + const mediaPreFinal = enrollment.getMediaPreFinal(); + if (mediaPreFinal !== null && mediaPreFinal !== 0) { + return mediaPreFinal; + } + + const evaluations = enrollment.getEvaluations(); + + if (evaluations.length === 0) { + return null; + } + + const notasDasMetas = new Map(); + evaluations.forEach(evaluation => { + notasDasMetas.set(evaluation.getGoal(), evaluation.getGrade()); + }); + + try { + const especificacao = this.classObj.getEspecificacaoDoCalculoDaMedia(); + const result = especificacao.calc(notasDasMetas); + + if (!isNaN(result)) { + return result; + } + } catch { + // Fall through to simple average calculation + } + + const gradeValues = this.getGradeValues(); + + const totalGrade = evaluations.reduce((sum, evaluation) => { + return sum + gradeValues[evaluation.getGrade()]; + }, 0); + + return totalGrade / evaluations.length; } + + // Gets the student's final grade. Returns null if no grade data is available. + private getStudentFinalGrade(enrollment: Enrollment): number | null { + const mediaPosFinal = enrollment.getMediaPosFinal(); + if (mediaPosFinal !== null && mediaPosFinal !== 0) { + return mediaPosFinal; + } + return this.calculateStudentAverage(enrollment); + } + + // Calculates the class average. Returns null if no students have finalized grades. + // Only includes students who are not PENDING. + private calculateClassAverage(): number | null { + const enrollments = this.classObj.getEnrollments(); + + if (enrollments.length === 0) { + return null; + } + + const gradesWithData = enrollments + .filter(enrollment => this.getStudentStatus(enrollment) !== 'PENDING') + .map(enrollment => this.getStudentFinalGrade(enrollment)) + .filter((grade): grade is number => grade !== null); - private calculateClassAverage(): number { - // Not implemented yet. - return 0; + if (gradesWithData.length === 0) { + return null; + } + + const totalAverage = gradesWithData.reduce((sum, grade) => sum + grade, 0); + return Math.round((totalAverage / gradesWithData.length) * 100) / 100; } - private isStudentApproved(enrollment: Enrollment): boolean { - // Not implemented yet. - return false; + // Determines the student status using the configured approval criteria strategy. + private getStudentStatus(enrollment: Enrollment): StudentStatus { + const mediaPreFinal = this.calculateStudentAverage(enrollment); + return this.approvalCriteria.determineStatus(enrollment, mediaPreFinal); } - private calculateApprovalStats(): { approved: number; approvedFinal: number; notApproved: number } { - // Not implemented yet. - return { approved: 0, approvedFinal: 0, notApproved: 0 }; + private calculateApprovalStats(): { approved: number; + approvedFinal: number; + notApproved: number; + failedByAbsence: number; + pending: number } { + const enrollments = this.classObj.getEnrollments(); + + let approved = 0; + let approvedFinal = 0; + let notApproved = 0; + let failedByAbsence = 0; + let pending = 0; + + enrollments.forEach(enrollment => { + const status = this.getStudentStatus(enrollment); + if (status === 'APPROVED') { + approved++; + } else if (status === 'APPROVED_FINAL') { + approvedFinal++; + } else if (status === 'FAILED_BY_ABSENCE') { + failedByAbsence++; + } else if (status === 'PENDING') { + pending++; + } else { + notApproved++; + } + }); + + return { approved, approvedFinal, notApproved, failedByAbsence, pending }; } - private calculateEvaluationPerformance(): EvaluationPerformance[] { - // Not implemented yet. - return []; + private calculateEvaluationPerformance(): EvaluationPerformance[] { + const enrollments = this.classObj.getEnrollments(); + const goalMap = new Map(); + + enrollments.forEach(enrollment => { + const evaluations = enrollment.getEvaluations(); + evaluations.forEach(evaluation => { + const goal = evaluation.getGoal(); + const grade = evaluation.getGrade(); + + if (!goalMap.has(goal)) { + goalMap.set(goal, { + grades: [], + gradeDistribution: { MANA: 0, MPA: 0, MA: 0 } + }); + } + + const goalData = goalMap.get(goal)!; + goalData.grades.push(grade); + goalData.gradeDistribution[grade]++; + }); + }); + + const gradeValues = this.getGradeValues(); + const performance: EvaluationPerformance[] = []; + + goalMap.forEach((data, goal) => { + const totalGrade = data.grades.reduce((sum, grade) => { + return sum + gradeValues[grade]; + }, 0); + + const averageGrade = data.grades.length > 0 ? totalGrade / data.grades.length : null; + + performance.push({ + goal, + averageGrade: averageGrade !== null ? Math.round(averageGrade * 100) / 100 : null, + gradeDistribution: data.gradeDistribution, + evaluatedStudents: data.grades.length + }); + }); + + return performance.sort((a, b) => a.goal.localeCompare(b.goal)); } private getStudentReports(): StudentEntry[] { - // Not implemented yet. - return []; + const enrollments = this.classObj.getEnrollments(); + + return enrollments.map(enrollment => { + const student = enrollment.getStudent(); + const status = this.getStudentStatus(enrollment); + + // Don't show final grade for pending students + let finalGrade: number | null = null; + if (status !== 'PENDING') { + const rawGrade = this.getStudentFinalGrade(enrollment); + finalGrade = rawGrade !== null ? Math.round(rawGrade * 100) / 100 : null; + } + + return { + studentId: student.getCPF(), + name: student.name, + finalGrade, + status + }; + }); + } + + /** + * Generates the full class report. + * @returns ReportData object compliant with the interface. + */ + public generate(): ReportData { + const enrollments = this.classObj.getEnrollments(); + const approvalStats = this.calculateApprovalStats(); + const evaluationPerformance = this.calculateEvaluationPerformance(); + const students = this.getStudentReports(); + const classAverage = this.calculateClassAverage(); + + return { + classId: this.classObj.getClassId(), + topic: this.classObj.getTopic(), + semester: this.classObj.getSemester(), + year: this.classObj.getYear(), + totalEnrolled: enrollments.length, + studentsAverage: classAverage, + approvedCount: approvalStats.approved, + approvedFinalCount: approvalStats.approvedFinal, + notApprovedCount: approvalStats.notApproved, + failedByAbsenceCount: approvalStats.failedByAbsence, + pendingCount: approvalStats.pending, + evaluationPerformance, + students, + generatedAt: new Date() + }; } public toJSON(): ReportData { return this.generate(); } -} \ No newline at end of file +} diff --git a/server/src/models/Student.ts b/server/src/models/Student.ts index 1da82a97..eca7d954 100644 --- a/server/src/models/Student.ts +++ b/server/src/models/Student.ts @@ -56,6 +56,10 @@ export class Student { } } + getName(): string { + return this.name; + } + // Format CPF for display (000.000.000-00) getFormattedCPF(): string { return this.cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4'); diff --git a/server/src/server.ts b/server/src/server.ts index 8062087f..d4e5012d 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -1,5 +1,7 @@ import express, { Request, Response } from 'express'; import cors from 'cors'; +import multer from 'multer'; +import * as XLSX from 'xlsx'; import { StudentSet } from './models/StudentSet'; import { Student } from './models/Student'; import { Evaluation } from './models/Evaluation'; @@ -10,11 +12,8 @@ import * as fs from 'fs'; import * as path from 'path'; import { EspecificacaoDoCalculoDaMedia, DEFAULT_ESPECIFICACAO_DO_CALCULO_DA_MEDIA } from './models/EspecificacaoDoCalculoDaMedia'; -// usado para ler arquivos em POST -const multer = require('multer'); - -// pasta usada para salvar os upload's feitos -const upload_dir = multer({dest: 'tmp_data/'}) +// Configure multer for temporary file storage (used by gradeImport endpoint) +const upload_dir = multer({ dest: 'tmp_data/' }); const app = express(); const PORT = 3005; @@ -23,6 +22,14 @@ const PORT = 3005; app.use(cors()); app.use(express.json()); +// Configure multer for file uploads (in-memory storage) +const upload = multer({ + storage: multer.memoryStorage(), + limits: { + fileSize: 5 * 1024 * 1024 // 5MB limit + } +}); + // In-memory storage with file persistence const studentSet = new StudentSet(); const classes = new Classes(); @@ -406,6 +413,118 @@ app.delete('/api/classes/:classId/enroll/:studentCPF', (req: Request, res: Respo } }); +// POST /api/classes/:classId/enroll-bulk - Bulk enroll students from spreadsheet +app.post('/api/classes/:classId/enroll-bulk', (req: Request, res: Response) => { + upload.single('file')(req, res, (err: any) => { + try { + // Handle multer errors + if (err) { + console.error('Multer error:', err); + return res.status(400).json({ + error: 'Erro ao processar o arquivo enviado.' + }); + } + + const { classId } = req.params; + + // Validation: Check if file was uploaded + if (!req.file) { + return res.status(400).json({ + error: 'Nenhum arquivo foi enviado. Por favor, envie um arquivo .xlsx ou .csv.' + }); + } + + // Find the class + const classObj = classes.findClassById(classId); + if (!classObj) { + return res.status(404).json({ error: 'Turma não encontrada' }); + } + + // Read the spreadsheet from buffer + const workbook = XLSX.read(req.file.buffer, { type: 'buffer' }); + + // Get the first sheet + const firstSheetName = workbook.SheetNames[0]; + if (!firstSheetName) { + return res.status(400).json({ + error: 'O arquivo enviado está vazio ou não é suportado (apenas .xlsx ou .csv permitido). Por favor, envie um arquivo com matrículas válidas.' + }); + } + + const worksheet = workbook.Sheets[firstSheetName]; + + // Convert to JSON + const data: any[] = XLSX.utils.sheet_to_json(worksheet); + + // Validation: Check if spreadsheet has data + if (!data || data.length === 0) { + return res.status(400).json({ + error: 'O arquivo enviado está vazio ou não é suportado (apenas .xlsx ou .csv permitido). Por favor, envie um arquivo com matrículas válidas.' + }); + } + + // Initialize counters + let importedCount = 0; + let rejectedCount = 0; + + // Process each row + for (const row of data) { + // Get CPF from the row (try different possible column names) + const cpfValue = row.cpf || row.CPF || row.matricula || row.Matricula || row.Matrícula; + + if (!cpfValue) { + continue; // Skip rows without CPF (blank lines) + } + + // Clean and convert CPF to string + const cpfString = String(cpfValue).trim(); + const cleanedCPF = cleanCPF(cpfString); + + // Check if student exists + const student = studentSet.findStudentByCPF(cleanedCPF); + if (!student) { + // Student not found in the system - count as rejected + rejectedCount++; + console.log(`Student ${cleanedCPF} not found in system - rejected`); + continue; + } + + // Check if student is already enrolled + const existingEnrollment = classObj.findEnrollmentByStudentCPF(cleanedCPF); + if (existingEnrollment) { + continue; // Skip if already enrolled (Scenario 2) - not counted as rejected + } + + // Enroll the student (Scenario 1) + try { + classObj.addEnrollment(student); + importedCount++; + console.log(`Student ${cleanedCPF} successfully enrolled`); + } catch (error) { + // Error adding enrollment, count as rejected + rejectedCount++; + console.error(`Error enrolling student ${cleanedCPF}:`, error); + } + } + + // Save changes to file + triggerSave(); + + // Return response with counters + res.status(200).json({ + importedCount, + rejectedCount + }); + + } catch (error) { + console.error('Error processing bulk enrollment:', error); + res.status(500).json({ + error: 'Erro ao processar o arquivo. Por favor, verifique o formato e tente novamente.' + }); + } + }); +}); + // GET /api/classes/:classId/enrollments - Get all enrollments for a class app.get('/api/classes/:classId/enrollments', (req: Request, res: Response) => { try { @@ -491,6 +610,57 @@ app.put('/api/classes/:classId/enrollments/:studentCPF/evaluation', (req: Reques } }); +// POST /api/compare-classes - Compare multiple classes and return their reports +app.post('/api/compare-classes', (req: Request, res: Response) => { + try { + const { classes: classNames } = req.body; + + if (!Array.isArray(classNames)) { + return res.status(400).json({ error: 'Classes array is required' }); + } + + if (classNames.length < 2) { + return res.status(400).json({ error: 'At least two classes are required for comparison' }); + } + + if (classNames.length > 6) { + return res.status(400).json({ error: 'The maximum number of classes allowed for comparison is 6' }); + } + + // Find classes by topic (case-insensitive contains) + const foundClasses = classNames.map((name: string) => { + const matches = classes.findClassesByTopic(name); + return matches && matches.length > 0 ? matches[0] : undefined; + }); + + // Check for classes with no enrolled students + const classesWithNoStudents: string[] = []; + foundClasses.forEach((cls: any, idx: number) => { + if (!cls) { + // treat missing class as having no students + classesWithNoStudents.push(classNames[idx]); + } else if (!cls.getEnrollments || cls.getEnrollments().length === 0) { + classesWithNoStudents.push(classNames[idx]); + } + }); + + if (classesWithNoStudents.length > 0) { + return res.status(422).json({ error: `${classesWithNoStudents.join(', ')} has no enrolled students` }); + } + + // Build comparison data using Report for each class + const comparisonData: any = {}; + foundClasses.forEach((cls: any, idx: number) => { + const report = new Report(cls); + comparisonData[classNames[idx]] = report.toJSON(); + }); + + return res.status(200).json({ comparisonData }); + } catch (error) { + return res.status(500).json({ error: (error as Error).message }); + } +}); + // POST api/classes/gradeImport/:classId, usado na feature de importacao de grades // Vai ser usado em 2 fluxos(poderia ter divido em 2 endpoints mas preferi deixar em apenas 1) // [Front] Upload → [Back] lê só o cabeçalho e retorna colunas da planilha e os goals da 'classId' @@ -516,7 +686,6 @@ app.get('/api/classes/:classId/report', (req: Request, res: Response) => { } }); - // Export the app for testing export { app, studentSet, classes }; diff --git a/server/src/step-definitions/integration/data-persistence-steps.ts b/server/src/step-definitions/integration/data-persistence-steps.ts new file mode 100644 index 00000000..1a224a3a --- /dev/null +++ b/server/src/step-definitions/integration/data-persistence-steps.ts @@ -0,0 +1,270 @@ +/** + * Integration Test Step Definitions for Data Persistence + * + * Layer: Integration Tests (Middle-Upper of Testing Pyramid) + * Context: Tests flow between API and data persistence layer + * + * Uses supertest for HTTP calls and verifies data consistency + * between write operations and subsequent read operations. + */ + +import { Given, When, Then, Before, After, DataTable, setDefaultTimeout } from '@cucumber/cucumber'; +import request from 'supertest'; +import expect from 'expect'; +import { app } from '../../server'; + +setDefaultTimeout(60 * 1000); + +// ============================================================================= +// Test State +// ============================================================================= + +let response: request.Response; +let currentClassId: string | null = null; +let createdStudentCPFs: string[] = []; +let studentNameToCPF: Record = {}; + +// ============================================================================= +// Hooks +// ============================================================================= + +Before({ tags: '@integration' }, async function () { + currentClassId = null; + createdStudentCPFs = []; + studentNameToCPF = {}; +}); + +After({ tags: '@integration' }, async function () { + // Cleanup: Delete all created students + for (const cpf of createdStudentCPFs) { + try { + await request(app).delete(`/api/students/${cpf}`); + } catch (e) { + // Ignore cleanup errors + } + } + + // Cleanup: Delete test class + if (currentClassId) { + try { + await request(app).delete(`/api/classes/${currentClassId}`); + } catch (e) { + // Ignore cleanup errors + } + } +}); + +// ============================================================================= +// Helper Functions +// ============================================================================= + +function normalizeCPF(cpf: string): string { + return cpf.replace(/[.\-]/g, ''); +} + +async function createStudent(name: string, cpf: string): Promise { + const normalizedCPF = normalizeCPF(cpf); + const email = `${name.toLowerCase().replace(/\s+/g, '.')}@test.com`; + + const res = await request(app) + .post('/api/students') + .send({ name, cpf: normalizedCPF, email }); + + if (res.status !== 201) { + if (res.status === 400 && res.body.error && res.body.error.includes('already exists')) { + // Student already exists, that's okay + } else { + throw new Error(`Failed to create student: ${res.status} ${JSON.stringify(res.body)}`); + } + } + + createdStudentCPFs.push(normalizedCPF); + studentNameToCPF[name] = normalizedCPF; +} + +async function enrollStudent(cpf: string): Promise { + if (!currentClassId) throw new Error('No class ID'); + const normalizedCPF = normalizeCPF(cpf); + const res = await request(app) + .post(`/api/classes/${currentClassId}/enroll`) + .send({ studentCPF: normalizedCPF }); + + if (res.status !== 201 && res.status !== 400) { + throw new Error(`Failed to enroll student ${normalizedCPF}: ${res.status} ${JSON.stringify(res.body)}`); + } +} + +async function unenrollStudent(cpf: string): Promise { + if (!currentClassId) throw new Error('No class ID'); + const normalizedCPF = normalizeCPF(cpf); + await request(app) + .delete(`/api/classes/${currentClassId}/enroll/${normalizedCPF}`); +} + +async function addGrade(cpf: string, goal: string, grade: string): Promise { + if (!currentClassId) throw new Error('No class ID'); + const normalizedCPF = normalizeCPF(cpf); + const res = await request(app) + .put(`/api/classes/${currentClassId}/enrollments/${normalizedCPF}/evaluation`) + .send({ goal, grade }); + + if (res.status !== 200) { + throw new Error(`Failed to add grade: ${res.status} ${JSON.stringify(res.body)}`); + } +} + +async function addCompleteGrades(cpf: string): Promise { + const goals = ['Requirements', 'Configuration Management', 'Project Management', 'Design', 'Tests', 'Refactoring']; + for (const goal of goals) { + await addGrade(cpf, goal, 'MA'); + } +} + +// ============================================================================= +// GIVEN Steps +// ============================================================================= + +Given('the API is connected to the Test Database', async function () { + const res = await request(app).get('/api/students'); + expect(res.status).toBe(200); +}); + +Given('a fresh class {string} exists', async function (topic: string) { + const res = await request(app) + .post('/api/classes') + .send({ + topic, + semester: 1, + year: 2025 + }); + + currentClassId = res.body.id; +}); + +Given('the class {string} has exactly {string} existing students', async function (className: string, count: string) { + const studentCount = parseInt(count, 10); + + for (let i = 1; i <= studentCount; i++) { + const cpf = `999999999${i.toString().padStart(2, '0')}`; + await createStudent(`Existing Student ${i}`, cpf); + await enrollStudent(cpf); + } +}); + +Given('the class {string} has the following students:', async function (className: string, dataTable: DataTable) { + const rows = dataTable.hashes(); + + for (const row of rows) { + await createStudent(row.Name, row.CPF); + await enrollStudent(row.CPF); + } +}); + +Given('the class {string} has a student {string}', async function (className: string, studentName: string) { + const cpf = `88888888${(createdStudentCPFs.length + 1).toString().padStart(3, '0')}`; + await createStudent(studentName, cpf); + await enrollStudent(cpf); +}); + +Given('{string} has the grades:', async function (studentName: string, dataTable: DataTable) { + const cpf = studentNameToCPF[studentName]; + if (!cpf) throw new Error(`Student ${studentName} not found`); + + const rows = dataTable.raw(); + + for (const row of rows) { + if (row.length >= 2) { + const goal = row[0].trim(); + const grade = row[1].trim(); + if (goal && grade) { + await addGrade(cpf, goal, grade); + } + } + } +}); + +Given('the class {string} is empty', async function (className: string) { + // Class already created in Background, just verify it has no enrollments +}); + +// ============================================================================= +// WHEN Steps +// ============================================================================= + +When('I enroll a new student with CPF {string}', async function (cpf: string) { + const studentName = `New Student ${createdStudentCPFs.length + 1}`; + await createStudent(studentName, cpf); + await enrollStudent(cpf); +}); + +When('I unenroll the student {string}', async function (cpf: string) { + await unenrollStudent(cpf); +}); + +When('I update {string} grade for {string} to {string}', async function (studentName: string, goal: string, grade: string) { + const cpf = studentNameToCPF[studentName]; + if (!cpf) throw new Error(`Student ${studentName} not found`); + await addGrade(cpf, goal, grade); +}); + +When('I request the report for {string}', async function (className: string) { + if (!currentClassId) throw new Error('No class ID'); + response = await request(app).get(`/api/classes/${currentClassId}/report`); +}); + +When('I perform the following operations in order:', async function (dataTable: DataTable) { + const operations = dataTable.hashes(); + + for (const op of operations) { + const action = op.Action.toLowerCase(); + const cpf = op.CPF; + const studentName = op['Student Name']; + + if (action === 'enroll') { + await createStudent(studentName, cpf); + await enrollStudent(cpf); + } else if (action === 'unenroll') { + await unenrollStudent(cpf); + } + } +}); + +// ============================================================================= +// THEN Steps +// ============================================================================= + +Then('the {string} count should be {int}', function (field: string, expected: number) { + expect(response.body[field]).toBe(expected); +}); + +Then('the student {string} should NOT be present in the list', function (studentName: string) { + const students = response.body.students || []; + const found = students.find((s: any) => s.name === studentName); + expect(found).toBeUndefined(); +}); + +Then('{string} should have status {string}', function (studentName: string, expectedStatus: string) { + const students = response.body.students || []; + const student = students.find((s: any) => s.name === studentName); + expect(student).toBeDefined(); + expect(student.status).toBe(expectedStatus); +}); + +Then('the {string} should be {int}', function (field: string, expected: number) { + expect(response.body[field]).toBe(expected); +}); + +Then('the list should contain {string} and {string}', function (name1: string, name2: string) { + const students = response.body.students || []; + const names = students.map((s: any) => s.name); + + expect(names).toContain(name1); + expect(names).toContain(name2); +}); + +Then('the list should NOT contain {string}', function (studentName: string) { + const students = response.body.students || []; + const names = students.map((s: any) => s.name); + + expect(names).not.toContain(studentName); +}); diff --git a/server/src/step-definitions/service/report-api-steps.ts b/server/src/step-definitions/service/report-api-steps.ts new file mode 100644 index 00000000..ef8fff70 --- /dev/null +++ b/server/src/step-definitions/service/report-api-steps.ts @@ -0,0 +1,219 @@ +import { Given, When, Then, Before, After, DataTable, setDefaultTimeout } from '@cucumber/cucumber'; +import request from 'supertest'; +import expect from 'expect'; +import { app } from '../../server'; + +setDefaultTimeout(30 * 1000); + +let response: request.Response; +let currentClassId: string | null = null; +let createdStudentCPFs: string[] = []; + +// Hooks + +Before({ tags: '@service' }, async function () { + currentClassId = null; + createdStudentCPFs = []; +}); + +After({ tags: '@service' }, async function () { + for (const cpf of createdStudentCPFs) { + await request(app).delete(`/api/students/${cpf}`).catch(() => {}); + } + if (currentClassId) { + await request(app).delete(`/api/classes/${currentClassId}`).catch(() => {}); + } +}); + +// Helper Functions + +async function createClass(topic: string): Promise { + const res = await request(app) + .post('/api/classes') + .send({ topic, semester: 1, year: 2025 }); + currentClassId = res.body.id; + return currentClassId!; +} + +async function createStudent(name: string, cpf: string): Promise { + const res = await request(app) + .post('/api/students') + .send({ name, cpf, email: `${name.toLowerCase().replace(/\s+/g, '.')}@test.com` }); + + if (res.status !== 201 && res.status !== 400) { + throw new Error(`Failed to create student: ${res.status} ${JSON.stringify(res.body)}`); + } + + createdStudentCPFs.push(cpf); +} + +async function enrollStudent(classId: string, cpf: string): Promise { + const res = await request(app) + .post(`/api/classes/${classId}/enroll`) + .send({ studentCPF: cpf }); + + if (res.status !== 201 && res.status !== 400) { + throw new Error(`Failed to enroll student: ${res.status} ${JSON.stringify(res.body)}`); + } +} + +async function addGrade(classId: string, cpf: string, goal: string, grade: string): Promise { + await request(app) + .put(`/api/classes/${classId}/enrollments/${cpf}/evaluation`) + .send({ goal, grade }); +} + +async function addAllGradesForStudent(classId: string, cpf: string, grades: string[]): Promise { + const goals = ['Requirements', 'Configuration Management', 'Project Management', 'Design', 'Tests', 'Refactoring']; + for (let i = 0; i < Math.min(grades.length, goals.length); i++) { + if (grades[i]) { + await addGrade(classId, cpf, goals[i], grades[i]); + } + } +} + +// Given Steps + +Given('the API Controller is ready', async function () { + const res = await request(app).get('/api/students'); + expect(res.status).toBe(200); +}); + +Given('a class exists with ID {string} containing students', async function (topic: string) { + const classId = await createClass(topic); + await createStudent('Test Student 1', '99999999901'); + await enrollStudent(classId, '99999999901'); + await addGrade(classId, '99999999901', 'Requirements', 'MA'); + await addGrade(classId, '99999999901', 'Design', 'MA'); + await addGrade(classId, '99999999901', 'Tests', 'MA'); +}); + +Given('the repository returns a class {string} with:', async function (topic: string, dataTable: DataTable) { + const classId = await createClass(topic); + const rows = dataTable.hashes(); + + let studentIndex = 1; + for (const row of rows) { + const cpf = `99999999${studentIndex.toString().padStart(3, '0')}`; + await createStudent(row.Name, cpf); + await enrollStudent(classId, cpf); + + const gradesStr = row.Grades || ''; + const grades = gradesStr.split(',').map((g: string) => g.trim()).filter((g: string) => g); + + if (grades.length > 0) { + await addAllGradesForStudent(classId, cpf, grades); + } + + studentIndex++; + } +}); + +Given('a class exists with {string} students having {string} evaluations', async function (studentCount: string, _evalCount: string) { + const classId = await createClass('Pending Students Class'); + const count = parseInt(studentCount, 10); + + for (let i = 1; i <= count; i++) { + const cpf = `88888888${i.toString().padStart(3, '0')}`; + await createStudent(`Student ${i}`, cpf); + await enrollStudent(classId, cpf); + } +}); + +Given('a class exists with {string} students', async function (count: string) { + const studentCount = parseInt(count, 10); + const classId = await createClass('Test Class'); + + for (let i = 1; i <= studentCount; i++) { + const cpf = `77777777${i.toString().padStart(3, '0')}`; + await createStudent(`Student ${i}`, cpf); + await enrollStudent(classId, cpf); + } +}); + +Given('the repository finds no class with ID {string}', function (classId: string) { + currentClassId = classId; +}); + +// When Steps + +When('I request the report for class {string}', async function (classId: string) { + if (currentClassId) { + response = await request(app).get(`/api/classes/${currentClassId}/report`); + } else { + response = await request(app).get(`/api/classes/${classId}/report`); + } +}); + +When('I request the report for this class', async function () { + if (!currentClassId) throw new Error('No class ID available'); + response = await request(app).get(`/api/classes/${currentClassId}/report`); +}); + +// Then Steps + +Then('the response status should be {int}', function (expectedStatus: number) { + expect(response.status).toBe(expectedStatus); +}); + +Then('the response body should match the {string} JSON schema', function (schemaName: string) { + const body = response.body; + expect(body).toHaveProperty('classId'); + expect(body).toHaveProperty('totalEnrolled'); + expect(body).toHaveProperty('students'); + expect(body).toHaveProperty('evaluationPerformance'); +}); + +Then('the payload should contain the following root keys:', function (dataTable: DataTable) { + const expectedKeys = dataTable.raw().flat(); + const actualKeys = Object.keys(response.body); + + for (const key of expectedKeys) { + expect(actualKeys).toContain(key); + } +}); + +Then('the aggregated statistics should be:', function (dataTable: DataTable) { + const rows = dataTable.hashes(); + + for (const row of rows) { + const field = row.field; + const expectedValue = row.value; + + if (expectedValue === 'null') { + expect(response.body[field]).toBeNull(); + } else if (expectedValue.includes('.')) { + expect(response.body[field]).toBeCloseTo(parseFloat(expectedValue), 1); + } else { + expect(response.body[field]).toBe(parseInt(expectedValue, 10)); + } + } +}); + +Then('the {string} field should be null', function (field: string) { + expect(response.body[field]).toBeNull(); +}); + +Then('the {string} field should be {int}', function (field: string, expected: number) { + expect(response.body[field]).toBe(expected); +}); + +Then('the {string} should equal {string}', function (field: string, expected: string) { + expect(response.body[field]).toBe(parseInt(expected, 10)); +}); + +Then('the {string} list should be empty', function (field: string) { + expect(Array.isArray(response.body[field])).toBe(true); + expect(response.body[field].length).toBe(0); +}); + +Then('the error message should indicate {string}', function (expectedMessage: string) { + const errorMessage = response.body.error || response.body.message || ''; + expect(errorMessage.toLowerCase()).toContain(expectedMessage.toLowerCase()); +}); + +Then('no field should contain {string} or {string}', function (val1: string, val2: string) { + const jsonStr = JSON.stringify(response.body); + expect(jsonStr).not.toContain(val1); + expect(jsonStr).not.toContain(val2); +}); diff --git a/server/src/step-definitions/unit/grade-calculations-steps.ts b/server/src/step-definitions/unit/grade-calculations-steps.ts new file mode 100644 index 00000000..6eff76fd --- /dev/null +++ b/server/src/step-definitions/unit/grade-calculations-steps.ts @@ -0,0 +1,156 @@ +/** + * Unit Test Step Definitions for Grade Calculations + * + * Layer: Unit Tests (Bottom of Testing Pyramid) + * Context: Fast, in-memory validation of business rules + * + * These tests run pure functions without any external dependencies. + * No database, no HTTP calls, no browser automation. + */ + +import { Given, When, Then, DataTable } from '@cucumber/cucumber'; +import expect from 'expect'; + +// ============================================================================= +// Pure Functions Under Test (extracted from domain logic) +// ============================================================================= + +/** + * Calculates the average of grades, ignoring null values. + * Returns 0 if the list is empty or contains only nulls. + */ +function calculateAverage(grades: (number | null)[]): number { + const validGrades = grades.filter((g): g is number => g !== null); + if (validGrades.length === 0) return 0; + const sum = validGrades.reduce((acc, grade) => acc + grade, 0); + return sum / validGrades.length; +} + +/** + * Converts a grade acronym to its numeric value. + */ +function convertGradeToValue(acronym: string): number { + const gradeMap: Record = { + 'MA': 10, + 'MPA': 7, + 'MANA': 0 + }; + return gradeMap[acronym] ?? 0; +} + +/** + * Groups students by their status and returns counts. + */ +function groupStudentsByStatus(students: Array<{ name: string; status: string }>): Record { + return students.reduce((acc, student) => { + acc[student.status] = (acc[student.status] || 0) + 1; + return acc; + }, {} as Record); +} + +/** + * Determines student status based on grades. + * APPROVED: average >= 7.0 + * FAILED: average < 3.0 + * PENDING: otherwise (or incomplete data) + */ +function determineStudentStatus(grades: Array<{ goal: string; grade: string }>): string { + if (grades.length === 0) return 'PENDING'; + + const gradeValues = grades.map(g => convertGradeToValue(g.grade)); + const average = calculateAverage(gradeValues); + + if (average >= 7.0) return 'APPROVED'; + if (average < 3.0) return 'FAILED'; + return 'PENDING'; +} + +// ============================================================================= +// Test State +// ============================================================================= + +let gradeList: (number | null)[] = []; +let gradeAcronym: string = ''; +let studentGrades: Array<{ goal: string; grade: string }> = []; +let studentList: Array<{ name: string; status: string }> = []; +let calculationResult: number = 0; +let statusResult: string = ''; +let groupingResult: Record = {}; + +// ============================================================================= +// GIVEN Steps +// ============================================================================= + +// Pattern: [10, null, 5] +Given(/^I have a list of grades with values \[([\d.]+), null, ([\d.]+)\]$/, function (first: string, second: string) { + gradeList = [parseFloat(first), null, parseFloat(second)]; +}); + +Given('I have an empty list of grades', function () { + gradeList = []; +}); + +Given('I have a grade acronym {string}', function (acronym: string) { + gradeAcronym = acronym; +}); + +Given('a student has the following grades:', function (dataTable: DataTable) { + studentGrades = dataTable.hashes().map(row => ({ + goal: row.goal, + grade: row.grade + })); +}); + +Given('I have a list of students with statuses:', function (dataTable: DataTable) { + studentList = dataTable.hashes().map(row => ({ + name: row.name, + status: row.status + })); +}); + +// ============================================================================= +// WHEN Steps +// ============================================================================= + +When('I calculate the grade average', function () { + calculationResult = calculateAverage(gradeList); +}); + +When('I convert it to a numeric value', function () { + calculationResult = convertGradeToValue(gradeAcronym); +}); + +When('I evaluate the student\'s final status', function () { + statusResult = determineStudentStatus(studentGrades); +}); + +When('I aggregate the student statuses', function () { + groupingResult = groupStudentsByStatus(studentList); +}); + +// ============================================================================= +// THEN Steps +// ============================================================================= + +Then('the result should be {float}', function (expected: number) { + expect(calculationResult).toBeCloseTo(expected, 2); +}); + +Then('the result should be {int}', function (expected: number) { + expect(calculationResult).toBe(expected); +}); + +Then('the status should be {string}', function (expected: string) { + expect(statusResult).toBe(expected); +}); + +Then('the grouping should return:', function (dataTable: DataTable) { + const expectedGrouping: Record = {}; + dataTable.hashes().forEach(row => { + expectedGrouping[row.status] = parseInt(row.count, 10); + }); + + for (const [status, count] of Object.entries(expectedGrouping)) { + expect(groupingResult[status]).toBe(count); + } +}); diff --git a/server/tmp.csv b/server/tmp.csv new file mode 100644 index 00000000..552729cb --- /dev/null +++ b/server/tmp.csv @@ -0,0 +1,6 @@ +cpf +11111111111 +22222222222 +33333333333 +44444444444 +12345678910 \ No newline at end of file