From 8b00de03d8502693bec8415471cea48dad5885ab Mon Sep 17 00:00:00 2001 From: Kay Robbins Date: Wed, 6 May 2026 15:18:54 -0500 Subject: [PATCH 1/2] feat: remove browser/ app (moved to hed-standard/hed-web) - Delete browser/ directory entirely - Remove Browser-tests job from tests.yml - Update README to point to hed-standard.github.io/hed-web - Update copilot-instructions.md to remove browser/ references --- .github/copilot-instructions.md | 16 - .github/workflows/tests.yml | 29 - README.md | 9 +- browser/index.html | 30 - browser/package-lock.json | 3300 ---------------------- browser/package.json | 26 - browser/public/.nojekyll | 0 browser/public/favicon.ico | Bin 253502 -> 0 bytes browser/src/bids/BidsWebAccessor.js | 108 - browser/src/bids/BidsWebAccessor.spec.js | 80 - browser/src/components/ErrorDisplay.jsx | 75 - browser/src/components/FileInput.jsx | 51 - browser/src/components/FileList.jsx | 9 - browser/src/components/FolderInput.jsx | 56 - browser/src/components/NavOptions.jsx | 54 - browser/src/main.jsx | 60 - browser/src/schema/init.js | 80 - browser/src/schema/loader.js | 114 - browser/src/schema/loader.spec.js | 18 - browser/src/schema/vite-importer.js | 2 - browser/src/styles/styles.css | 7 - browser/src/utils/files.js | 34 - browser/src/validate_dataset.jsx | 241 -- browser/src/validate_file.jsx | 224 -- browser/validate_dataset.html | 26 - browser/validate_file.html | 26 - browser/vite-importer-transformer.cjs | 7 - browser/vite.config.js | 111 - browser/vitest.config.js | 38 - 29 files changed, 6 insertions(+), 4825 deletions(-) delete mode 100644 browser/index.html delete mode 100644 browser/package-lock.json delete mode 100644 browser/package.json delete mode 100644 browser/public/.nojekyll delete mode 100644 browser/public/favicon.ico delete mode 100644 browser/src/bids/BidsWebAccessor.js delete mode 100644 browser/src/bids/BidsWebAccessor.spec.js delete mode 100644 browser/src/components/ErrorDisplay.jsx delete mode 100644 browser/src/components/FileInput.jsx delete mode 100644 browser/src/components/FileList.jsx delete mode 100644 browser/src/components/FolderInput.jsx delete mode 100644 browser/src/components/NavOptions.jsx delete mode 100644 browser/src/main.jsx delete mode 100644 browser/src/schema/init.js delete mode 100644 browser/src/schema/loader.js delete mode 100644 browser/src/schema/loader.spec.js delete mode 100644 browser/src/schema/vite-importer.js delete mode 100644 browser/src/styles/styles.css delete mode 100644 browser/src/utils/files.js delete mode 100644 browser/src/validate_dataset.jsx delete mode 100644 browser/src/validate_file.jsx delete mode 100644 browser/validate_dataset.html delete mode 100644 browser/validate_file.html delete mode 100644 browser/vite-importer-transformer.cjs delete mode 100644 browser/vite.config.js delete mode 100644 browser/vitest.config.js diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index cb41a2cf..be1cb0d7 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -51,10 +51,6 @@ Source code is plain JavaScript (`.js`) in `src/`. TypeScript type declarations - `utils/` — General utilities - `array.js`, `string.js`, `files.js`, `paths.js`, `hedStrings.js`, `memoizer.js`, `xml.js` -**Browser App** (`browser/`): - -- A separate Vite/React app for browser-based HED validation. Has its own `package.json` and `vite.config.js`. - ## Common commands ```powershell @@ -75,14 +71,6 @@ npm run clear_jest_cache # Clear Jest cache npx jest tests/otherTests/hed.spec.js ``` -**Browser app (separate package):** - -```powershell -cd browser ; npm install ; npm test # Run browser (Vitest) tests -cd browser ; npm run build # Build browser app -cd browser ; npm run preview # Serve browser app locally -``` - ## Testing structure ``` @@ -96,8 +84,6 @@ tests/ spec_tests/ jsonTests.spec.js # Runs the HED spec test suite javascriptTests.json -browser/ - vitest.config.js # Separate Vitest suite for browser components ``` Jest is configured via `jest.config.js` and `babel.config.js`. Note: `jest.config.js` has a @@ -120,7 +106,6 @@ do not remove it or those imports will fail in tests. - `tests/` — Jest test suite - `spec_tests/` — HED spec-level tests - `types/` — TypeScript type declarations (`index.d.ts`, `test.ts`) -- `browser/` — Vite/React browser demo app - `dist/` — Compiled output, generated by `npm run build` (not committed) - `scripts/` — Helper scripts for type testing - `esbuild.mjs` — Build configuration @@ -134,7 +119,6 @@ CI runs on every push/PR to `main`. Replicate these locally before opening a PR: | --------------------- | --------------------------------------------------- | -------------------------------------------------- | | `tests.yml` | `npm ci ; npm test` | Runs `tests/` suite on Node 22, lts/\*, latest | | `tests.yml` | `npm ci ; npm run testSpecs` | Runs `spec_tests/` suite | -| `tests.yml` (browser) | `cd browser ; npm install ; npm test` | Separate Vitest browser suite | | `test-types.yml` | `npm ci ; npm run build ; npm pack` then type-check | **Build required before type check** | | `codeql.yml` | automatic | CodeQL security scan (JavaScript) | | `codespell.yaml` | automatic | Spell check source files | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4e8e793c..04cf86d2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -56,33 +56,4 @@ jobs: - name: Run JSON spec tests with Node.js ${{ matrix.node-version }} run: npm run testSpecs - Browser-tests: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [22.x, lts/*, 'node'] - steps: - - name: Check out the code - uses: actions/checkout@v6 - - name: Set up with Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v6 - with: - node-version: ${{ matrix.node-version }} - - name: Print Node.js version and CI environment - run: | - echo "Node.js version: $(node -v)" - echo "Environment: CI=${{ env.CI }}" - - name: Download root dependencies - run: npm ci - - name: Clean browser dependencies - working-directory: ./browser - run: | - rm -rf package-lock.json node_modules - - name: Install browser dependencies - working-directory: ./browser - run: npm install - - name: Run browser tests with Node.js ${{ matrix.node-version }} - working-directory: ./browser - run: npm test diff --git a/README.md b/README.md index 5eec29f1..87f1c97c 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ A sample of current `hed-validator` usage in BIDS can be found in the BIDS valid ## Online validation A browser-based validator that uses this package is available at -[www.hedtags.org/hed-javascript](https://www.hedtags.org/hed-javascript). +[hed-standard.github.io/hed-web](https://hed-standard.github.io/hed-web/). This online validator allows users to validate HED annotations in a web browser without needing to install any software or upload files to a server. The API documentation for this package is available at -[www.hedtags.org/hed-javascript/docs](https://www.hedtags.org/hed-javascript/docs). +[hed-standard.github.io/hed-javascript](https://hed-standard.github.io/hed-javascript/). A number of tools for HED, including validation are also available in a Python-based [online validator](https://hedtools.org/hed). @@ -68,8 +68,11 @@ be done as PRs (pull requests) to the `main` branch. ### Running the browser locally +The browser app has moved to the [hed-web](https://github.com/hed-standard/hed-web) repository. + ```code -cd browser +git clone https://github.com/hed-standard/hed-web +cd hed-web npm install npm run build npm run preview diff --git a/browser/index.html b/browser/index.html deleted file mode 100644 index dd27dcbc..00000000 --- a/browser/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - HED Validator - - - - - - - - - - -
- - - - diff --git a/browser/package-lock.json b/browser/package-lock.json deleted file mode 100644 index 8c0084aa..00000000 --- a/browser/package-lock.json +++ /dev/null @@ -1,3300 +0,0 @@ -{ - "name": "hed-validator-web", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "hed-validator-web", - "version": "1.0.0", - "dependencies": { - "lodash": "^4.18.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "readable-stream": "^4.7.0", - "timers-browserify": "^2.0.12" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.1.0", - "@vitest/ui": "^3.2.4", - "jsdom": "^24.0.0", - "path-browserify": "^1.0.1", - "vite": "^6.4.2", - "vitest": "^3.2.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/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/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", - "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "3.2.4" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", - "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": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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.2.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001737", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", - "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", - "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/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.209", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.209.tgz", - "integrity": "sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==", - "dev": true, - "license": "ISC" - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "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" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "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/jsdom": { - "version": "24.1.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", - "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "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" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nwsapi": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", - "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz", - "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "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/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/vite": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", - "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - } - } -} diff --git a/browser/package.json b/browser/package.json deleted file mode 100644 index 914b55c2..00000000 --- a/browser/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "hed-validator-web", - "version": "1.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview --base=/hed-javascript/", - "test": "vitest --run" - }, - "dependencies": { - "lodash": "^4.18.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "readable-stream": "^4.7.0", - "timers-browserify": "^2.0.12" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.1.0", - "@vitest/ui": "^3.2.4", - "jsdom": "^24.0.0", - "path-browserify": "^1.0.1", - "vite": "^6.4.2", - "vitest": "^3.2.4" - } -} diff --git a/browser/public/.nojekyll b/browser/public/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/browser/public/favicon.ico b/browser/public/favicon.ico deleted file mode 100644 index fab32b8a8c2fad7718c4e55815882ee63015dd57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253502 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 diff --git a/browser/src/bids/BidsWebAccessor.js b/browser/src/bids/BidsWebAccessor.js deleted file mode 100644 index c22c8f7c..00000000 --- a/browser/src/bids/BidsWebAccessor.js +++ /dev/null @@ -1,108 +0,0 @@ -import { BidsFileAccessor } from '../../../src/bids/datasetParser.js' -import { buildSchemasFromVersion } from '../schema/init.js' -import { BidsHedIssue } from '../../../src/bids/types/issues.js' - -/** - * Build HED schemas from a dataset description for the browser environment. - * @param {object} description The dataset_description.json data. - * @returns {Promise} The HED schemas. - */ -async function buildBidsSchemas(description) { - const hedVersionString = description.jsonData?.HEDVersion - if (!hedVersionString) { - return null - } - try { - return await buildSchemasFromVersion(hedVersionString) - } catch (e) { - throw new BidsHedIssue(e.issue) - } -} - -/** - * Processes a list of files to determine the dataset root and create a relative file map. - * @param {FileList|File[]} fileInput The files from a webkitdirectory upload. - * @returns {{datasetRootDirectory: string, fileMap: Map}} - * @private - */ -function _processFileList(fileInput) { - const fileList = Array.from(fileInput) - if (fileList.length === 0) { - return { datasetRootDirectory: '', fileMap: new Map() } - } - // Find dataset_description.json to determine the root path prefix. - const descriptionFile = fileList.find((f) => (f.webkitRelativePath || f.name).endsWith('dataset_description.json')) - let prefix = '' - if (descriptionFile) { - const path = descriptionFile.webkitRelativePath || descriptionFile.name - const lastSlashIndex = path.lastIndexOf('/') - // Check if the file is in a subdirectory - if (lastSlashIndex > -1) { - prefix = path.substring(0, lastSlashIndex) - } - // If lastSlashIndex is -1, the file is at the root, and prefix remains ''. This is correct. - } else { - // Fallback: if no dataset_description.json, assume the first directory level is the root. - const firstPath = fileList[0]?.webkitRelativePath || '' - const rootDirEndIndex = firstPath.indexOf('/') - if (rootDirEndIndex > -1) { - prefix = firstPath.substring(0, rootDirEndIndex) - } - } - - const datasetRootDirectory = prefix - const fileMap = new Map() - const prefixWithSlash = prefix ? prefix + '/' : '' - - for (const file of fileList) { - const webkitRelativePath = file.webkitRelativePath || file.name - if (!webkitRelativePath) continue - - const relativePath = webkitRelativePath.startsWith(prefixWithSlash) - ? webkitRelativePath.substring(prefixWithSlash.length) - : webkitRelativePath - - if (relativePath) { - fileMap.set(relativePath, file) - } - } - return { datasetRootDirectory, fileMap } -} - -// Subclass for web environment -export class BidsWebAccessor extends BidsFileAccessor { - /** - * Factory method to create a BidsWebAccessor from a browser FileList. - * @param {FileList|File[]} fileInput The files from a webkitdirectory upload. - * @returns {Promise} - * @override - */ - static async create(fileInput) { - const { datasetRootDirectory, fileMap } = _processFileList(fileInput) - return new BidsWebAccessor(datasetRootDirectory, fileMap) - } - - /** - * Constructor for BidsWebAccessor. - * - * @param {string} datasetRootDirectory The root directory of the dataset. - * @param {Map} fileMap Map of relative file paths to file representations. - * @private - */ - constructor(datasetRootDirectory, fileMap) { - super(datasetRootDirectory, fileMap) - this.schemaBuilder = buildBidsSchemas - } - - async getFileContent(relativePath) { - const file = this.fileMap.get(relativePath) - if (!file) { - return null - } - if (typeof file.text === 'function') { - return await file.text() - } else { - throw new Error(`Cannot read file ${relativePath}: File object in map lacks .text() method.`) - } - } -} diff --git a/browser/src/bids/BidsWebAccessor.spec.js b/browser/src/bids/BidsWebAccessor.spec.js deleted file mode 100644 index 90af75e4..00000000 --- a/browser/src/bids/BidsWebAccessor.spec.js +++ /dev/null @@ -1,80 +0,0 @@ -import { describe, it, expect } from 'vitest' -import { BidsWebAccessor } from './BidsWebAccessor.js' - -// Mock File object for BidsWebAccessor tests -const MockFile = class { - constructor(content, name, webkitRelativePath) { - this.content = content - this.name = name || 'mockfile.txt' - this.size = content.length - this.type = 'text/plain' - this.webkitRelativePath = webkitRelativePath - } - async text() { - return this.content - } -} - -describe('BidsWebAccessor', () => { - describe('create', () => { - it('should handle an empty file list', async () => { - const accessor = await BidsWebAccessor.create([]) - expect(accessor.datasetRootDirectory).toBe('') - expect(accessor.fileMap.size).toBe(0) - }) - - it('should extract the root directory and create a relative file map', async () => { - const fileInput = [ - new MockFile('{}', 'dataset_description.json', 'my-dataset/dataset_description.json'), - new MockFile('data', 'sub-01_events.tsv', 'my-dataset/sub-01/sub-01_events.tsv'), - ] - const accessor = await BidsWebAccessor.create(fileInput) - expect(accessor.datasetRootDirectory).toBe('my-dataset') - expect(Array.from(accessor.fileMap.keys()).sort()).toEqual( - ['dataset_description.json', 'sub-01/sub-01_events.tsv'].sort(), - ) - expect(accessor.fileMap.get('dataset_description.json')).toBe(fileInput[0]) - }) - - it('should handle files in the root without a parent directory', async () => { - const fileInput = [ - new MockFile('{}', 'dataset_description.json', 'dataset_description.json'), - new MockFile('data', 'participants.tsv', 'participants.tsv'), - ] - const accessor = await BidsWebAccessor.create(fileInput) - expect(accessor.datasetRootDirectory).toBe('') - expect(Array.from(accessor.fileMap.keys()).sort()).toEqual( - ['dataset_description.json', 'participants.tsv'].sort(), - ) - }) - }) - - describe('getFileContent', () => { - it('should return null if the file is not in the map', async () => { - const accessor = await BidsWebAccessor.create([]) - const content = await accessor.getFileContent('nonexistent.txt') - expect(content).toBeNull() - }) - - it('should call file.text() and return its result', async () => { - const mockFile = new MockFile('file content', 'dataset_description.json', 'my-dataset/dataset_description.json') - const fileInput = [mockFile] - const accessor = await BidsWebAccessor.create(fileInput) - const content = await accessor.getFileContent('dataset_description.json') - expect(content).toBe('file content') - }) - - it('should throw an error if the file object lacks a .text() method', async () => { - const fileInput = [ - { - name: 'dataset_description.json', - webkitRelativePath: 'my-dataset/dataset_description.json', - }, - ] - const accessor = await BidsWebAccessor.create(fileInput) - await expect(accessor.getFileContent('dataset_description.json')).rejects.toThrow( - 'Cannot read file dataset_description.json: File object in map lacks .text() method.', - ) - }) - }) -}) diff --git a/browser/src/components/ErrorDisplay.jsx b/browser/src/components/ErrorDisplay.jsx deleted file mode 100644 index aac499f0..00000000 --- a/browser/src/components/ErrorDisplay.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react' - -// Component to display validation errors -export const ErrorDisplay = ({ errors, downloadableErrors }) => { - if (!errors || errors.length === 0) { - return ( -
-

No validation issues found.

-
- ) - } - - const getSeverityClass = (severity) => { - if (severity === 'warning') return 'border-yellow-500' - return 'border-red-500' // Default to error - } - - const handleDownload = () => { - const errorsToDownload = downloadableErrors || errors - const data = JSON.stringify(errorsToDownload, null, 2) - const blob = new Blob([data], { type: 'text/plain' }) - const url = URL.createObjectURL(blob) - const link = document.createElement('a') - link.href = url - link.download = 'hed_validation_issues.json' - document.body.appendChild(link) - link.click() - document.body.removeChild(link) - URL.revokeObjectURL(url) - } - - return ( -
-
-

Validation Issues Found

- -
-
- {errors.map((error, index) => { - let locationString = '' - if (error.location) { - locationString += `Location: ${error.location}` - } - const lineNumber = error.line || error.hedIssue?.parameters?.tsvLine - if (lineNumber) { - if (locationString) { - locationString += ', ' - } - locationString += `Line: ${lineNumber}` - } - if (error.hedIssue?.parameters?.sidecarKey) { - if (locationString) { - locationString += ', ' - } - locationString += `Sidecar column: ${error.hedIssue.parameters.sidecarKey}` - } - return ( -
-

{error.issueMessage}

- {locationString &&

{locationString}

} -
- ) - })} -
-
- ) -} diff --git a/browser/src/components/FileInput.jsx b/browser/src/components/FileInput.jsx deleted file mode 100644 index 991a3bf7..00000000 --- a/browser/src/components/FileInput.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React, { useState } from 'react' - -// A reusable file input component with updated layout and styling -export const FileInput = ({ id, buttonText, tooltip, accept, onFileSelect, isLoading }) => { - const [fileName, setFileName] = useState('') - - const handleFileChange = (e) => { - if (e.target.files.length > 0) { - const file = e.target.files[0] - setFileName(file.name) - onFileSelect(file) - } else { - setFileName('') - onFileSelect(null) - } - } - - const hasFile = !!fileName - - // Determine button color - let buttonClass = '' - if (isLoading || hasFile) { - buttonClass = 'bg-gray-400 dark:bg-gray-600' - } else { - buttonClass = 'bg-blue-600 hover:bg-blue-700' - } - - return ( - // Flex container for the entire row to align items horizontally -
- {/* 1. The button with text, tooltip, fixed width, and new color logic */} - - - - {/* 2. The filename message, now with a title attribute for the tooltip */} -

- {fileName || 'No file selected'} -

-
- ) -} diff --git a/browser/src/components/FileList.jsx b/browser/src/components/FileList.jsx deleted file mode 100644 index 61e37212..00000000 --- a/browser/src/components/FileList.jsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export const FileList = ({ files }) => ( -
    - {files.map((file, i) => ( -
  • {file.webkitRelativePath || file.name}
  • - ))} -
-) diff --git a/browser/src/components/FolderInput.jsx b/browser/src/components/FolderInput.jsx deleted file mode 100644 index 8837c0f1..00000000 --- a/browser/src/components/FolderInput.jsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useState } from 'react' - -export const FolderInput = ({ id, buttonText, tooltip, onFolderSelect, isLoading }) => { - const [folderName, setFolderName] = useState('') - - const handleFolderChange = (e) => { - const files = Array.from(e.target.files) - if (files.length > 0) { - // Try to get the root folder name from the first file's webkitRelativePath - const firstPath = files[0].webkitRelativePath || files[0].name - const rootFolder = firstPath.split('/')[0] - setFolderName(rootFolder) - onFolderSelect(files) - } else { - setFolderName('') - onFolderSelect([]) - } - } - - const hasFolder = !!folderName - let buttonClass = '' - if (isLoading || hasFolder) { - buttonClass = 'bg-gray-400 dark:bg-gray-600' - } else { - buttonClass = 'bg-blue-600 hover:bg-blue-700' - } - - return ( -
- - -

- {folderName || 'No folder selected'} -

-
- ) -} diff --git a/browser/src/components/NavOptions.jsx b/browser/src/components/NavOptions.jsx deleted file mode 100644 index 922e7b52..00000000 --- a/browser/src/components/NavOptions.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react' - -// A single navigation card component for a clean and reusable structure -const NavCard = ({ href, icon, title, description }) => { - return ( - -
- {icon} -
-

{title}

-

{description}

-
- ) -} - -export const NavOptions = ({ base_url }) => { - const navOptions = [ - { - href: './validate_dataset.html', - icon: HED Icon, - title: 'Validate dataset', - description: 'Check your BIDS dataset for HED errors.', - }, - { - href: './validate_file.html', - icon: HED Icon, - title: 'Validate file', - description: 'Check a BIDS-style tsv file for HED errors.', - }, - { - href: './docs/', - icon: HED Icon, - title: 'API Docs', - description: 'Browse the technical documentation for developers.', - }, - ] - - return ( -
- {navOptions.map((option) => ( - - ))} -
- ) -} diff --git a/browser/src/main.jsx b/browser/src/main.jsx deleted file mode 100644 index beeaf344..00000000 --- a/browser/src/main.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react' -import { createRoot } from 'react-dom/client' -import { NavOptions } from './components/NavOptions' - -// --- Reusable Components --- - -// A single navigation card component for a clean and reusable structure -const NavCard = ({ href, icon, title, description }) => { - return ( - -
- {icon} -
-

{title}

-

{description}

-
- ) -} - -// --- Main Application Component --- - -function App() { - const base_url = import.meta.env.BASE_URL - - return ( -
-
-

- Welcome to the HED JavaScript Validator -

-

- A suite of tools to validate HED (Hierarchical Event Descriptor) tags. -
- These tools are browser-based -- all data remains local. -

-
- -
- -
- -
-

© {new Date().getFullYear()} HED Working Group. All rights reserved.

-
-
- ) -} - -// --- Mount the App to the DOM --- - -const container = document.getElementById('root') -const root = createRoot(container) -root.render( - - - , -) diff --git a/browser/src/schema/init.js b/browser/src/schema/init.js deleted file mode 100644 index 92f7d66e..00000000 --- a/browser/src/schema/init.js +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Browser-specific schema initialization. - * - * This file is a copy of the original `src/schema/init.js` with the import path for the schema loader modified - * to point to the browser-specific version. - */ -import zip from 'lodash/zip' - -import { loadSchema } from './loader' -import { setParent } from '../../../src/utils/xml.js' - -import SchemaParser from '../../../src/schema/parser' -import PartneredSchemaMerger from '../../../src/schema/schemaMerger' -import { Schema, Schemas } from '../../../src/schema/containers' -import { IssueError } from '../../../src/issues/issues' -import { splitStringTrimAndRemoveBlanks } from '../../../src/utils/string' -import { SchemasSpec } from '../../../src/schema/specs' - -/** - * Build a single schema container object from an XML file. - * - * @param {Object} xmlData The schema's XML data - * @returns {Schema} The HED schema object. - */ -const buildSchemaObject = function (xmlData) { - const rootElement = xmlData.HED - setParent(rootElement, null) - const schemaEntries = new SchemaParser(rootElement).parse() - return new Schema(xmlData, schemaEntries) -} - -/** - * Build a single merged schema container object from one or more XML files. - * - * @param {Object[]} xmlData The schemas' XML data. - * @returns {Schema} The HED schema object. - */ -const buildSchemaObjects = function (xmlData) { - const schemas = xmlData.map((data) => buildSchemaObject(data)) - if (schemas.length === 1) { - return schemas[0] - } - const partneredSchemaMerger = new PartneredSchemaMerger(schemas) - return partneredSchemaMerger.mergeSchemas() -} - -/** - * Build a schema collection object from a schema specification. - * - * @param {SchemasSpec} schemaSpecs The description of which schemas to use. - * @returns {Promise} The schema container object and any issues found. - */ -export async function buildSchemas(schemaSpecs) { - const schemaPrefixes = Array.from(schemaSpecs.data.keys()) - /* Data format example: - * [[xmlData, ...], [xmlData, xmlData, ...], ...] */ - const schemaXmlData = await Promise.all( - schemaPrefixes.map((prefix) => { - const specs = schemaSpecs.data.get(prefix) - return Promise.all(specs.map((spec) => loadSchema(spec))) - }), - ) - const schemaObjects = schemaXmlData.map(buildSchemaObjects) - const schemas = new Map(zip(schemaPrefixes, schemaObjects)) - return new Schemas(schemas) -} - -/** - * Build HED schemas from a version specification string. - * - * @param {string} hedVersionString The HED version specification string (can contain comma-separated versions). - * @returns {Promise} A Promise that resolves to the built schemas. - * @throws {IssueError} If the schema specification is invalid or schemas cannot be built. - */ -export async function buildSchemasFromVersion(hedVersionString) { - hedVersionString ??= '' - const hedVersionSpecStrings = splitStringTrimAndRemoveBlanks(hedVersionString, ',') - const hedVersionSpecs = SchemasSpec.parseVersionSpecs(hedVersionSpecStrings) - return buildSchemas(hedVersionSpecs) -} diff --git a/browser/src/schema/loader.js b/browser/src/schema/loader.js deleted file mode 100644 index 0216d270..00000000 --- a/browser/src/schema/loader.js +++ /dev/null @@ -1,114 +0,0 @@ -/** HED schema loading functions. */ - -/* Imports */ -import { IssueError } from '../../../src/issues/issues' -import { parseSchemaXML } from '../../../src/utils/xml.js' -import { schemaData } from './vite-importer.js' - -/** - * Load schema XML data from a schema version or path description. - * - * @param {SchemaSpec} schemaDef The description of which schema to use. - * @returns {Promise} The schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -export async function loadSchema(schemaDef = null) { - const xmlData = await loadPromise(schemaDef) - if (xmlData === null) { - IssueError.generateAndThrow('invalidSchemaSpecification', { spec: JSON.stringify(schemaDef) }) - } - return xmlData -} - -/** - * Choose the schema Promise from a schema version or path description. - * - * @param {SchemaSpec} schemaDef The description of which schema to use. - * @returns {Promise} The schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -async function loadPromise(schemaDef) { - if (schemaDef === null) { - return null - } else if (schemaDef.localPath) { - return loadLocalSchema(schemaDef.localPath) - } else if (schemaDef.localName) { - return loadBundledSchema(schemaDef) - } else { - return loadRemoteSchema(schemaDef) - } -} - -/** - * Load schema XML data from the HED GitHub repository. - * - * @param {SchemaSpec} schemaDef The standard schema version to load. - * @returns {Promise} The schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -function loadRemoteSchema(schemaDef) { - let url - if (schemaDef.library) { - url = `https://raw.githubusercontent.com/hed-standard/hed-schemas/refs/heads/main/library_schemas/${schemaDef.library}/hedxml/HED_${schemaDef.library}_${schemaDef.version}.xml` - } else { - url = `https://raw.githubusercontent.com/hed-standard/hed-schemas/refs/heads/main/standard_schema/hedxml/HED${schemaDef.version}.xml` - } - return loadSchemaFile( - fetch(url).then((res) => res.text()), - 'remoteSchemaLoadFailed', - { spec: JSON.stringify(schemaDef) }, - ) -} - -/** - * Load schema XML data from a local file. - * - * @param {string} path The path to the schema XML data. - * @returns {Promise} The schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -function loadLocalSchema(path) { - throw new Error('Local schema loading is not supported in the browser.') -} - -/** - * Load schema XML data from a bundled file. - * - * @param {SchemaSpec} schemaDef The description of which schema to use. - * @returns {Promise} The schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -async function loadBundledSchema(schemaDef) { - const localPath = `../../../src/data/schemas/${schemaDef.localName}.xml` - const schemaLoader = schemaData[localPath] - if (!schemaLoader) { - // This occurs in the test environment or if the schema is not found. - return - } - try { - const data = await schemaLoader() - return parseSchemaXML(data) - } catch (error) { - const issueArgs = { spec: JSON.stringify(schemaDef), error: error.message } - IssueError.generateAndThrow('bundledSchemaLoadFailed', issueArgs) - } -} - -/** - * Actually load the schema XML file. - * - * @param {Promise} xmlDataPromise The Promise containing the unparsed XML data. - * @param {string} issueCode The issue code. - * @param {Object} issueArgs The issue arguments passed from the calling function. - *returns {Promise} The parsed schema XML data. - * @throws {IssueError} If the schema could not be loaded. - */ -async function loadSchemaFile(xmlDataPromise, issueCode, issueArgs) { - try { - const data = await xmlDataPromise - return parseSchemaXML(data) - } catch (error) { - issueArgs.error = error.message - IssueError.generateAndThrow(issueCode, issueArgs) - } -} diff --git a/browser/src/schema/loader.spec.js b/browser/src/schema/loader.spec.js deleted file mode 100644 index 7eaabc02..00000000 --- a/browser/src/schema/loader.spec.js +++ /dev/null @@ -1,18 +0,0 @@ -import { describe, it, expect } from 'vitest' -import { loadSchema } from './loader.js' -import { SchemaSpec } from '../../../src/schema/specs.js' - -describe('Browser Schema Loader', () => { - it('should return undefined when loading a bundled schema in test environment', async () => { - // Create a spec with localName to trigger bundled schema loading - const spec = new SchemaSpec('', '8.0.0', 'HED8.0.0', '') - // In a test environment, this will return undefined since schemaData is empty - const schema = await loadSchema(spec) - expect(schema).toBeUndefined() - }) - - it('should throw an error for local file loading', async () => { - const spec = new SchemaSpec('', '', '', 'path/to/local.xml') - await expect(loadSchema(spec)).rejects.toThrow('Local schema loading is not supported in the browser.') - }) -}) diff --git a/browser/src/schema/vite-importer.js b/browser/src/schema/vite-importer.js deleted file mode 100644 index ef60f8d7..00000000 --- a/browser/src/schema/vite-importer.js +++ /dev/null @@ -1,2 +0,0 @@ -// browser/src/schema/vite-importer.js -export const schemaData = import.meta.glob('../../../src/data/schemas/*.xml', { query: '?raw', import: 'default' }) diff --git a/browser/src/styles/styles.css b/browser/src/styles/styles.css deleted file mode 100644 index daa12a1e..00000000 --- a/browser/src/styles/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -/* Import the Inter font from Google Fonts */ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap'); - -/* Apply the font globally */ -body { - font-family: 'Inter', sans-serif; -} diff --git a/browser/src/utils/files.js b/browser/src/utils/files.js deleted file mode 100644 index 11555e93..00000000 --- a/browser/src/utils/files.js +++ /dev/null @@ -1,34 +0,0 @@ -import { IssueError } from '../../../src/issues/issues' - -/** - * Read a local file (browser version - not supported). - * - * @param {string} fileName The file path. - * @returns {Promise} A promise with the file contents. - * @throws {IssueError} Always throws since local file reading is not supported in browsers. - */ -export async function readFile(fileName) { - IssueError.generateAndThrow('fileReadError', { - fileName: fileName, - message: 'Local file reading is not supported in browser environment' - }) -} - -/** - * Read a remote file using HTTPS. - * - * @param {string} url The remote URL. - * @returns {Promise} A promise with the file contents. - * @throws {IssueError} If the network read failed. - */ -export async function readHTTPSFile(url) { - const response = await fetch(url) - if (!response.ok) { - IssueError.generateAndThrow('networkReadError', { - url: url, - statusCode: response.status, - statusText: response.statusText, - }) - } - return response.text() -} diff --git a/browser/src/validate_dataset.jsx b/browser/src/validate_dataset.jsx deleted file mode 100644 index 41f7052d..00000000 --- a/browser/src/validate_dataset.jsx +++ /dev/null @@ -1,241 +0,0 @@ -import React, { useState } from 'react' -import { createRoot } from 'react-dom/client' -import { FolderInput } from './components/FolderInput' -import { ErrorDisplay } from './components/ErrorDisplay' -import { BidsWebAccessor } from './bids/BidsWebAccessor.js' -import { BidsDataset } from '@hed-javascript-root/src/bids/types/dataset.js' -import { IssueError } from '@hed-javascript-root/src/issues/issues.js' -import { BidsHedIssue } from '@hed-javascript-root/src/bids/types/issues.js' - -// --- Add TailwindCSS to the document head for immediate styling --- -;(() => { - if (!document.querySelector('script[src="https://cdn.tailwindcss.com"]')) { - const script = document.createElement('script') - script.src = 'https://cdn.tailwindcss.com' - document.head.appendChild(script) - } -})() - -/** - * --- Main Application Component --- - */ -function ValidateDatasetApp() { - const [dataset, setDataset] = useState(null) - const [errors, setErrors] = useState([]) - const [downloadableErrors, setDownloadableErrors] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [successMessage, setSuccessMessage] = useState('') - const [fatalError, setFatalError] = useState('') - const [validationStatus, setValidationStatus] = useState('') - const [fileInputKey, setFileInputKey] = useState(Date.now()) - const [checkWarnings, setCheckWarnings] = useState(false) - const [limitErrors, setLimitErrors] = useState(false) - - const getFileCounts = (dataset) => { - const counts = { json: 0, tsv: 0 } - if (!dataset || !dataset.fileAccessor || !dataset.fileAccessor.organizedPaths) { - return counts - } - for (const pathGroup of dataset.fileAccessor.organizedPaths.values()) { - const jsonFiles = pathGroup.get('json') - if (jsonFiles) { - counts.json += jsonFiles.length - } - const tsvFiles = pathGroup.get('tsv') - if (tsvFiles) { - counts.tsv += tsvFiles.length - } - } - return counts - } - - const handleClear = () => { - setDataset(null) - setErrors([]) - setDownloadableErrors([]) - setSuccessMessage('') - setFatalError('') - setFileInputKey(Date.now()) - setCheckWarnings(false) - setLimitErrors(false) - } - - const handleFolderSelect = async (selectedFiles) => { - if (!selectedFiles || selectedFiles.length === 0) { - return - } - const numFiles = selectedFiles.length - setIsLoading(true) - setErrors([]) - setDownloadableErrors([]) - setDataset(null) - setSuccessMessage('') - setFatalError('') - - const [createdDataset, issues] = await BidsDataset.create(selectedFiles, BidsWebAccessor) - - const issuesForDownload = BidsHedIssue.processIssues(issues, checkWarnings, false) - setDownloadableErrors(issuesForDownload) - const processedIssues = BidsHedIssue.processIssues(issues, checkWarnings, limitErrors) - if (processedIssues.length > 0) { - setErrors(processedIssues) - setDataset(null) - } else if (createdDataset) { - setDataset(createdDataset) - const { json: numJsonFiles, tsv: numTsvFiles } = getFileCounts(createdDataset) - setSuccessMessage( - `${numFiles} total files: ${numJsonFiles} json and ${numTsvFiles} tsv HED files. Ready to validate.`, - ) - } - setIsLoading(false) - } - - const handleValidate = async () => { - if (!dataset) { - return - } - setIsLoading(true) - setErrors([]) - setDownloadableErrors([]) - setSuccessMessage('') - setFatalError('') - let issues = [] - try { - setValidationStatus('Validating sidecars...') - issues = dataset.validateSidecars() - - const processedSidecarIssues = BidsHedIssue.processIssues(issues, checkWarnings, limitErrors) - if (processedSidecarIssues.some((issue) => issue.severity === 'error')) { - setErrors(processedSidecarIssues) - setDownloadableErrors(BidsHedIssue.processIssues(issues, checkWarnings, false)) - setFatalError('Validation cannot continue due to serious sidecar errors.') - setIsLoading(false) - setValidationStatus('') - return - } - setSuccessMessage('Preliminary sidecar validation passed. Continuing with TSV validation...') - setValidationStatus('Validating TSV files...') - issues = issues.concat(await dataset.validateTsvFiles()) - } catch (err) { - console.error('[ValidateDatasetApp] Error during validation:', err) - issues = BidsHedIssue.transformToBids([err], { path: 'Dataset Validation' }) - } finally { - const processedIssues = BidsHedIssue.processIssues(issues, checkWarnings, limitErrors) - if (limitErrors) { - const issuesForDownload = BidsHedIssue.processIssues(issues, checkWarnings, false) - setDownloadableErrors(issuesForDownload) - } else { - setDownloadableErrors(processedIssues) - } - if (processedIssues.length > 0) { - setErrors(processedIssues) - } else { - setSuccessMessage('No validation errors found.') - } - setIsLoading(false) - setValidationStatus('') - } - } - - return ( -
-
-
- - ← Back to Home - -

Validate a dataset

-

- Upload a BIDS dataset folder to check for HED errors. -
- This tool is browser-based -- all data remains local. -

-
-
-
- -
- {/* Checkboxes for validation options */} -
-
- setCheckWarnings(e.target.checked)} - className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600" - /> - -
-
- setLimitErrors(e.target.checked)} - className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600" - /> - -
-
-
- - -
- {successMessage && ( -
-

{successMessage}

-
- )} - {fatalError && ( -
-

{fatalError}

-
- )} - {errors.length > 0 && } -
-
-
- ) -} - -// --- Mount the App to the DOM --- - -const rootElement = document.getElementById('root') -if (!rootElement) { - const newRoot = document.createElement('div') - newRoot.id = 'root' - document.body.appendChild(newRoot) -} - -const root = createRoot(document.getElementById('root')) -root.render( - - - , -) diff --git a/browser/src/validate_file.jsx b/browser/src/validate_file.jsx deleted file mode 100644 index c0f630b5..00000000 --- a/browser/src/validate_file.jsx +++ /dev/null @@ -1,224 +0,0 @@ -import React, { useState } from 'react' -import { createRoot } from 'react-dom/client' -import { FileInput } from './components/FileInput' -import { ErrorDisplay } from './components/ErrorDisplay' -import { - BidsHedIssue, - BidsJsonFile, - BidsSidecar, - BidsTsvFile, - buildBidsSchemas, -} from '@hed-javascript-root/src/bids/index.js' -import { buildSchemasFromVersion } from './schema/init.js' -import { generateIssue, IssueError } from '@hed-javascript-root/src/issues/issues.js' -import parseTSV from '@hed-javascript-root/src/bids/tsvParser.js' - -// --- Main Application Component --- - -function ValidateFileApp() { - const [tsvFile, setTsvFile] = useState(null) - const [jsonFile, setJsonFile] = useState(null) - const [hedVersion, setHedVersion] = useState('8.4.0') - const [errors, setErrors] = useState([]) - const [downloadableErrors, setDownloadableErrors] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [checkWarnings, setCheckWarnings] = useState(false) - const [limitErrors, setLimitErrors] = useState(false) // This state is not used by performHedValidation yet - const [fileInputKey, setFileInputKey] = useState(Date.now()) - const [successMessage, setSuccessMessage] = useState('') - const [validated, setValidated] = useState(false) - - function handleClear() { - setTsvFile(null) - setJsonFile(null) - setHedVersion('8.4.0') - setErrors([]) - setDownloadableErrors([]) - setSuccessMessage('') - setValidated(false) - setFileInputKey(Date.now()) - setCheckWarnings(false) - setLimitErrors(false) - } - - /** - * Handles the validation process for the selected TSV and JSON files. - * - * This function performs the following steps: - * 1. Sets the loading state and clears previous errors and success messages. - * 2. Loads the specified HED schema version(s). - * 3. Reads the content of the TSV and JSON files. - * 4. Parses the JSON sidecar. - * 5. Performs validation on the TSV data using the HED schemas and sidecar. - * 6. Updates the state with any validation issues or a success message. - * 7. Resets the loading state. - */ - async function handleValidation() { - setIsLoading(true) - setErrors([]) - setDownloadableErrors([]) - setSuccessMessage('') - setValidated(true) - let issues = [] - let defaultPath = 'HED schema input' - - try { - // Load HED Schemas - defaultPath = 'HED schema input' - const hedSchemas = await buildSchemasFromVersion(hedVersion) - - defaultPath = jsonFile.name - const jsonText = await jsonFile.text() - const jsonData = JSON.parse(jsonText) - const jsonFileObject = { name: jsonFile.name, path: jsonFile.name } - const bidsSidecar = new BidsSidecar(jsonFile.name, jsonFileObject, jsonData) - const sidecarIssues = bidsSidecar.validate(hedSchemas) - const sidecarErrors = sidecarIssues.filter((issue) => issue.severity === 'error') - - if (sidecarErrors.length > 0) { - issues = sidecarIssues - } else { - const tsvText = await tsvFile.text() - const parsedTsv = parseTSV(tsvText) - const tsvFileObject = { name: tsvFile.name, path: tsvFile.name, file: tsvFile } - const bidsTsvFile = new BidsTsvFile(tsvFile.name, tsvFileObject, parsedTsv, jsonData, hedSchemas.definitions) - issues = bidsTsvFile.validate(hedSchemas) - } - } catch (err) { - issues = BidsHedIssue.transformToBids([err], { path: defaultPath }) - } finally { - const issuesForDownload = BidsHedIssue.processIssues(issues, checkWarnings, false) - setDownloadableErrors(issuesForDownload) - const processedIssues = BidsHedIssue.processIssues(issues, checkWarnings, limitErrors) - if (processedIssues.length > 0) { - setErrors(processedIssues) - } else { - setSuccessMessage('No validation issues found.') - } - setIsLoading(false) - } - } - - return ( -
-
-
- - ← Back to Home - -

Validate a file

-

- Validate HED in BIDS-style TSV file and corresponding JSON sidecar. -
- This tool is browser-based -- all data remains local. -

-
- -
- {/* Container for the file inputs with increased vertical spacing */} -
- - -
- - {/* HED Version Input */} -
-
- - setHedVersion(e.target.value)} - title="enter the version of the HED schema to use (separate multiple schema versions with commas)" - className="block w-full px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white" - /> -
-
- - {/* Checkboxes for validation options */} -
-
- setCheckWarnings(e.target.checked)} - className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600" - /> - -
-
- setLimitErrors(e.target.checked)} - className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600" - /> - -
-
- -
- - -
- - {validated && successMessage && ( -
-

{successMessage}

-
- )} - {validated && errors.length > 0 && } -
-
-
- ) -} - -// --- Mount the App to the DOM --- - -const container = document.getElementById('root') -const root = createRoot(container) -root.render( - - - , -) diff --git a/browser/validate_dataset.html b/browser/validate_dataset.html deleted file mode 100644 index 677b7302..00000000 --- a/browser/validate_dataset.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - Validate dataset - - - - - - - - -
- - - diff --git a/browser/validate_file.html b/browser/validate_file.html deleted file mode 100644 index 3cc85b20..00000000 --- a/browser/validate_file.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - Validate File - - - - - - - - -
- - - diff --git a/browser/vite-importer-transformer.cjs b/browser/vite-importer-transformer.cjs deleted file mode 100644 index 7dd1de7a..00000000 --- a/browser/vite-importer-transformer.cjs +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - process() { - return { - code: 'export const schemaData = {};', - } - }, -} diff --git a/browser/vite.config.js b/browser/vite.config.js deleted file mode 100644 index 76b37d84..00000000 --- a/browser/vite.config.js +++ /dev/null @@ -1,111 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import fs from 'node:fs' -import * as path from 'node:path' -import { createRequire } from 'node:module' // Add this line -const require = createRequire(import.meta.url) // Add this line - -// This configuration combines your specific project needs (React, multi-page, custom scripts) -// with a dynamic base path for seamless local development and GitHub Pages deployment. - -export default defineConfig(({ command }) => { - // 'command' will be 'serve' for local development (npm run dev) - // and 'build' for production (npm run build) - const isProduction = command === 'build' - - return { - // The 'base' is now dynamic. - // For production builds, it's set to your repository name '/hed-javascript/'. - // For local development, it defaults to '/', allowing assets to load correctly. - // NOTE: This setting can be overridden by the '--base' flag in your GitHub Action. - base: isProduction ? '/hed-javascript/' : '/', - - define: { - // Add this section - __VITE_ENV__: true, - }, - - optimizeDeps: { - // Add this section - include: ['lodash', 'path-browserify'], // Added 'path-browserify' - }, - - resolve: { - alias: { - path: require.resolve('path-browserify'), - 'node:path': require.resolve('path-browserify'), // Modified this line - stream: require.resolve('readable-stream'), - timers: require.resolve('timers-browserify'), // Modified this line - '@hed-javascript-root': path.resolve(__dirname, '..'), // Added alias to project root - // Browser-compatible version of files utility - '../utils/files': path.resolve(__dirname, 'src/utils/files.js'), - }, - }, - - build: { - // This matches the output directory in your GitHub Actions workflow. - outDir: 'buildweb', - - // Preserving your multi-page application setup. - rollupOptions: { - input: { - main: path.resolve(__dirname, 'index.html'), - validate_dataset: path.resolve(__dirname, 'validate_dataset.html'), - validate_file: path.resolve(__dirname, 'validate_file.html'), - }, - output: { - manualChunks(id) { - if (id.includes('node_modules/lodash')) { - return 'lodash' - } - // You could add other large dependencies here - }, - }, - }, - // Best practice: Generates a manifest file. - manifest: true, - - // Best practice: Helps with debugging in production. - sourcemap: true, - }, - - plugins: [ - // Your React plugin. - react(), - - // Your custom plugin to copy documentation after the build. - isProduction && { - name: 'copy-api-docs-after-build', - closeBundle: () => { - const sourceDir = path.resolve(__dirname, '../docs/html') - const targetDir = path.resolve(__dirname, 'buildweb/docs') - - // Check if the source directory exists before attempting to copy. - if (fs.existsSync(sourceDir)) { - // Using fs.cpSync for modern Node.js versions. - fs.cpSync(sourceDir, targetDir, { recursive: true }) - console.log('✅ Copied docs/html → buildweb/docs after build') - } else { - console.warn('⚠️ docs/html not found — skipping copy') - } - }, - }, - - // Custom plugin to copy schemas after the build. - isProduction && { - name: 'copy-schemas-after-build', - closeBundle: () => { - const sourceDir = path.resolve(__dirname, '../src/data/schemas') - const targetDir = path.resolve(__dirname, 'buildweb/schemas') - - if (fs.existsSync(sourceDir)) { - fs.cpSync(sourceDir, targetDir, { recursive: true }) - console.log('✅ Copied src/data/schemas → buildweb/schemas after build') - } else { - console.warn('⚠️ src/data/schemas not found — skipping copy') - } - }, - }, - ], - } -}) diff --git a/browser/vitest.config.js b/browser/vitest.config.js deleted file mode 100644 index 0b99b561..00000000 --- a/browser/vitest.config.js +++ /dev/null @@ -1,38 +0,0 @@ -import { defineConfig } from 'vitest/config' -import { resolve } from 'node:path' -import { fileURLToPath } from 'node:url' - -const __dirname = fileURLToPath(new URL('.', import.meta.url)) - -// Treat *.xml imports as raw text strings (matching esbuild's text loader used -// by the package build). Without this, Vite's import-analyzer tries to parse -// the bundled HED schema XML files as JavaScript and fails. -const xmlAsText = { - name: 'xml-as-text', - enforce: 'pre', - transform(code, id) { - if (id.endsWith('.xml')) { - return { code: `export default ${JSON.stringify(code)};`, map: null } - } - return null - }, -} - -export default defineConfig({ - assetsInclude: ['**/*.xml'], - plugins: [xmlAsText], - test: { - environment: 'jsdom', - include: ['src/**/*.spec.js'], - globals: true, - }, - resolve: { - alias: { - '@': resolve(__dirname, './src'), - }, - }, - define: { - // Define the Vite environment variable that the config.js file checks for - __VITE_ENV__: 'true', - }, -}) From 71ba1f5221c52f5d5e547f7c5cf80d9c83542866 Mon Sep 17 00:00:00 2001 From: Kay Robbins Date: Wed, 6 May 2026 16:38:44 -0500 Subject: [PATCH 2/2] Updated the README --- .github/copilot-instructions.md | 16 ++++++++-------- .github/workflows/tests.yml | 2 -- README.md | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index be1cb0d7..7a48ec86 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -115,14 +115,14 @@ do not remove it or those imports will fail in tests. CI runs on every push/PR to `main`. Replicate these locally before opening a PR: -| Workflow | Command | Notes | -| --------------------- | --------------------------------------------------- | -------------------------------------------------- | -| `tests.yml` | `npm ci ; npm test` | Runs `tests/` suite on Node 22, lts/\*, latest | -| `tests.yml` | `npm ci ; npm run testSpecs` | Runs `spec_tests/` suite | -| `test-types.yml` | `npm ci ; npm run build ; npm pack` then type-check | **Build required before type check** | -| `codeql.yml` | automatic | CodeQL security scan (JavaScript) | -| `codespell.yaml` | automatic | Spell check source files | -| `links.yml` | automatic | Lychee link checker (configured via `lychee.toml`) | +| Workflow | Command | Notes | +| ---------------- | --------------------------------------------------- | -------------------------------------------------- | +| `tests.yml` | `npm ci ; npm test` | Runs `tests/` suite on Node 22, lts/\*, latest | +| `tests.yml` | `npm ci ; npm run testSpecs` | Runs `spec_tests/` suite | +| `test-types.yml` | `npm ci ; npm run build ; npm pack` then type-check | **Build required before type check** | +| `codeql.yml` | automatic | CodeQL security scan (JavaScript) | +| `codespell.yaml` | automatic | Spell check source files | +| `links.yml` | automatic | Lychee link checker (configured via `lychee.toml`) | **Type-check locally (without packing):** diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 04cf86d2..fd0da138 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -55,5 +55,3 @@ jobs: run: npm ci - name: Run JSON spec tests with Node.js ${{ matrix.node-version }} run: npm run testSpecs - - diff --git a/README.md b/README.md index 87f1c97c..7b7fd66a 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ A sample of current `hed-validator` usage in BIDS can be found in the BIDS valid ## Online validation A browser-based validator that uses this package is available at -[hed-standard.github.io/hed-web](https://hed-standard.github.io/hed-web/). +[www.hedtags.org/hed-web](https://www.hedtags.org/hed-web/). This online validator allows users to validate HED annotations in a web browser without needing to install any software or upload files to a server. The API documentation for this package is available at -[hed-standard.github.io/hed-javascript](https://hed-standard.github.io/hed-javascript/). +[www.hedtags.org/hed-javascript](https://www.hedtags.org/hed-javascript/). A number of tools for HED, including validation are also available in a Python-based [online validator](https://hedtools.org/hed).