From f92fa65c707d772d06e076797d6f2d48d5b975d7 Mon Sep 17 00:00:00 2001
From: joaner <1726541+joaner@users.noreply.github.com>
Date: Tue, 4 Aug 2026 17:54:16 +0800
Subject: [PATCH 1/6] Prepare stable open-source release
Harden LeRobot compatibility, freeze the viewer API, and add the quality, security, documentation, and release gates required for a reliable 1.0 launch.
---
.changeset/README.md | 5 +
.changeset/config.json | 11 +
.github/PULL_REQUEST_TEMPLATE.md | 5 +-
.github/workflows/ci.yml | 49 +-
.github/workflows/codeql.yml | 42 +
.github/workflows/dependency-review.yml | 26 +
.github/workflows/docs-pages.yml | 57 +
.github/workflows/nightly.yml | 61 +-
.github/workflows/release-dry-run.yml | 45 +
.github/workflows/release.yml | 53 +-
.github/workflows/scorecard.yml | 39 +
.gitignore | 3 +
CHANGELOG.md | 15 +-
CODEOWNERS | 13 +
CODE_OF_CONDUCT.md | 21 +-
CONTRIBUTING.md | 42 +-
GOVERNANCE.md | 71 +
NOTICE | 13 +-
README.md | 106 +-
SECURITY.md | 71 +-
SUPPORT.md | 51 +
api-extractor.json | 33 +
components.json | 10 +-
docs/.vitepress/config.ts | 70 +
docs/api.md | 54 +
docs/architecture.md | 33 +-
docs/browser.md | 38 +
docs/compatibility.md | 114 +
docs/cors.md | 50 +
docs/data-formats.md | 48 +
docs/deployment.md | 77 +-
docs/deprecation.md | 28 +
docs/development.md | 57 +
docs/github-migration.md | 58 +-
docs/index.md | 36 +
docs/migration.md | 47 +
docs/privacy.md | 55 +
docs/quick-start.md | 76 +
docs/troubleshooting.md | 58 +
eslint.config.js | 23 +-
etc/lerobot-studio.api.md | 70 +
examples/next-app-router/app/layout.tsx | 18 +
examples/next-app-router/app/page.tsx | 5 +
examples/next-app-router/app/styles.css | 7 +
.../components/ViewerCanvas.tsx | 55 +
.../components/ViewerClient.tsx | 12 +
examples/next-app-router/next-env.d.ts | 4 +
examples/next-app-router/package.json | 23 +
examples/next-app-router/tsconfig.json | 20 +
examples/vite-react/index.html | 12 +
examples/vite-react/package.json | 24 +
examples/vite-react/src/App.tsx | 57 +
examples/vite-react/src/main.tsx | 44 +
examples/vite-react/src/styles.css | 8 +
examples/vite-react/tsconfig.json | 17 +
examples/vite-react/vite.config.ts | 7 +
package-lock.json | 3677 +++++++++++++++--
package.json | 48 +-
scripts/check-bundle-size.mjs | 283 ++
scripts/generate-test-fixtures.mjs | 112 +-
scripts/verify-npm-consumer.mjs | 310 +-
src/core/analysis/SplitService.ts | 21 +-
src/core/analysis/StatsService.ts | 584 ++-
src/core/datasource/types.ts | 13 +
src/core/export/types.ts | 16 +-
src/core/index.ts | 14 +-
src/core/types/lerobot.ts | 15 +-
src/core/versioning/LeRobotVersionAdapter.ts | 2 +-
src/core/versioning/arrowUtils.ts | 10 +-
src/core/versioning/index.ts | 8 +
src/core/versioning/v2Adapter.ts | 25 +-
src/core/versioning/v2FormatValidator.ts | 30 +-
src/core/versioning/v3Adapter.ts | 51 +-
src/core/versioning/v3FormatValidator.ts | 29 +-
src/core/versioning/validation.ts | 2 +
src/core/versioning/versionCapability.ts | 48 +
src/core/versioning/versionRegistry.ts | 21 +-
.../datasource/ArchiveDataSourceFactory.ts | 26 +-
.../datasource/RemoteManifestDataSource.ts | 130 +-
src/platform/datasource/dataSources.ts | 418 +-
src/platform/datasource/inputSafety.ts | 185 +
src/platform/datasource/remotePreflight.ts | 38 +-
src/platform/export/DataProcessor.ts | 292 +-
src/platform/export/ExportService.ts | 166 +-
src/platform/export/MetadataExporter.ts | 370 +-
src/platform/export/TaskPlan.ts | 80 +
src/platform/export/VideoExporter.ts | 148 +-
src/platform/services/LeRobotDataLoader.ts | 28 +-
src/platform/workers/wasmUrl.inline.ts | 1 -
src/platform/workers/workerManager.ts | 29 +-
src/react/components/Commons/ErrorState.tsx | 7 +-
src/react/components/ErrorBoundary.tsx | 77 +-
src/react/components/LeRobotViewer.tsx | 157 +-
src/react/components/Navbar.tsx | 20 +-
src/react/components/PanelTitle.tsx | 4 +-
src/react/components/Playback/PlaybackBar.tsx | 7 +-
.../Sidebar/AnalysisSidebarContent.tsx | 7 +-
.../components/Sidebar/EpisodeSidebar.tsx | 111 +-
.../Sidebar/episodes/EpisodeHeader.tsx | 112 +-
.../Sidebar/episodes/EpisodeList.tsx | 130 +-
src/react/components/dialogs/ExportDialog.tsx | 60 +-
.../components/open/SampleDatasetCard.tsx | 11 +-
.../ChartPanel/Split/SplitJointMiniPlot.tsx | 5 +-
.../panels/Common/MediaDebugOverlay.tsx | 5 +-
.../panels/Common/PanelErrorBoundary.tsx | 80 +-
.../components/panels/Common/PanelState.tsx | 7 +-
.../panels/ImagePanel/ImagePanel.tsx | 17 +-
.../panels/VideoPanel/VideoPanel.tsx | 16 +-
src/react/contexts/LeRobotContext.ts | 10 +-
src/react/contexts/LeRobotProvider.tsx | 476 +--
src/react/contexts/useEpisodeView.ts | 129 +
src/react/contexts/useFeatureSubscriptions.ts | 230 ++
src/react/contexts/usePlaybackBridge.ts | 172 +
src/react/contexts/versionMutationPolicy.ts | 17 +
src/react/features/viewer/ViewerLayout.tsx | 28 +-
src/react/hooks/useKeyboardShortcuts.ts | 19 +-
src/react/i18n/core.tsx | 8 +-
src/react/index.ts | 103 +-
src/react/internal.ts | 52 +
src/react/locales/en.json | 14 +
src/react/locales/ja.json | 14 +
src/react/locales/zh.json | 14 +
src/ui/components/ui/dropdown-menu.tsx | 7 +-
tests/archive-datasource.spec.ts | 339 ++
tests/browser/a11y.ts | 32 +
.../browser-compatibility.browser.spec.tsx | 198 +
.../frontend-experience.browser.spec.tsx | 169 +
.../read-only-episodes.browser.spec.tsx | 94 +
tests/browser/ui-primitives.browser.spec.tsx | 44 +-
.../compat/official-dataset-roundtrip.spec.ts | 104 +-
.../official-metadata-roundtrip.spec.ts | 50 +-
tests/datasource-input-safety.spec.ts | 227 +
tests/episode-view.spec.ts | 49 +
tests/export-data.spec.ts | 210 +-
tests/export-metadata.spec.ts | 268 +-
tests/export-service.spec.ts | 307 +-
tests/export-video.spec.ts | 49 +
tests/feature-subscription-batcher.spec.ts | 105 +
.../lerobotv2-image/meta/episodes_stats.jsonl | 2 +
.../lerobotv2/meta/episodes_stats.jsonl | 2 +
.../meta/episodes/chunk-000/file-000.parquet | Bin 3772 -> 10678 bytes
tests/frontend-performance.spec.ts | 136 +
tests/helpers/officialStatsOracle.py | 61 +
tests/loader-lifecycle.spec.ts | 261 ++
tests/playback-bridge.spec.ts | 44 +
tests/remote-preflight.spec.ts | 237 ++
tests/split-service.spec.ts | 115 +
tests/stats-service-v061.spec.ts | 221 +
tests/versioning-stats-correctness.spec.ts | 127 +
tsconfig.app.json | 2 +-
vite.config.ts | 2 +-
vite.lib.config.ts | 48 +-
vitest.browser.smoke.config.ts | 54 +
vitest.config.ts | 42 +-
154 files changed, 13252 insertions(+), 1850 deletions(-)
create mode 100644 .changeset/README.md
create mode 100644 .changeset/config.json
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/dependency-review.yml
create mode 100644 .github/workflows/docs-pages.yml
create mode 100644 .github/workflows/release-dry-run.yml
create mode 100644 .github/workflows/scorecard.yml
create mode 100644 CODEOWNERS
create mode 100644 GOVERNANCE.md
create mode 100644 SUPPORT.md
create mode 100644 api-extractor.json
create mode 100644 docs/.vitepress/config.ts
create mode 100644 docs/api.md
create mode 100644 docs/browser.md
create mode 100644 docs/compatibility.md
create mode 100644 docs/cors.md
create mode 100644 docs/data-formats.md
create mode 100644 docs/deprecation.md
create mode 100644 docs/index.md
create mode 100644 docs/migration.md
create mode 100644 docs/privacy.md
create mode 100644 docs/quick-start.md
create mode 100644 docs/troubleshooting.md
create mode 100644 etc/lerobot-studio.api.md
create mode 100644 examples/next-app-router/app/layout.tsx
create mode 100644 examples/next-app-router/app/page.tsx
create mode 100644 examples/next-app-router/app/styles.css
create mode 100644 examples/next-app-router/components/ViewerCanvas.tsx
create mode 100644 examples/next-app-router/components/ViewerClient.tsx
create mode 100644 examples/next-app-router/next-env.d.ts
create mode 100644 examples/next-app-router/package.json
create mode 100644 examples/next-app-router/tsconfig.json
create mode 100644 examples/vite-react/index.html
create mode 100644 examples/vite-react/package.json
create mode 100644 examples/vite-react/src/App.tsx
create mode 100644 examples/vite-react/src/main.tsx
create mode 100644 examples/vite-react/src/styles.css
create mode 100644 examples/vite-react/tsconfig.json
create mode 100644 examples/vite-react/vite.config.ts
create mode 100644 scripts/check-bundle-size.mjs
create mode 100644 src/core/versioning/versionCapability.ts
create mode 100644 src/platform/datasource/inputSafety.ts
create mode 100644 src/platform/export/TaskPlan.ts
delete mode 100644 src/platform/workers/wasmUrl.inline.ts
create mode 100644 src/react/contexts/useEpisodeView.ts
create mode 100644 src/react/contexts/useFeatureSubscriptions.ts
create mode 100644 src/react/contexts/usePlaybackBridge.ts
create mode 100644 src/react/contexts/versionMutationPolicy.ts
create mode 100644 src/react/internal.ts
create mode 100644 tests/archive-datasource.spec.ts
create mode 100644 tests/browser/a11y.ts
create mode 100644 tests/browser/browser-compatibility.browser.spec.tsx
create mode 100644 tests/browser/frontend-experience.browser.spec.tsx
create mode 100644 tests/browser/read-only-episodes.browser.spec.tsx
create mode 100644 tests/datasource-input-safety.spec.ts
create mode 100644 tests/episode-view.spec.ts
create mode 100644 tests/export-video.spec.ts
create mode 100644 tests/feature-subscription-batcher.spec.ts
create mode 100644 tests/fixtures/datasets/lerobotv2-image/meta/episodes_stats.jsonl
create mode 100644 tests/fixtures/datasets/lerobotv2/meta/episodes_stats.jsonl
create mode 100644 tests/frontend-performance.spec.ts
create mode 100644 tests/helpers/officialStatsOracle.py
create mode 100644 tests/loader-lifecycle.spec.ts
create mode 100644 tests/playback-bridge.spec.ts
create mode 100644 tests/split-service.spec.ts
create mode 100644 tests/stats-service-v061.spec.ts
create mode 100644 tests/versioning-stats-correctness.spec.ts
create mode 100644 vitest.browser.smoke.config.ts
diff --git a/.changeset/README.md b/.changeset/README.md
new file mode 100644
index 0000000..631398b
--- /dev/null
+++ b/.changeset/README.md
@@ -0,0 +1,5 @@
+# Changesets
+
+Run `npm run changeset` for every user-visible package change. Commit the generated
+markdown file with the implementation so release versioning and changelog updates
+remain reviewable.
diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 0000000..2be13d4
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
+ "changelog": "@changesets/cli/changelog",
+ "commit": false,
+ "fixed": [],
+ "linked": [],
+ "access": "public",
+ "baseBranch": "main",
+ "updateInternalDependencies": "patch",
+ "ignore": []
+}
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 144ec59..3ff3800 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -3,7 +3,10 @@
## Checklist
- [ ] `npm run lint` passes
+- [ ] `npm run typecheck` passes
- [ ] `npm run test:unit` passes
-- [ ] Relevant builds (`build:web` / `build:lib`) pass
+- [ ] Relevant builds (`build` / `build:lib`) pass
+- [ ] `npm run check:package` passes after `npm run build:lib`
- [ ] Added a changeset when publishing API changes
+- [ ] Updated the API report when the stable public API changed
- [ ] Updated docs when behavior or public API changed
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index eeab96c..b640708 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,12 +1,16 @@
name: CI
on:
+ workflow_call:
push:
branches: [main, master]
pull_request:
+permissions:
+ contents: read
+
concurrency:
- group: ci-${{ github.workflow }}-${{ github.ref }}
+ group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
@@ -14,8 +18,10 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version-file: '.nvmrc'
cache: npm
@@ -33,41 +39,56 @@ jobs:
run: npm run test:coverage
- name: Build library
run: npm run build:lib
- - name: Verify npm consumer typecheck
- run: npm run verify:npm-consumer
+ - name: Verify publishable package and API report
+ run: npm run check:package
+ - name: Validate CycloneDX SBOM generation
+ run: npm run sbom
- name: Build web app
run: npm run build
+ - name: Build documentation
+ run: npm run docs:build
+ - name: Check npm and web bundle sizes
+ run: npm run check:bundle-size
browser-tests:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version-file: '.nvmrc'
cache: npm
- run: npm ci
- - run: npx playwright install --with-deps chromium
+ - name: Install browser engines
+ run: npx playwright install --with-deps chromium firefox webkit
- name: Generate test fixtures
run: npm run fixtures:generate
- - run: npm run test:browser
+ - name: Chromium full browser suite
+ run: npm run test:browser
+ - name: Cross-browser compatibility smoke
+ run: npm run test:browser:smoke
official-compat:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- - uses: actions/checkout@v4
- - uses: actions/checkout@v4
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
repository: huggingface/lerobot
- ref: adccdea1cfbec83ed98263feb7e59f7d047c5692
+ ref: 7e241bd630a3719a56157a497ce5d08f244784f1 # v0.6.1
path: official-lerobot
- - uses: actions/setup-node@v4
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version-file: '.nvmrc'
cache: npm
- - uses: astral-sh/setup-uv@v6
+ - uses: astral-sh/setup-uv@d0d8abe699bfb85fec6de9f7adb5ae17292296ff # v6
- run: npm ci
- name: Generate test fixtures
run: npm run fixtures:generate
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..7c85061
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,42 @@
+name: CodeQL
+
+on:
+ push:
+ branches: [main, master]
+ pull_request:
+ branches: [main, master]
+ schedule:
+ - cron: '17 4 * * 1'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: codeql-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ analyze:
+ name: Analyze (${{ matrix.language }})
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ permissions:
+ contents: read
+ security-events: write
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [javascript-typescript]
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@422a57891394145295c3272d7658d7c490278772 # v4.37.4
+ with:
+ languages: ${{ matrix.language }}
+ - name: Analyze
+ uses: github/codeql-action/analyze@422a57891394145295c3272d7658d7c490278772 # v4.37.4
+ with:
+ category: /language:${{ matrix.language }}
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
new file mode 100644
index 0000000..85a9849
--- /dev/null
+++ b/.github/workflows/dependency-review.yml
@@ -0,0 +1,26 @@
+name: Dependency Review
+
+on:
+ pull_request:
+ branches: [main, master]
+
+permissions:
+ contents: read
+
+concurrency:
+ group: dependency-review-${{ github.event.pull_request.number }}
+ cancel-in-progress: true
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - name: Review dependency changes
+ uses: actions/dependency-review-action@d02fa39f790d6e8a4ecafab5848251ff12c20df7 # v4.9.0
+ with:
+ fail-on-severity: moderate
+ comment-summary-in-pr: never
diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml
new file mode 100644
index 0000000..88bf6db
--- /dev/null
+++ b/.github/workflows/docs-pages.yml
@@ -0,0 +1,57 @@
+name: Documentation Pages
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'docs/**'
+ - 'etc/lerobot-studio.api.md'
+ - 'package.json'
+ - 'package-lock.json'
+ - '.github/workflows/docs-pages.yml'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: npm
+ - run: npm ci
+ - name: Build documentation for project Pages
+ env:
+ DOCS_BASE: /${{ github.event.repository.name }}/
+ run: npm run docs:build
+ - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
+ with:
+ path: docs/.vitepress/dist
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+ steps:
+ - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
+ - name: Deploy documentation
+ id: deployment
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index f56b9d6..bf60b4e 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -5,32 +5,79 @@ on:
- cron: '0 3 * * *'
workflow_dispatch:
+permissions:
+ contents: read
+
+concurrency:
+ group: nightly-${{ github.ref }}
+ cancel-in-progress: true
+
jobs:
browser:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- - uses: actions/checkout@v4
- - uses: actions/checkout@v4
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
repository: huggingface/lerobot
- ref: adccdea1cfbec83ed98263feb7e59f7d047c5692
+ ref: 7e241bd630a3719a56157a497ce5d08f244784f1 # v0.6.1
path: official-lerobot
- - uses: astral-sh/setup-uv@v6
- - uses: actions/setup-node@v4
+ persist-credentials: false
+ - uses: astral-sh/setup-uv@d0d8abe699bfb85fec6de9f7adb5ae17292296ff # v6
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version-file: '.nvmrc'
cache: npm
- run: npm ci
+ - name: Generate test fixtures
+ run: npm run fixtures:generate
- name: Install official LeRobot dataset reader
working-directory: official-lerobot
run: uv sync --extra dataset
- - run: npx playwright install --with-deps chromium
+ - name: Install browser engines
+ run: npx playwright install --with-deps chromium firefox webkit
- run: npm run test:unit
- - run: npm run test:browser
+ - name: Chromium full browser suite
+ run: npm run test:browser
+ - name: Cross-browser compatibility smoke
+ run: npm run test:browser:smoke
- name: Official LeRobot metadata compatibility
run: npx vitest run tests/compat
env:
LEROBOT_PYTHON: ${{ github.workspace }}/official-lerobot/.venv/bin/python
- run: npm run build
- run: npm run build:lib
+
+ upstream-main-compat:
+ name: Upstream main compatibility (warning)
+ continue-on-error: true
+ runs-on: ubuntu-latest
+ timeout-minutes: 45
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ repository: huggingface/lerobot
+ ref: main
+ path: official-lerobot
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: npm
+ - uses: astral-sh/setup-uv@d0d8abe699bfb85fec6de9f7adb5ae17292296ff # v6
+ - run: npm ci
+ - name: Generate test fixtures
+ run: npm run fixtures:generate
+ - name: Install upstream LeRobot dataset reader
+ working-directory: official-lerobot
+ run: uv sync --extra dataset
+ - name: Check compatibility with upstream main
+ env:
+ LEROBOT_PYTHON: ${{ github.workspace }}/official-lerobot/.venv/bin/python
+ run: npm run test:compat
diff --git a/.github/workflows/release-dry-run.yml b/.github/workflows/release-dry-run.yml
new file mode 100644
index 0000000..f0e0f9a
--- /dev/null
+++ b/.github/workflows/release-dry-run.yml
@@ -0,0 +1,45 @@
+name: Release Dry Run
+
+on:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: release-dry-run-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ ci:
+ uses: ./.github/workflows/ci.yml
+ permissions:
+ contents: read
+
+ artifacts:
+ needs: ci
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: npm
+ - run: npm ci
+ - run: npm run build:lib
+ - name: Validate npm package without publishing
+ run: npm publish --dry-run --access public
+ - name: Generate CycloneDX SBOM
+ run: npm run sbom
+ - name: Build container without pushing
+ uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
+ with:
+ context: .
+ push: false
+ provenance: mode=max
+ sbom: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index d97e22f..a020729 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,27 +7,38 @@ on:
workflow_dispatch:
permissions:
- contents: write
- packages: write
- id-token: write
+ contents: read
+
+concurrency:
+ group: release-${{ github.ref }}
+ cancel-in-progress: false
jobs:
+ ci:
+ uses: ./.github/workflows/ci.yml
+ permissions:
+ contents: read
+
release:
+ needs: ci
runs-on: ubuntu-latest
timeout-minutes: 60
+ permissions:
+ contents: write
+ packages: write
+ id-token: write
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version-file: '.nvmrc'
cache: npm
registry-url: https://registry.npmjs.org
- run: npm ci
- - run: npx playwright install --with-deps chromium
- - run: npm run test:unit
- - run: npm run test:browser
- run: npm run build:lib
- - run: npm run build
+ - run: npm run sbom
- name: Verify tag matches npm package version
env:
TAG_VERSION: ${{ github.ref_name }}
@@ -38,14 +49,23 @@ jobs:
echo "Tag $TAG_VERSION must match package version $expected_tag" >&2
exit 1
}
- - name: Publish npm package
+ - name: Bootstrap first npm publish
+ if: github.ref_name == 'v1.0.0'
env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_BOOTSTRAP_TOKEN }}
+ run: |
+ test -n "$NODE_AUTH_TOKEN" || {
+ echo "NPM_BOOTSTRAP_TOKEN is required only for the first package publication" >&2
+ exit 1
+ }
+ npm publish --access public --provenance
+ - name: Publish npm package with trusted publishing
+ if: github.ref_name != 'v1.0.0'
run: npm publish --access public --provenance
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Login to GHCR
- uses: docker/login-action@v3
+ uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -54,15 +74,18 @@ jobs:
id: meta
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
- name: Build and push Docker image
- uses: docker/build-push-action@v6
+ uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: .
push: true
+ provenance: mode=max
+ sbom: true
platforms: linux/amd64,linux/arm64
tags: |
ghcr.io/ioai-tech/lerobot-studio:latest
ghcr.io/ioai-tech/lerobot-studio:${{ steps.meta.outputs.version }}
- name: GitHub Release
- uses: softprops/action-gh-release@v2
+ uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
with:
generate_release_notes: true
+ files: sbom.cdx.json
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
new file mode 100644
index 0000000..2120bb7
--- /dev/null
+++ b/.github/workflows/scorecard.yml
@@ -0,0 +1,39 @@
+name: OpenSSF Scorecard
+
+on:
+ branch_protection_rule:
+ schedule:
+ - cron: '23 5 * * 2'
+ push:
+ branches: [main, master]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: scorecard-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ scorecard:
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ permissions:
+ contents: read
+ id-token: write
+ security-events: write
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ with:
+ persist-credentials: false
+ - name: Run Scorecard analysis
+ uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
+ with:
+ results_file: results.sarif
+ results_format: sarif
+ publish_results: true
+ - name: Upload Scorecard results to code scanning
+ uses: github/codeql-action/upload-sarif@422a57891394145295c3272d7658d7c490278772 # v4.37.4
+ with:
+ sarif_file: results.sarif
diff --git a/.gitignore b/.gitignore
index a89a4a1..07d29a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@ dist-ssr
dist-lib
dev-dist
coverage
+docs/.vitepress/cache
+/temp/
*.local
.env
.env.*
@@ -20,6 +22,7 @@ coverage
.vitest-attachments/
tests/browser/__screenshots__/
*.tgz
+sbom.cdx.json
# Editor directories and files
.vscode/*
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dfac3a3..4ecc910 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,11 +10,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Single-package source layout with logical `core`, `platform`, `ui`, `react`, and `web` boundaries
-- Published package identity `@ioai/lerobot-studio` (MIT)
+- Package identity `@ioai/lerobot-studio` (MIT)
- Shared `ViewerLayout` for app and library shells
- `LeRobotStudioProvider` public composition root
- Minimal synthetic LeRobot v2/v3 fixtures under `tests/fixtures/datasets`
- GitHub Actions CI, nightly browser tests, and release workflow (npm + GHCR)
+- Governance, support, security response targets, privacy disclosure,
+ compatibility matrix, CODEOWNERS, and deprecation policy
+
+### Changed
+
+- Defined the stable 1.0 library contract as viewer-only, ESM/CSR-only,
+ browser-only, React `^19.0.0`, zero telemetry, and backward compatible within
+ major version 1
+- Defined exact LeRobot `v2.1` and `v3.0` support; other declared versions are
+ unknown rather than prefix-compatible
+- Classified unknown-version read-only warnings, blocked export, browser
+ validation, consumer validation, and official training-ready export as 1.0
+ release gates, not current verified capabilities
### Removed
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000..cd1ee19
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,13 @@
+# Replace this planned team if the public repository uses a different
+# write-enabled maintainer team. GitHub does not enforce this file until the
+# referenced team exists and branch protection requires CODEOWNERS review.
+* @ioai-tech/maintainers
+
+/SECURITY.md @ioai-tech/maintainers
+/GOVERNANCE.md @ioai-tech/maintainers
+/CODE_OF_CONDUCT.md @ioai-tech/maintainers
+/CODEOWNERS @ioai-tech/maintainers
+/NOTICE @ioai-tech/maintainers
+/docs/compatibility.md @ioai-tech/maintainers
+/docs/deprecation.md @ioai-tech/maintainers
+/docs/privacy.md @ioai-tech/maintainers
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 0b0a632..c0d84b4 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -21,12 +21,21 @@ Examples of unacceptable behavior include:
## Enforcement
-Report unacceptable behavior to the maintainers through
-[GitHub Issues](https://github.com/ioai-tech/lerobot-studio/issues). Do not use
-public issues to report security vulnerabilities; follow [SECURITY.md](./SECURITY.md)
-instead. Maintainers will review reports and respond as appropriate.
+Do not place sensitive conduct reports, personal information, or evidence in a
+public issue. Email `io@io-ai.tech` with the subject “LeRobot Studio conduct
+report”, or contact an IO-AI.TECH organization maintainer privately through
+their GitHub profile. Share only the information needed to assess the report.
+
+Maintainers will protect reporter privacy as far as practical, disclose
+information only to those needed for review, and avoid retaliation. A
+maintainer who is involved in a report must recuse themselves. Responses may
+include a warning, content removal, temporary restriction, permanent ban, or
+referral to the relevant platform or authority.
+
+Do not use conduct reporting for security vulnerabilities; follow
+[SECURITY.md](./SECURITY.md) instead.
## Attribution
-This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
-version 2.1.
+This Code of Conduct is adapted from the
+[Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b4e5492..ba23097 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,11 +10,47 @@ npm run fixtures:generate
npm run dev
```
-Before a pull request, run `npm run format:check`, `npm run lint`, `npm run typecheck`, `npm run test:unit`, and the relevant build target.
+Before a pull request, run `npm run format:check`, `npm run lint`,
+`npm run typecheck`, `npm run test:unit`, and the relevant build target. Run
+browser, compatibility, and npm-consumer checks when the change affects those
+surfaces.
## Architecture guidelines
-The repository has one publishable package. Keep the dependency direction `web → react → platform → core`; UI is shared by React and the app. `core` remains free of React and browser APIs, while WASM, workers, and file-system integration stay in `src/platform`. The public npm API is `src/react/index.ts`.
+The repository has one publishable package. Keep the dependency direction
+`web → react → platform → core`; UI is shared by React and the app. `core`
+remains free of React and browser APIs, while WASM, workers, and file-system
+integration stay in `src/platform`. The public npm API is
+`src/react/index.ts`.
+
+The stable 1.0 library is viewer-only, ESM/CSR-only, browser-only, and targets
+React `^19.0.0`. Do not add editing or export services to the stable public API,
+SSR/RSC paths, CommonJS output, telemetry, or undocumented network calls.
+
+## Compatibility and data integrity
+
+Read [Compatibility](./docs/compatibility.md) before changing loaders,
+validators, media handling, export, packaging, or browser APIs.
+
+- Treat dataset input as untrusted and preserve source data.
+- Support LeRobot `v2.1` and `v3.0` by exact declared version only.
+- Keep unknown versions warning-marked and read-only; export must be blocked in
+ both UI and service layers.
+- Do not call export supported until official LeRobot training-readiness tests
+ pass for the complete output.
+- Add fixtures and regression tests for behavior changes. Record actual browser
+ versions for browser compatibility claims.
+
+## Pull requests
+
+Keep changes focused and explain user-visible behavior, compatibility impact,
+test evidence, privacy/security impact, and migration steps. Public API changes
+must follow the [deprecation policy](./docs/deprecation.md). A maintainer and
+required CODEOWNERS approve changes; authors do not approve their own pull
+requests.
+
+By contributing, you agree that your contribution is licensed under the
+repository’s [MIT License](./LICENSE).
## Code of conduct
@@ -23,3 +59,5 @@ Please follow [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
## Security
Please report vulnerabilities via [SECURITY.md](./SECURITY.md).
+
+For usage questions and support boundaries, see [SUPPORT.md](./SUPPORT.md).
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
new file mode 100644
index 0000000..02470e1
--- /dev/null
+++ b/GOVERNANCE.md
@@ -0,0 +1,71 @@
+# Governance
+
+LeRobot Studio is stewarded by IO-AI.TECH. This document defines project
+decision-making and release authority; it does not grant legal authority on
+behalf of the company.
+
+## Roles
+
+- **Contributors** propose issues, documentation, code, tests, and reviews.
+- **Maintainers** triage issues, review and merge changes, enforce project
+ contracts, and manage community spaces.
+- **Release maintainers** are a least-privilege subset of maintainers with npm,
+ GitHub release, container registry, and signing access.
+- **Security maintainers** can access private security advisories and coordinate
+ disclosure.
+
+IO-AI.TECH appoints and removes maintainers based on sustained, constructive
+participation, technical judgment, security practices, and availability.
+Repository and team membership are the authoritative role records.
+
+## Decisions
+
+Routine changes use lazy consensus through reviewed pull requests. The author
+does not approve their own change. Required checks and CODEOWNERS review must
+pass before merge.
+
+Changes to the stable public API, dataset compatibility, privacy or telemetry
+contract, security policy, licensing, governance, or release process require:
+
+1. a written proposal in an issue or pull request;
+2. compatibility and migration analysis; and
+3. approval from at least two maintainers, including a relevant CODEOWNER.
+
+When consensus cannot be reached, IO-AI.TECH’s designated project lead makes
+the final decision and records the rationale. Security maintainers may act
+privately and urgently to protect users.
+
+## Release authority
+
+Only release maintainers may publish npm packages, GitHub releases, tags, or
+official container images. Production credentials must not be available to
+untrusted pull-request jobs. Releases require:
+
+- a clean, reviewed commit on the protected release branch;
+- passing required checks and acceptance gates;
+- an updated changelog and version/tag agreement;
+- provenance and artifact review where the release platform supports them; and
+- approval by two maintainers, at least one of whom is a release maintainer.
+
+Published versions and tags are immutable. A faulty release is followed by a
+new version; tags and registry artifacts are not silently replaced. Security
+releases may use an expedited private review while retaining two-person
+approval.
+
+The stable `1.0.0` release must satisfy
+[Compatibility and release gates](./docs/compatibility.md), including official
+LeRobot training-readiness validation for every advertised export path.
+
+## Compatibility and deprecation
+
+Major version 1 maintains backward compatibility for documented public APIs.
+Deprecations follow [docs/deprecation.md](./docs/deprecation.md). Exact LeRobot
+version support and the zero-telemetry npm contract cannot be weakened in a
+minor or patch release.
+
+## Conduct, security, and conflicts
+
+Community participation follows [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
+Vulnerabilities follow [SECURITY.md](./SECURITY.md). Maintainers disclose
+material conflicts of interest and recuse themselves when impartial review is
+not possible.
diff --git a/NOTICE b/NOTICE
index 4240a76..3092333 100644
--- a/NOTICE
+++ b/NOTICE
@@ -5,7 +5,8 @@ This repository depends on third-party packages. The exact dependency graph,
versions, package registry locations, integrity hashes, and SPDX license
identifiers are recorded in `package-lock.json`.
-The following non-MIT license identifiers are present in the current lockfile:
+Examples of non-MIT license identifiers present in the current lockfile
+include:
- `@fontsource-variable/geist` 5.3.0 — OFL-1.1
- `argparse` 2.0.1 — Python-2.0
@@ -15,7 +16,9 @@ The following non-MIT license identifiers are present in the current lockfile:
- `spawndamnit` 3.0.1 — `SEE LICENSE IN LICENSE`
- `tslib` 2.8.1 — 0BSD
-Transitive copies of the packages above may also appear in the lockfile. This
-notice is an index, not a replacement for the applicable third-party license
-texts. Before distributing a built artifact, regenerate and review the
-dependency inventory for the lockfile used to produce that artifact.
+This list is representative, not exhaustive; development tools, optional
+platform packages, and transitive dependencies may use additional licenses.
+This notice is an index, not a replacement for the applicable third-party
+license texts. Before distributing a built artifact, generate and review a
+complete production-artifact dependency and asset inventory from the exact
+lockfile and build output used for that release.
diff --git a/README.md b/README.md
index 4d50070..588daf4 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,29 @@
# LeRobot Studio
-Browser-based visualizer for [LeRobot](https://github.com/huggingface/lerobot) datasets, by [IO-AI.TECH](https://io-ai.tech).
+Browser-based viewer for [LeRobot](https://github.com/huggingface/lerobot)
+datasets, by [IO-AI.TECH](https://io-ai.tech).
Live demo: [https://lerobot.studio](https://lerobot.studio)
-- Open local folders, local archives, or remote archives (CORS + Range required)
-- Synced video / charts / raw feature inspection
-- Export and light editing workflows
-- Embeddable React package: `@ioai/lerobot-studio`
+This repository is preparing the stable `1.0.0` contract. Viewing is the only
+stable public library workflow: the package does not mutate source datasets and
+does not expose an editor API. Export in the standalone application is not part
+of the stable library API and remains a **1.0 release gate** until its output is
+validated as directly consumable by official LeRobot training.
+
+- Open local folders, local archives, or remote archives
+- Inspect synchronized video, charts, and raw features
+- Embed the client-only React viewer through `@ioai/lerobot-studio`
+- Process dataset content locally in the browser
## Open source
-LeRobot Studio is developed in the open at
-[ioai-tech/lerobot-studio](https://github.com/ioai-tech/lerobot-studio).
+LeRobot Studio is preparing for public development at
+`github.com/ioai-tech/lerobot-studio`. That public repository and its issue
+tracker are part of the GitHub migration and may not be available yet.
-- Report reproducible bugs or propose improvements through
- [GitHub Issues](https://github.com/ioai-tech/lerobot-studio/issues).
+- After publication, report reproducible bugs or propose improvements through
+ the repository’s GitHub Issues.
- Read [CONTRIBUTING.md](./CONTRIBUTING.md) before submitting a pull request.
- Follow the [Code of Conduct](./CODE_OF_CONDUCT.md) in all community spaces.
- Report security vulnerabilities only through the private process in
@@ -43,6 +51,9 @@ docker build -t lerobot-studio .
docker run --rm -p 8080:80 lerobot-studio
```
+Then open [http://localhost:8080](http://localhost:8080). For production
+hosting, see [Deployment](./docs/deployment.md).
+
## Repository layout
```
@@ -57,6 +68,8 @@ docs/ Architecture and ops docs
## Library usage
+After the `1.0.0` package is published:
+
```bash
npm install @ioai/lerobot-studio
```
@@ -66,29 +79,94 @@ import { LeRobotViewer } from '@ioai/lerobot-studio';
import '@ioai/lerobot-studio/style.css';
export function App() {
- return ;
+ return (
+
+
+
+ );
}
```
+The host must give the viewer an explicit height; the component fills its
+container and does not choose a page height. The `1.0.0` compatibility contract
+is React and React DOM `^19.0.0`, ESM-only, browser-only, and CSR-only. Vite and
+Next.js client-only consumer validation remains a 1.0 release gate.
+
+### Vite
+
+Import and render the component normally in client code. Do not externalize its
+CSS, workers, or WASM assets from the browser build.
+
+### Next.js
+
+Load the viewer from a Client Component with SSR disabled:
+
+```tsx
+'use client';
+
+import dynamic from 'next/dynamic';
+
+const Viewer = dynamic(
+ () => import('@ioai/lerobot-studio').then((module) => module.LeRobotViewer),
+ { ssr: false },
+);
+```
+
+LeRobot Studio does not support React Server Components, server rendering,
+CommonJS, or execution in Node.js.
+
+## Compatibility contract
+
+- Stable line: `1.0.0`; minor and patch releases remain backward compatible
+ within major version 1, subject to the [deprecation policy](./docs/deprecation.md).
+- Dataset formats planned for exact 1.0 support: LeRobot `v2.1` and `v3.0`.
+ Prefix-compatible variants such as `v2.0`, `v2.x`, or `v3.x` are not covered.
+- Unknown versions must open only in warning-marked read-only mode when they can
+ be parsed safely, and export must remain disabled. This behavior is a 1.0
+ release gate and is not yet guaranteed by the current implementation.
+- Export for supported versions may be released only after official LeRobot
+ training-readiness validation. No best-effort export is considered supported.
+- The npm library ships with zero telemetry. It must not send analytics,
+ diagnostics, dataset metadata, filenames, or usage events.
+
+See [Compatibility and release gates](./docs/compatibility.md) for browser,
+dataset, network, and capability matrices.
+
## Documentation
+- [Quick Start](./docs/quick-start.md)
+- [Stable API](./docs/api.md)
+- [Data formats](./docs/data-formats.md)
+- [CORS and HTTP Range](./docs/cors.md)
+- [Browser support](./docs/browser.md)
+- [Troubleshooting](./docs/troubleshooting.md)
+- [Migration](./docs/migration.md)
- [Architecture](./docs/architecture.md)
+- [Compatibility and release gates](./docs/compatibility.md)
- [Development](./docs/development.md)
- [Deployment](./docs/deployment.md)
+- [Privacy](./docs/privacy.md)
+- [Deprecation policy](./docs/deprecation.md)
- [GitHub migration checklist](./docs/github-migration.md)
- [Contributing](./CONTRIBUTING.md)
+- [Governance](./GOVERNANCE.md)
+- [Support](./SUPPORT.md)
- [Security](./SECURITY.md)
- [Third-party notices](./NOTICE)
## Deploy
-The public site at [https://lerobot.studio](https://lerobot.studio) is deployed by
-Cloudflare Workers Builds connected to this GitHub repository (`main` branch).
-See [Deployment](./docs/deployment.md).
+The public site is [https://lerobot.studio](https://lerobot.studio). Connecting
+the migrated GitHub `main` branch to Cloudflare Workers Builds is the planned
+production path and must be verified during migration. See
+[Deployment](./docs/deployment.md).
## Privacy
-The open-source distribution does not ship third-party analytics (no Google Analytics / Clarity).
+The npm library has a zero-telemetry contract. The application uses browser
+storage for preferences, recent-source metadata, and—when the browser permits
+it—local file handles. Dataset bytes are processed locally unless the user
+opens a remote URL. See [Privacy](./docs/privacy.md).
## License
diff --git a/SECURITY.md b/SECURITY.md
index 9a2541c..d196a6c 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,16 +2,21 @@
## Supported versions
-Security fixes are accepted for the latest released major version of
-`@ioai/lerobot-studio`.
+After `1.0.0` is released, security fixes are provided for the latest minor
+release in major version 1. Older minors may receive a coordinated upgrade path
+rather than a backport. Unreleased branches, development snapshots, forks,
+third-party deployments, and modified distributions receive best-effort
+support only.
## Reporting a vulnerability
Please **do not** open a public issue for security vulnerabilities.
-Submit a [private GitHub security advisory](https://github.com/ioai-tech/lerobot-studio/security/advisories/new).
-This is the only supported reporting channel; this repository does not publish a
-security email address.
+After the public GitHub migration, submit a private GitHub security advisory
+from the repository’s **Security → Advisories → Report a vulnerability** page.
+Until that repository and advisory form are available, email
+`io@io-ai.tech` with the subject “LeRobot Studio security report”. Do not send
+secrets or sensitive dataset content in the first message.
Include:
@@ -20,5 +25,57 @@ Include:
- Impact assessment
- Any known mitigations
-Maintainers will use the private advisory to coordinate follow-up and
-disclosure.
+Do not include sensitive dataset content unless maintainers request a minimal,
+sanitized reproducer through the private advisory.
+
+## Response targets
+
+These are service targets, not guarantees:
+
+- acknowledgment within 3 business days;
+- initial severity and scope assessment within 7 business days;
+- a private status update at least every 7 business days while an accepted
+ report remains unresolved;
+- critical-severity remediation target: 7 calendar days after confirmation;
+- high-severity remediation target: 30 calendar days after confirmation; and
+- moderate/low-severity remediation target: the next appropriate scheduled
+ release.
+
+Complex dependency, browser, or coordinated-disclosure cases may take longer.
+Maintainers will explain material delays in the private advisory.
+
+## Disclosure and release
+
+Maintainers validate the report, assign severity based on practical impact,
+prepare fixes and advisories privately, and coordinate disclosure with the
+reporter. Please allow a reasonable remediation period before public
+disclosure. Security releases may shorten the normal deprecation window.
+
+The project will publish an advisory when users need to act and will credit the
+reporter unless anonymity is requested. Release authority follows
+[GOVERNANCE.md](./GOVERNANCE.md).
+
+## Supply-chain security
+
+Pull requests are checked by CI, dependency review, and CodeQL. Scheduled
+OpenSSF Scorecard analysis reports repository-level supply-chain findings.
+Workflow permissions are read-only by default; jobs that upload security
+results or publish releases receive only their required permissions. Actions
+outside the release workflow are pinned to full commit SHAs and tracked by
+Dependabot.
+
+Repository administrators must separately enable and verify the GitHub security
+features and branch rules described in
+[docs/github-migration.md](./docs/github-migration.md). Checked-in workflows do
+not prove that those settings are active. Report a suspected compromised
+dependency, action, package, release artifact, or maintainer credential through
+the private vulnerability channel above.
+
+## Scope
+
+In scope are vulnerabilities in this repository’s distributed web application
+and npm package, including unsafe parsing of untrusted datasets, cross-origin or
+storage boundary violations, unintended data disclosure, dependency or build
+compromise, and bypass of read-only/export restrictions. Service availability,
+remote dataset hosts, host-application code, unsupported browsers, and social
+engineering are normally out of scope unless they demonstrate a project defect.
diff --git a/SUPPORT.md b/SUPPORT.md
new file mode 100644
index 0000000..db17fd1
--- /dev/null
+++ b/SUPPORT.md
@@ -0,0 +1,51 @@
+# Support
+
+LeRobot Studio is community-supported open-source software. No response time,
+availability, compatibility, or remediation commitment is created by this
+document. Security reports use the separate targets in
+[SECURITY.md](./SECURITY.md).
+
+## Where to ask
+
+- Reproducible product defects: after the public migration, use GitHub Issues
+ in `ioai-tech/lerobot-studio`
+- Feature and compatibility proposals: after the public migration, use GitHub
+ Issues with the use case, dataset version, and migration impact
+- Vulnerabilities: private reporting only through
+ [SECURITY.md](./SECURITY.md)
+- Contributions: [CONTRIBUTING.md](./CONTRIBUTING.md)
+
+The public issue tracker is not considered available until the GitHub migration
+checklist is complete. Before opening an issue, search existing reports and
+test the latest supported release. Include the LeRobot `codebase_version`,
+browser and OS versions, input type, minimal reproduction, console errors, and
+whether the issue occurs in the standalone app or npm package. Remove
+credentials, signed URLs, personal data, and confidential dataset content.
+
+## Supported boundary
+
+For stable 1.0, support is limited to the documented viewer API, exact LeRobot
+`v2.1` and `v3.0`, supported browser/input combinations, and documented
+deployment behavior. See [Compatibility](./docs/compatibility.md).
+
+The following are outside community support unless a project defect can be
+reproduced within that boundary:
+
+- custom or unknown LeRobot formats and manually repaired datasets;
+- SSR, React Server Components, CommonJS, Node.js execution, or React versions
+ outside the documented range;
+- host-application code, authentication, proxies, CORS configuration, remote
+ storage availability, and browser codec availability;
+- forks, private patches, unsupported releases, and third-party deployments;
+- dataset recovery, annotation, training, model quality, or robotics advice;
+ and
+- guaranteed export before official training-readiness validation is complete.
+
+Unknown dataset versions are not supported formats. The 1.0 target is safe,
+warning-marked read-only inspection when possible, with export prohibited.
+
+## Commercial support
+
+This repository does not promise private or commercial support. Any separate
+agreement with IO-AI.TECH is governed by that agreement, not by project issues
+or this document.
diff --git a/api-extractor.json b/api-extractor.json
new file mode 100644
index 0000000..f76735e
--- /dev/null
+++ b/api-extractor.json
@@ -0,0 +1,33 @@
+{
+ "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
+ "mainEntryPointFilePath": "/temp/types/react/index.d.ts",
+ "compiler": {
+ "tsconfigFilePath": "/tsconfig.lib.json",
+ "skipLibCheck": true
+ },
+ "apiReport": {
+ "enabled": true,
+ "reportFolder": "/etc",
+ "reportTempFolder": "/temp"
+ },
+ "docModel": {
+ "enabled": false
+ },
+ "dtsRollup": {
+ "enabled": true,
+ "untrimmedFilePath": "/dist-lib/lerobot.d.ts"
+ },
+ "tsdocMetadata": {
+ "enabled": false
+ },
+ "messages": {
+ "extractorMessageReporting": {
+ "ae-forgotten-export": {
+ "logLevel": "error"
+ },
+ "ae-missing-release-tag": {
+ "logLevel": "none"
+ }
+ }
+ }
+}
diff --git a/components.json b/components.json
index d773367..71297e7 100644
--- a/components.json
+++ b/components.json
@@ -13,11 +13,11 @@
"iconLibrary": "lucide",
"rtl": false,
"aliases": {
- "components": "src/components",
- "utils": "src/lib/utils",
- "ui": "src/ui/components",
- "lib": "src/lib",
- "hooks": "src/hooks"
+ "components": "src/ui/components",
+ "utils": "src/ui/lib/utils",
+ "ui": "src/ui/components/ui",
+ "lib": "src/ui/lib",
+ "hooks": "src/react/hooks"
},
"menuColor": "default",
"menuAccent": "subtle",
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
new file mode 100644
index 0000000..e937245
--- /dev/null
+++ b/docs/.vitepress/config.ts
@@ -0,0 +1,70 @@
+import { defineConfig } from 'vitepress';
+
+export default defineConfig({
+ title: 'LeRobot Studio',
+ description: 'Browser-based viewer and React library for LeRobot datasets',
+ lang: 'en-US',
+ base: process.env.DOCS_BASE ?? '/',
+ cleanUrls: true,
+ lastUpdated: true,
+ markdown: {
+ lineNumbers: true,
+ },
+ themeConfig: {
+ nav: [
+ { text: 'Guide', link: '/quick-start' },
+ { text: 'API', link: '/api' },
+ { text: 'Data formats', link: '/data-formats' },
+ { text: 'Operations', link: '/deployment' },
+ { text: 'Live demo', link: 'https://lerobot.studio' },
+ ],
+ sidebar: [
+ {
+ text: 'Start',
+ items: [
+ { text: 'Introduction', link: '/' },
+ { text: 'Quick Start', link: '/quick-start' },
+ { text: 'API', link: '/api' },
+ ],
+ },
+ {
+ text: 'Compatibility',
+ items: [
+ { text: 'Data formats', link: '/data-formats' },
+ { text: 'CORS and Range', link: '/cors' },
+ { text: 'Browser support', link: '/browser' },
+ { text: 'Release gates', link: '/compatibility' },
+ ],
+ },
+ {
+ text: 'Guides',
+ items: [
+ { text: 'Privacy', link: '/privacy' },
+ { text: 'Troubleshooting', link: '/troubleshooting' },
+ { text: 'Migration', link: '/migration' },
+ { text: 'Deprecation policy', link: '/deprecation' },
+ ],
+ },
+ {
+ text: 'Project',
+ collapsed: true,
+ items: [
+ { text: 'Architecture', link: '/architecture' },
+ { text: 'Development', link: '/development' },
+ { text: 'Deployment', link: '/deployment' },
+ { text: 'GitHub migration', link: '/github-migration' },
+ ],
+ },
+ ],
+ search: {
+ provider: 'local',
+ },
+ outline: {
+ level: [2, 3],
+ },
+ footer: {
+ message: 'Released under the MIT License.',
+ copyright: 'Copyright © 2026 IO-AI.TECH',
+ },
+ },
+});
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 0000000..9482287
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,54 @@
+# Stable API
+
+The generated API report is the source of truth for the publishable surface.
+The stable `1.0` contract is **viewer-only**: it contains the viewer, browser
+data-source factories, and their public types. Product internals, source
+mutation, editing, and export services are not public API.
+
+::: warning Publication status
+The package is preparing for `1.0.0` and has not been published. The API report
+describes the intended stable surface, but publication still depends on the
+[1.0 release gates](./compatibility.md).
+:::
+
+## Primary entry point
+
+```tsx
+import { LeRobotViewer } from '@ioai/lerobot-studio';
+import '@ioai/lerobot-studio/style.css';
+
+ {
+ console.error(error.code, error.message);
+ }}
+/>;
+```
+
+`dataSource` accepts either a remote archive URL or a custom `DataSource`.
+Use `createArchiveDataSourceFromFile` for a local ZIP, TAR, or TAR.GZ archive,
+and `createArchiveDataSourceFromUrl` when you need a reusable remote source.
+
+The optional `onExport` prop is only a host-owned UI callback. It does not
+export data and does not make export part of the stable npm API.
+
+## Custom data sources
+
+A custom `DataSource` supplies browser-readable bytes and text by path. It may
+also provide path listing and object URL lifecycle methods. Implementations
+must treat dataset content as untrusted input and should release object URLs
+and other resources from `clear()`.
+
+Progress callbacks use the `download`, `index`, `gunzip`, and `read` loading
+phases. Fatal viewer errors are classified as invalid source, unavailable
+remote source, unsupported archive, or dataset load failure.
+
+## Generated API report
+
+The following section is included directly from
+`etc/lerobot-studio.api.md`. Update public declarations through the library
+source and `npm run api:report`; do not hand-edit the report or duplicate it
+here.
+
+
diff --git a/docs/architecture.md b/docs/architecture.md
index e451402..df6dc98 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -1,6 +1,7 @@
# Architecture
-LeRobot Studio is a single npm package and SPA repository. The directory boundaries are architectural, not separately published packages.
+LeRobot Studio is a single npm package and client-rendered SPA repository. The
+directory boundaries are architectural, not separately published packages.
```
src/core Pure TypeScript domain logic
@@ -29,4 +30,32 @@ src/web → src/react → src/platform → src/core
## Public API
-The publishable surface is `src/react/index.ts`. Styles are exposed as `@ioai/lerobot-studio/style.css`.
+The publishable surface is `src/react/index.ts`. Styles are exposed as
+`@ioai/lerobot-studio/style.css`.
+
+The stable 1.0 package contract is viewer-only, ESM-only, browser-only, and
+CSR-only with React and React DOM `^19.0.0`. “Viewer-only” means that dataset
+viewing is the only stable library workflow; source mutation, editing, export
+services, and standalone application controls are not stable public APIs. Any
+export that exceeds that boundary must remain internal or be explicitly
+classified before 1.0.
+
+Public APIs remain backward compatible within major version 1 according to the
+[deprecation policy](./deprecation.md).
+
+## Trust boundaries
+
+- Dataset parsing, validation, media handling, and export operate on untrusted
+ input and must fail without modifying source data.
+- Unknown dataset versions must not silently select a version adapter. The 1.0
+ behavior is warning-marked read-only inspection when safe, with export
+ disabled.
+- Remote sources cross an external network boundary; CORS, Range,
+ authentication, availability, and remote logging are controlled by the host
+ and source server.
+- Browser storage is optional and failure-tolerant. See [Privacy](./privacy.md).
+- The npm library has a zero-telemetry contract.
+
+These trust-boundary guarantees include 1.0 release gates that are tracked in
+[Compatibility](./compatibility.md); they are not all enforced by the current
+pre-release implementation.
diff --git a/docs/browser.md b/docs/browser.md
new file mode 100644
index 0000000..3ca6a00
--- /dev/null
+++ b/docs/browser.md
@@ -0,0 +1,38 @@
+# Browser support
+
+LeRobot Studio targets modern browsers, but feature availability depends on
+browser APIs, media codecs, dataset encoding, and deployment policy. “Modern”
+does not guarantee that every video can be decoded or encoded.
+
+## Validation scope
+
+CI runs the full browser suite in Chromium and a compatibility smoke suite in
+Firefox and WebKit. The smoke suite covers viewer composition, localized error
+states, keyboard and accessibility primitives, unknown-version read-only
+behavior, and remote or custom `DataSource` contracts.
+
+| Capability | Chromium | Firefox | WebKit |
+| ---------------------------- | ------------------------- | --------------------- | --------------------- |
+| Viewer and error states | CI smoke | CI smoke | CI smoke |
+| Remote/custom data source | CI smoke | CI smoke | CI smoke |
+| Local archive viewing | Planned validation | Planned validation | Planned validation |
+| Restorable directory handles | Capability detected | Archive-only fallback | Archive-only fallback |
+| Directory export | Chromium only | Unavailable | Unavailable |
+| Video encoding/export | Full suite with WebCodecs | Capability detected | Capability detected |
+| Video playback | Codec dependent | Codec dependent | Codec dependent |
+
+This matrix separates tested scope from intended support. Release evidence must
+record actual browser versions, and all 1.0 claims remain subject to the
+[release gates](./compatibility.md).
+
+## Client-only requirement
+
+The package accesses browser facilities and must be rendered only on the
+client. It does not support SSR, hydration of server-rendered viewer markup,
+React Server Components, Node.js, or CommonJS.
+
+## Graceful degradation
+
+Missing File System Access or WebCodecs capabilities should remove or disable
+the affected operation rather than break inspection. Unsupported media should
+produce a clear error while non-media inspection remains available where safe.
diff --git a/docs/compatibility.md b/docs/compatibility.md
new file mode 100644
index 0000000..5dafa08
--- /dev/null
+++ b/docs/compatibility.md
@@ -0,0 +1,114 @@
+# Compatibility and release gates
+
+This document separates the stable `1.0.0` contract from behavior that still
+requires implementation or verification. A row marked **1.0 gate** must not be
+presented as supported until its automated and manual acceptance checks pass.
+
+## Runtime contract
+
+- React and React DOM: `^19.0.0`
+- Module format: ESM only
+- Rendering: client-side rendering only
+- Runtime: modern browsers only; Node.js, CommonJS, React Server Components,
+ server-side rendering, and hydration of server-rendered viewer markup are out
+ of scope
+- Compatibility: public APIs remain backward compatible throughout major
+ version 1, subject to the [deprecation policy](./deprecation.md)
+- Telemetry: zero telemetry in the npm library
+
+The package metadata declares this React peer range. Validating Vite and Next.js
+client-only consumers remains a 1.0 release gate.
+
+## Dataset support
+
+| Dataset `codebase_version` | Open and inspect | Export | 1.0 status |
+| -------------------------- | ---------------------------------------------- | ----------------------------- | ---------- |
+| Exactly `v2.1` | Planned support | Planned only after validation | 1.0 gate |
+| Exactly `v3.0` | Planned support | Planned only after validation | 1.0 gate |
+| Missing or any other value | Warning-marked read-only when safely parseable | Prohibited | 1.0 gate |
+
+“Exact” applies to the declared dataset version, not a prefix family. In
+particular, `v2.0`, future `v2.x`, future `v3.x`, and malformed or missing
+versions are unknown. Unknown data must never silently select a compatible
+adapter. If safe parsing is impossible, loading must fail without modifying the
+source.
+
+Supported export means that the complete exported dataset can be consumed by
+the corresponding official LeRobot release for training without manual repair.
+The validation fixture set must cover metadata, tasks, episodes, Parquet data,
+timestamps, images/video, and cross-version export where offered. Until those
+checks pass, export is experimental and must not be advertised as supported.
+
+For v3 data, Studio rolls Parquet files by the configured data-file size and
+uses `chunks_size` as the maximum number of files per chunk. Browser export
+currently keeps each episode video in a separate MP4 and rolls video chunks by
+file count. Official LeRobot may losslessly concatenate several episode videos
+into one size-bounded MP4; Studio does not claim byte-for-byte sharding parity,
+but its per-episode layout and metadata references are validated by the official
+v0.6.1 reader.
+
+## Input and network support
+
+| Input | Contract |
+| --------------- | -------------------------------------------------------------------------------------------- |
+| Local archive | Browser-local read; archive types shown by the UI must be tested before 1.0 |
+| Local directory | Requires the File System Access API; fallback selection may not preserve a restorable handle |
+| Remote archive | Requires cross-origin `GET`; byte-range access is required for scalable large-archive use |
+| Sample URL | Same origin, CORS, and Range rules as any remote archive |
+
+For remote archives, the origin should:
+
+- answer the preflight or request with an appropriate
+ `Access-Control-Allow-Origin`;
+- allow `GET` and the `Range` request header when preflighted;
+- expose `Content-Range`, `Accept-Ranges`, and `Content-Length` when the client
+ needs to inspect them; and
+- respond to a valid byte request with `206 Partial Content` and a valid
+ `Content-Range`.
+
+A server that ignores Range may force a full download and is not considered a
+supported large-dataset configuration. Authentication, private object-store
+credentials, signed-URL generation, and proxying are host-application
+responsibilities.
+
+## Browser capability matrix
+
+The automated matrix uses Playwright Chromium, Firefox, and WebKit. “Smoke”
+means Viewer composition, localized error states, keyboard/accessibility
+primitives, unknown-version read-only behavior, and remote/custom `DataSource`
+contracts. It does not imply codec support for every dataset.
+
+| Capability | Chromium (Chrome/Edge) | Firefox | WebKit (Safari engine) |
+| --------------------------------------- | ---------------------------------------------- | ------------------------------------------ | ------------------------------------------ |
+| Viewer/error/accessibility/read-only | CI smoke | CI smoke | CI smoke |
+| Remote or custom `DataSource` | CI smoke | CI smoke | CI smoke |
+| Local archive viewing | Planned validation | Planned validation | Planned validation |
+| Directory picker and restorable handles | File System Access capability detected | Explicit ZIP-only fallback when absent | Explicit ZIP-only fallback when absent |
+| ZIP download | Capability detected; export suite exercised | Capability detected in smoke | Capability detected in smoke |
+| Directory export | Chromium-only; requires File System Access | Not run; directory option must stay absent | Not run; directory option must stay absent |
+| Video encoding/export | Full browser export suite, including WebCodecs | Not run; WebCodecs capability is detected | Not run; WebCodecs capability is detected |
+| Video decode/playback | Dataset/codec dependent | Dataset/codec dependent | Dataset/codec dependent |
+
+CI installs all three engines. Chromium retains the complete browser suite,
+including export and encoding scenarios. Firefox and WebKit run only the smoke
+scope above; a missing browser capability is tested as an explicit degradation
+contract rather than converted into a skipped test.
+
+The pinned official compatibility gate uses LeRobot `v0.6.1` commit
+`7e241bd630a3719a56157a497ce5d08f244784f1`. Nightly also checks the current
+upstream `main` as a non-blocking warning job. Exact browser versions must be
+recorded in release evidence. A browser being “modern” does not guarantee codec
+support; unsupported media must produce a clear error while non-media
+inspection remains available where safe.
+
+## 1.0 acceptance gates
+
+- Enforce exact `v2.1` and `v3.0` detection.
+- Provide a visible warning and immutable mode for unknown versions; disable
+ every export entry point and service call in that mode.
+- Validate supported exports with official LeRobot training workflows.
+- Keep React peer dependencies at `^19.0.0` and test Vite and Next.js
+ client-only consumers.
+- Run the browser matrix and retain versioned evidence.
+- Confirm the npm artifact has no telemetry or host-application side effects
+ beyond documented browser storage.
diff --git a/docs/cors.md b/docs/cors.md
new file mode 100644
index 0000000..1e84f95
--- /dev/null
+++ b/docs/cors.md
@@ -0,0 +1,50 @@
+# CORS and HTTP Range
+
+The browser fetches a remote archive from the URL supplied by the host or user.
+That archive server controls CORS, byte-range behavior, authentication, and
+request logging.
+
+## Required response behavior
+
+For a public, credential-free archive, a typical configuration includes:
+
+```http
+Access-Control-Allow-Origin: *
+Accept-Ranges: bytes
+Access-Control-Expose-Headers: Accept-Ranges, Content-Length, Content-Range
+```
+
+When the viewer requests `Range: bytes=0-65535`, the server should return:
+
+```http
+HTTP/1.1 206 Partial Content
+Content-Range: bytes 0-65535/123456789
+Content-Length: 65536
+```
+
+If a preflight occurs, allow:
+
+```http
+Access-Control-Allow-Methods: GET, OPTIONS
+Access-Control-Allow-Headers: Range
+```
+
+Use the viewer origin instead of `*` for credentialed requests. Never combine
+`Access-Control-Allow-Origin: *` with credentials.
+
+## Why Range matters
+
+A server that ignores `Range` may force the browser to download the complete
+archive before inspection. That behavior is not a supported large-dataset
+configuration. Redirects, CDNs, and signed URLs must preserve both the CORS
+headers and `206 Partial Content` behavior.
+
+## Host responsibilities
+
+The embedding application owns private credentials, signed-URL generation,
+proxies, and authorization. The stable viewer does not accept or manage server
+credentials. Prefer short-lived signed URLs over exposing object-store secrets
+to browser code.
+
+See [Troubleshooting](./troubleshooting.md) for checks to run when a remote
+archive does not open.
diff --git a/docs/data-formats.md b/docs/data-formats.md
new file mode 100644
index 0000000..af60a7f
--- /dev/null
+++ b/docs/data-formats.md
@@ -0,0 +1,48 @@
+# Data formats
+
+Format support is version-specific. A matching major prefix is not enough:
+`v2.0`, future `v2.x`, future `v3.x`, malformed values, and missing
+`codebase_version` are unknown formats.
+
+## Intended 1.0 matrix
+
+| Declared version | Open and inspect | Export | Status |
+| -------------------------- | --------------------------------------------------- | ------------------------------ | -------- |
+| Exactly `v2.1` | Planned support | Only after official validation | 1.0 gate |
+| Exactly `v3.0` | Planned support | Only after official validation | 1.0 gate |
+| Missing or any other value | Warning-marked read-only mode when safely parseable | Prohibited | 1.0 gate |
+
+These entries describe the release contract, not a claim that the current
+pre-release implementation has passed every gate. See
+[Compatibility and release gates](./compatibility.md) for the acceptance
+criteria.
+
+## Inputs
+
+- Local archives: ZIP, TAR, or TAR.GZ through the public archive factory.
+- Local directories: require File System Access API support; other browsers
+ may offer an archive-only fallback.
+- Remote archives: require cross-origin `GET`. Large archives also require
+ working byte ranges.
+- Custom sources: implement the stable [`DataSource`](./api.md) contract.
+
+Archive contents and paths are untrusted input. Loading must fail safely and
+must not modify the source dataset.
+
+## Parquet and video sharding
+
+For v3 export, Studio rolls Parquet files by the configured data-file size and
+uses `chunks_size` as the maximum file count in each chunk.
+
+Video layout differs from official LeRobot:
+
+- Studio currently writes one MP4 per episode and rolls video chunks by file
+ count.
+- Official LeRobot may losslessly concatenate multiple episode videos into one
+ size-bounded MP4.
+
+Studio therefore does **not** claim byte-for-byte video sharding parity.
+Per-episode layout and metadata references have been read successfully by the
+pinned official LeRobot `v0.6.1` reader, but supported export still requires
+complete official training-readiness validation. Until that gate passes,
+export remains experimental and outside the stable npm API.
diff --git a/docs/deployment.md b/docs/deployment.md
index dea89a1..91b8755 100644
--- a/docs/deployment.md
+++ b/docs/deployment.md
@@ -1,14 +1,25 @@
# Deployment
-## Production site (Cloudflare Workers)
+## Production target (Cloudflare Workers)
Production is served at **https://lerobot.studio**.
-The GitHub repository [`ioai-tech/lerobot-studio`](https://github.com/ioai-tech/lerobot-studio)
-is connected directly to a Cloudflare Worker. Merges to `main` trigger a Cloudflare
-build and deploy — no GitHub Actions secrets are required for this path.
+The planned post-migration setup connects `ioai-tech/lerobot-studio` directly to
+a Cloudflare Worker so merges to `main` trigger a Cloudflare build and deploy
+without GitHub Actions deployment secrets. The repository connection and first
+deployment must be verified during the
+[GitHub migration](./github-migration.md); this document does not assert that
+the public repository is already available.
-Worker configuration lives in [`wrangler.jsonc`](../wrangler.jsonc):
+The Cloudflare repository integration is a separate trust boundary from GitHub
+Actions. Grant it access only to this repository, restrict production deploys
+to the protected `main` branch, and review its build logs and dependency update
+behavior. Fork pull-request workflows must not receive Cloudflare credentials;
+the planned integration does not require storing a Cloudflare API token as a
+GitHub Actions secret.
+
+Worker configuration lives in
+[`wrangler.jsonc`](https://github.com/ioai-tech/lerobot-studio/blob/main/wrangler.jsonc):
- Worker name: `lerobot-studio`
- Assets directory: `dist`
@@ -44,7 +55,7 @@ Optional build args:
- `SITE_URL` — canonical site URL for SEO assets (production default: `https://lerobot.studio`)
- `VITE_SAMPLES_BASE_URL` — remote sample manifest base URL
-Published images (after open release):
+Planned published images (after a successful public release):
- `ghcr.io/ioai-tech/lerobot-studio:latest`
- `ghcr.io/ioai-tech/lerobot-studio:`
@@ -58,13 +69,59 @@ SITE_URL=https://lerobot.studio npm run build
Serve `dist` with any static file server. Configure SPA fallback to
`index.html`.
+## Documentation site (GitHub Pages)
+
+The documentation is a separate VitePress build:
+
+```bash
+npm run docs:build
+```
+
+`.github/workflows/docs-pages.yml` builds and deploys
+`docs/.vitepress/dist` after documentation changes reach `main`. Its default
+`DOCS_BASE` is `//`, so it works at the GitHub project Pages
+URL without assuming that a custom documentation domain exists.
+
+Repository administrators must complete these steps after the public
+repository exists:
+
+1. Open **Settings → Pages** and set **Source** to **GitHub Actions**.
+2. Run the **Documentation Pages** workflow once and verify the generated
+ `https://ioai-tech.github.io/lerobot-studio/` URL.
+3. Add the workflow’s `build` and `deploy` jobs to the protected-branch policy
+ if documentation deployment is required for merges.
+4. Only after DNS ownership is ready, configure a custom domain in GitHub
+ Pages, add the documented DNS records, enable HTTPS, and verify the domain.
+5. For a root custom domain such as `docs.lerobot.studio`, change the workflow
+ `DOCS_BASE` to `/`. Do not add a `CNAME` file or advertise that hostname
+ until GitHub Pages and DNS both confirm it.
+
+The workflow requires `pages: write` and `id-token: write` only in the deploy
+job. Pull requests build the same site through the read-only CI job but do not
+deploy it.
+
## Sample datasets and CORS
-Remote archives require:
+Remote archives must allow cross-origin `GET`. Scalable access to large
+archives also requires byte ranges. A typical object response includes:
+
+- `Access-Control-Allow-Origin: https://your-viewer.example` (or `*` for a
+ genuinely public, credential-free object);
+- `Accept-Ranges: bytes`;
+- `Content-Length`;
+- a `206 Partial Content` response with a valid `Content-Range` when the client
+ sends `Range: bytes=...`; and
+- `Access-Control-Expose-Headers: Accept-Ranges, Content-Length, Content-Range`
+ when those headers must be read by browser code.
-- CORS allowing `GET` from your site origin
-- HTTP `Range` support for large archives
+If a preflight occurs, allow `GET`, `OPTIONS`, and the `Range` request header.
+Do not use wildcard origins with credentialed requests. A server that ignores
+Range may trigger a full download and is not a supported large-dataset setup.
+See [Compatibility](./compatibility.md) for the complete network boundary.
## Privacy
-The open-source web shell does **not** include Google Analytics or Microsoft Clarity.
+The npm library has a zero-telemetry contract. The open-source web shell does
+not include Google Analytics or Microsoft Clarity. Deployers are responsible
+for disclosing logs, analytics, proxies, sample endpoints, authentication, and
+retention that they add. See [Privacy](./privacy.md).
diff --git a/docs/deprecation.md b/docs/deprecation.md
new file mode 100644
index 0000000..fd60f73
--- /dev/null
+++ b/docs/deprecation.md
@@ -0,0 +1,28 @@
+# Deprecation policy
+
+LeRobot Studio follows Semantic Versioning for the public
+`@ioai/lerobot-studio` API.
+
+## Major version 1
+
+- Minor and patch releases must remain backward compatible with documented
+ public APIs and behavior.
+- Deprecations must be documented in the changelog and migration guidance.
+- A deprecated public API remains available for at least one minor release and
+ at least 90 days, whichever is longer, before removal in the next major
+ release.
+- Security, privacy, legal, or data-integrity issues may require faster removal.
+ The release notes must explain the exception and provide mitigation or
+ migration guidance where practical.
+- Undocumented internals, `src/**` paths, generated files, and standalone web
+ application UI details are not public API.
+
+## Dataset and browser support
+
+Removing a documented dataset version, browser class, input method, or export
+target is a breaking change. Adding support for a new exact LeRobot version is
+not automatic: it requires explicit validation and documentation.
+
+Warnings must identify the deprecated capability, the replacement, and the
+earliest release in which removal may occur. Silent behavior changes are not an
+acceptable deprecation mechanism.
diff --git a/docs/development.md b/docs/development.md
index 7c34908..3261029 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -17,11 +17,47 @@ Node 24 is required (`.nvmrc`). This repository is a single npm package with two
| `npm run dev` | Start the SPA |
| `npm run build` | Build the SPA to `dist/` |
| `npm run build:lib` | Build the published library to `dist-lib/` |
+| `npm run docs:dev` | Start the VitePress documentation site |
+| `npm run docs:build` | Build documentation and check links |
+| `npm run check:bundle-size` | Enforce npm and Web bundle size budgets |
| `npm run typecheck` | Type-check application and library sources |
| `npm run test:unit` | Run Node-based Vitest tests |
| `npm run test:browser` | Run Playwright browser tests |
| `npm run fixtures:generate` | Recreate synthetic LeRobot fixtures |
+## Bundle size gate
+
+Build both targets before running the size gate:
+
+```bash
+npm run build:lib
+npm run build
+npm run check:bundle-size
+```
+
+The gate measures raw and gzip sizes for the stable library entry, library and
+initial Web CSS, Web entry/modulepreload chunks, lazy DataLoader and Dockview
+chunks, Worker/WASM artifacts, and the packed npm tarball. It also fails when
+required artifacts are missing, an unexpected JavaScript chunk exceeds the
+per-chunk ceiling, or the complete npm tarball exceeds its packed or unpacked
+budget. Hashed filenames are discovered from build output and `dist/index.html`
+rather than being fixed in the script.
+
+The hard limits are approximately 5% above the measured baseline. The roughly
+26 MB library Worker chunk is a known baseline that still needs optimization,
+not an ideal or optimized target. Passing this gate only means that bundle size
+has not materially regressed.
+
+For a local negative test, lower every budget without changing the checked-in
+limits:
+
+```bash
+BUNDLE_SIZE_BUDGET_SCALE=0.01 npm run check:bundle-size
+```
+
+The scale override can only tighten budgets (`0 < scale <= 1`); it cannot relax
+the CI gate.
+
## Package validation
```bash
@@ -29,6 +65,27 @@ npm run build:lib
npm run verify:npm-consumer
```
+The 1.0 release requires consumer fixtures for Vite and Next.js client-only
+usage, React/React DOM `^19.0.0`, ESM import, CSS loading, workers, and WASM.
+Server rendering, React Server Components, CommonJS, and Node.js execution are
+outside the package contract.
+
+## Compatibility work
+
+Use [Compatibility and release gates](./compatibility.md) as the acceptance
+source for version and browser work. In particular:
+
+- match dataset versions exactly (`v2.1` and `v3.0`), never by major prefix;
+- keep unknown versions warning-marked, read-only, and unable to reach any
+ export UI or service;
+- treat official LeRobot training-readiness checks as required export tests;
+ and
+- record actual browser versions and results rather than inferring support from
+ API detection.
+
+Changes to public behavior must follow the
+[deprecation policy](./deprecation.md).
+
## UI components
UI primitives live in `src/ui` and are managed from the repository root with the shadcn CLI. Keep generated components in `src/ui/components` and use local `@/ui` or relative imports. Do not reintroduce `@radix-ui/*`; prefer Base UI composition via `render`.
diff --git a/docs/github-migration.md b/docs/github-migration.md
index 225a39a..ed1075b 100644
--- a/docs/github-migration.md
+++ b/docs/github-migration.md
@@ -10,7 +10,7 @@ This branch is prepared to be copied into a new public GitHub repository
```bash
rsync -a --exclude '.git' --exclude 'node_modules' --exclude 'dist' \
- --exclude 'dist' --exclude 'dist-lib' \
+ --exclude 'dist-lib' \
./ /path/to/lerobot-studio-public/
```
@@ -25,13 +25,61 @@ git remote add origin git@github.com:ioai-tech/lerobot-studio.git
git push -u origin main
```
-4. Configure GitHub:
- - Protect `main`
- - Add `NPM_TOKEN` repository secret for releases
+4. Configure GitHub (these are manual administrator actions; the files in this
+ repository do not enable repository or organization settings):
+ - In **Settings → Actions → General**, set the default workflow token to
+ read-only and leave “Allow GitHub Actions to create and approve pull
+ requests” disabled.
+ - In the fork pull-request settings, do not send write tokens or Actions
+ secrets to workflows from forks. Require approval for first-time or
+ outside contributors. The checked-in PR workflows use `pull_request`
+ rather than `pull_request_target`, request read-only contents by default,
+ and do not consume repository secrets.
+ - Create a branch ruleset for `main`: require a pull request, at least one
+ approval, CODEOWNERS review, conversation resolution, and successful
+ required checks; block force pushes and deletion. Select the CI jobs
+ (`quality`, `browser-tests`, and `official-compat`), Dependency Review, and
+ CodeQL checks after they have run once so GitHub exposes their exact check
+ names.
+ - Create the `@ioai-tech/maintainers` team referenced by `CODEOWNERS`, or
+ replace that placeholder with an existing team that has write access
+ - In **Settings → Code security**, enable the dependency graph, Dependabot
+ alerts and security updates, secret scanning and push protection, and
+ private vulnerability reporting. Use the checked-in CodeQL advanced-setup
+ workflow; do not also enable CodeQL default setup.
+ - Verify the Dependency Review, CodeQL, and OpenSSF Scorecard workflows
+ succeed. Scorecard publication sends public repository assessment data to
+ `api.scorecard.dev`; disable `publish_results` in
+ `.github/workflows/scorecard.yml` if that publication is not desired.
+ - Keep GitHub Actions restricted to GitHub-authored and explicitly approved
+ third-party actions where organization policy supports it. All non-release
+ workflows are pinned to full commit SHAs and Dependabot is configured to
+ propose GitHub Actions updates.
+ - Add a one-time `NPM_BOOTSTRAP_TOKEN` repository secret for the initial
+ `v1.0.0` publication. npm cannot configure a trusted publisher before the
+ scoped package exists.
+ - Immediately after `v1.0.0` exists, configure npm Trusted Publishing for
+ `ioai-tech/lerobot-studio` and `.github/workflows/release.yml`, then delete
+ the bootstrap secret. Later releases use GitHub OIDC and no npm token.
- Enable GitHub Packages / GHCR permissions for Actions
+ - Add a tag ruleset for `v*` so only release maintainers can create or update
+ release tags.
- Verify Actions workflows run on the first PR
+ - In **Settings → Pages**, choose **GitHub Actions** as the source, run the
+ Documentation Pages workflow, and verify the project Pages URL. A custom
+ `docs.lerobot.studio` domain and its DNS records are optional later
+ administrator work; they are not preconfigured by this repository.
- Connect the repo to Cloudflare Workers Builds for `main` → https://lerobot.studio
(no Cloudflare API tokens needed in GitHub Secrets; use Cloudflare’s Git integration)
- Confirm Worker `lerobot-studio` and custom domain `lerobot.studio` remain bound
-5. Cut the first release tag (`v1.0.0` or `v0.1.0`) to exercise the release workflow.
+5. Complete every gate in [Compatibility](./compatibility.md), including exact
+ dataset-version handling and official training-readiness validation.
+6. Run the `Release Dry Run` workflow. It executes the reusable CI,
+ `npm publish --dry-run`, CycloneDX SBOM generation, and a no-push container
+ build without requiring release credentials.
+7. Follow
+ [Governance](https://github.com/ioai-tech/lerobot-studio/blob/main/GOVERNANCE.md)
+ to approve and cut the stable `v1.0.0` release. Published npm versions,
+ container tags, and GitHub release artifacts are immutable; the release
+ attaches the SBOM and provenance.
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..259a5a7
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,36 @@
+---
+layout: home
+
+hero:
+ name: LeRobot Studio
+ text: Inspect LeRobot datasets in the browser
+ tagline: A client-only React viewer for synchronized video, charts, and raw features.
+ actions:
+ - theme: brand
+ text: Quick Start
+ link: /quick-start
+ - theme: alt
+ text: Stable API
+ link: /api
+ - theme: alt
+ text: Live demo
+ link: https://lerobot.studio
+
+features:
+ - title: Viewer-only contract
+ details: Embed the stable client-side viewer without exposing dataset mutation or editor APIs.
+ - title: Browser-local processing
+ details: Local dataset content stays on the device. The npm library has a zero-telemetry contract.
+ - title: Explicit compatibility
+ details: Exact dataset versions, browser capabilities, and release gates are documented separately.
+---
+
+## Current release status
+
+LeRobot Studio is preparing the stable `1.0.0` contract. The package is not yet
+published. Viewing is the only stable public library workflow; source mutation,
+editing, and export services are not part of the stable API.
+
+Start with the [Quick Start](./quick-start.md), then review the
+[compatibility and release gates](./compatibility.md) before treating a dataset
+format or browser capability as supported.
diff --git a/docs/migration.md b/docs/migration.md
new file mode 100644
index 0000000..d3ff62d
--- /dev/null
+++ b/docs/migration.md
@@ -0,0 +1,47 @@
+# Migration
+
+## Before 1.0
+
+The package has not been published, so there is no supported npm upgrade path
+yet. Do not depend on `src/**`, generated declarations, standalone application
+components, export services, or other implementation details.
+
+Prepare an embedding application by depending only on the
+[viewer-only API report](./api.md):
+
+- `LeRobotViewer`
+- `createArchiveDataSourceFromFile`
+- `createArchiveDataSourceFromUrl`
+- the public viewer and `DataSource` types
+- `@ioai/lerobot-studio/style.css`
+
+An `onExport` handler is a host-owned button callback, not an exported dataset
+service.
+
+## Moving from application internals
+
+1. Replace deep imports with the package root.
+2. Move export, authentication, signed URL, and proxy behavior into the host
+ application.
+3. Supply a remote URL or implement the stable `DataSource` interface.
+4. Render only on the client and give the viewer container an explicit height.
+5. Treat all non-exact dataset versions as unknown instead of choosing an
+ adapter by major prefix.
+
+## After 1.0
+
+Major version 1 follows Semantic Versioning. Minor and patch releases retain
+backward compatibility for documented public APIs. A deprecated API remains
+available for at least one minor release and 90 days, except where security,
+privacy, legal, or data-integrity issues require faster action.
+
+Before upgrading:
+
+1. read the project changelog and release notes;
+2. review documented deprecations and exact dataset-version support;
+3. rebuild a real Vite or client-only Next.js consumer; and
+4. test target browsers and representative dataset codecs.
+
+See the [deprecation policy](./deprecation.md) for the complete contract. The
+repository publication procedure is documented separately in
+[GitHub migration](./github-migration.md).
diff --git a/docs/privacy.md b/docs/privacy.md
new file mode 100644
index 0000000..9421c97
--- /dev/null
+++ b/docs/privacy.md
@@ -0,0 +1,55 @@
+# Privacy
+
+## Data processing
+
+LeRobot Studio is designed to process dataset content in the browser. Opening a
+local file or directory does not intentionally upload its contents. Opening a
+remote archive necessarily sends requests to the user-provided remote host, and
+that host may log normal request data such as IP address, user agent, referrer,
+and requested URL.
+
+The `@ioai/lerobot-studio` npm library has a zero-telemetry contract. It must not
+send analytics, diagnostics, dataset metadata, filenames, usage events, or
+identifiers to IO-AI.TECH or third parties. Host applications remain
+responsible for disclosing any telemetry or network behavior they add around
+the library.
+
+## Browser storage
+
+The current application may store:
+
+- UI preferences such as theme and language in `localStorage`;
+- recent-source metadata in `localStorage`, including labels, source kinds,
+ remote URLs, and local path-like display labels; and
+- user-granted `FileSystemHandle` objects in the `lerobot-studio` IndexedDB
+ database when the browser supports handle persistence.
+
+Dataset payload bytes are not intentionally persisted in these stores by the
+history feature. A stored handle does not bypass browser permission checks; the
+browser may require the user to grant access again. Private browsing,
+permissions, quota, or browser policy may disable persistence without disabling
+all viewing.
+
+Users can remove recent items in the application. Clearing site data in browser
+settings removes the application’s `localStorage` and IndexedDB data. Removing
+browser storage does not delete source files or data held by remote hosts.
+
+## Network boundaries
+
+The standalone application may contact:
+
+- the URL explicitly opened by the user;
+- configured sample-dataset endpoints; and
+- same-origin application assets.
+
+The npm library must not introduce undisclosed network destinations. Embedding
+applications should apply an appropriate Content Security Policy and document
+their own sample endpoints, proxies, authentication, logging, and retention.
+
+## Sensitive datasets
+
+Do not assume that browser-local processing makes a dataset non-sensitive.
+Filenames, paths, video frames, images, task descriptions, and sensor data may
+contain personal or confidential information. Use a trusted device and origin,
+review remote URLs before opening them, and follow the dataset owner’s access
+and retention requirements.
diff --git a/docs/quick-start.md b/docs/quick-start.md
new file mode 100644
index 0000000..a4f73bb
--- /dev/null
+++ b/docs/quick-start.md
@@ -0,0 +1,76 @@
+# Quick Start
+
+LeRobot Studio has two entry points:
+
+- the hosted application at [lerobot.studio](https://lerobot.studio); and
+- the browser-only React package, after `@ioai/lerobot-studio` is published.
+
+## Use the hosted viewer
+
+Open the live application and choose a local folder, local archive, or remote
+archive. Local content is processed in the browser. Remote archives must meet
+the documented [CORS and HTTP Range requirements](./cors.md).
+
+## Embed the React viewer
+
+::: warning Publication status
+`@ioai/lerobot-studio@1.0.0` is not published yet. Installation and the stable
+contract below become available only after the [1.0 release gates](./compatibility.md#_1-0-acceptance-gates)
+pass.
+:::
+
+```bash
+npm install @ioai/lerobot-studio
+```
+
+```tsx
+import { LeRobotViewer } from '@ioai/lerobot-studio';
+import '@ioai/lerobot-studio/style.css';
+
+export function DatasetViewer() {
+ return (
+
+
+
+ );
+}
+```
+
+The host must give the viewer an explicit height. The component fills its
+container and does not choose a page height.
+
+## Runtime contract
+
+- React and React DOM `^19.0.0`
+- ESM only
+- browser and client-side rendering only
+- no Node.js, CommonJS, React Server Components, SSR, or hydration support
+
+In Next.js, load the viewer from a Client Component with SSR disabled:
+
+```tsx
+'use client';
+
+import dynamic from 'next/dynamic';
+
+const Viewer = dynamic(
+ () => import('@ioai/lerobot-studio').then((module) => module.LeRobotViewer),
+ { ssr: false },
+);
+```
+
+See the [stable API](./api.md) for custom data sources, callbacks, and errors.
+
+## Develop this repository
+
+```bash
+npm ci
+npm run fixtures:generate
+npm run dev
+```
+
+To work on this documentation site:
+
+```bash
+npm run docs:dev
+```
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
new file mode 100644
index 0000000..6cddc23
--- /dev/null
+++ b/docs/troubleshooting.md
@@ -0,0 +1,58 @@
+# Troubleshooting
+
+## The viewer has zero height
+
+`LeRobotViewer` fills its container. Give the host element an explicit height
+or a layout constraint that resolves to a non-zero height.
+
+```tsx
+
+
+
+```
+
+## A remote archive does not open
+
+1. Confirm the final URL is reachable with `GET` from the viewer origin.
+2. Inspect redirects; every final response must preserve the required CORS
+ headers.
+3. Send a small byte request and verify a `206 Partial Content` response with a
+ valid `Content-Range`.
+4. Expose `Accept-Ranges`, `Content-Length`, and `Content-Range` to browser
+ code.
+5. Check whether a signed URL expired or a CDN removed the `Range` header.
+
+See [CORS and HTTP Range](./cors.md) for example headers.
+
+## An archive type is rejected
+
+The public archive factory accepts ZIP, TAR, and TAR.GZ files. For remote
+sources, use a URL and response that allow the archive kind to be identified.
+Use `onFatalError` to distinguish `UNSUPPORTED_ARCHIVE` from network and
+dataset failures.
+
+## A dataset opens with a warning
+
+Only exact declared versions `v2.1` and `v3.0` are intended for 1.0 support.
+Any other or missing `codebase_version` is unknown. Safe inspection may remain
+available in warning-marked read-only mode, but export must stay disabled.
+
+## Video is unavailable
+
+Playback depends on the browser and codec used by the dataset. Test the same
+asset in the target browser and inspect its media errors. A viewer smoke test
+does not establish support for every codec. Non-media data should remain
+inspectable where safe.
+
+## Next.js fails during server rendering
+
+Render the viewer from a Client Component and load it dynamically with
+`ssr: false`. The package is browser-only and does not support React Server
+Components or server rendering. See [Quick Start](./quick-start.md).
+
+## A custom data source leaks memory
+
+Revoke generated object URLs in `invalidateObjectUrl()` or `clear()`, release
+archive handles, and ensure repeated reads do not retain full buffers without a
+bounded cache. The host owns the lifecycle of a custom
+[`DataSource`](./api.md).
diff --git a/eslint.config.js b/eslint.config.js
index b7d2d7f..9669df6 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -13,8 +13,6 @@ export default defineConfig([
'node_modules/**',
'tests/fixtures/datasets/**',
'**/*.d.ts',
- // Pre-monorepo leftover tree; packages/* + apps/* are authoritative.
- 'src/**',
]),
{
files: ['**/*.{ts,tsx}'],
@@ -44,8 +42,25 @@ export default defineConfig([
'@typescript-eslint/no-explicit-any': 'off',
// ESLint 10 新增:既有 Error 包装模式未统一 attach cause
'preserve-caught-error': 'off',
- // shadcn / Context 模式会同时导出组件与 hook/variants
- 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
+ // Context hooks and shadcn variants intentionally share their component module.
+ 'react-refresh/only-export-components': [
+ 'warn',
+ {
+ allowConstantExport: true,
+ allowExportNames: [
+ 'useDockviewApi',
+ 'useLoading',
+ 'useToast',
+ 'useI18nController',
+ 'useTranslationBridge',
+ 'reportIntlError',
+ 'badgeVariants',
+ 'buttonVariants',
+ 'tabsListVariants',
+ 'usePortalContainer',
+ ],
+ },
+ ],
},
},
]);
diff --git a/etc/lerobot-studio.api.md b/etc/lerobot-studio.api.md
new file mode 100644
index 0000000..c3927e9
--- /dev/null
+++ b/etc/lerobot-studio.api.md
@@ -0,0 +1,70 @@
+## API Report File for "@ioai/lerobot-studio"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+import { default as default_2 } from 'react';
+
+// @public
+export function createArchiveDataSourceFromFile(file: File): DataSource;
+
+// @public
+export function createArchiveDataSourceFromUrl(url: string): DataSource;
+
+// @public
+export interface DataSource {
+ clear(): void | Promise;
+ exists(path: string): Promise;
+ getObjectUrl(path: string, mimeType?: string, onProgress?: ProgressHandler): Promise;
+ invalidateObjectUrl?(path: string): void | Promise;
+ listPaths?(): Promise;
+ readBytes(path: string, onProgress?: ProgressHandler): Promise;
+ readText(path: string, onProgress?: ProgressHandler): Promise;
+}
+
+// @public (undocumented)
+export const LeRobotViewer: default_2.FC;
+
+// @public
+export interface LeRobotViewerError {
+ cause?: unknown;
+ code: LeRobotViewerErrorCode;
+ message: string;
+ recoverable: boolean;
+}
+
+// @public
+export type LeRobotViewerErrorCode = 'INVALID_DATA_SOURCE' | 'REMOTE_SOURCE_UNAVAILABLE' | 'UNSUPPORTED_ARCHIVE' | 'DATASET_LOAD_FAILED';
+
+// @public
+export interface LeRobotViewerProps {
+ className?: string;
+ dataSource: string | DataSource;
+ enableKeyboardShortcuts?: boolean;
+ language?: string;
+ onBack?: () => void;
+ onExport?: () => void;
+ onFatalError?: (error: LeRobotViewerError) => void;
+ showPlaybackBar?: boolean;
+ showSidebar?: boolean;
+ theme?: 'light' | 'dark' | 'system';
+}
+
+// @public
+export type LoadingPhase = 'download' | 'index' | 'gunzip' | 'read';
+
+// @public
+export type ProgressHandler = (info: ProgressInfo) => void;
+
+// @public
+export interface ProgressInfo {
+ loaded?: number;
+ message?: string;
+ phase: LoadingPhase;
+ total?: number;
+}
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/examples/next-app-router/app/layout.tsx b/examples/next-app-router/app/layout.tsx
new file mode 100644
index 0000000..ea19dcf
--- /dev/null
+++ b/examples/next-app-router/app/layout.tsx
@@ -0,0 +1,18 @@
+import type { Metadata } from 'next';
+import type { ReactNode } from 'react';
+import '@ioai/lerobot-studio/style.css';
+import './styles.css';
+
+// Next.js requires route metadata to be exported from the layout module.
+// eslint-disable-next-line react-refresh/only-export-components
+export const metadata: Metadata = {
+ title: 'LeRobot Studio Next.js consumer',
+};
+
+export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/examples/next-app-router/app/page.tsx b/examples/next-app-router/app/page.tsx
new file mode 100644
index 0000000..a8f34bd
--- /dev/null
+++ b/examples/next-app-router/app/page.tsx
@@ -0,0 +1,5 @@
+import { ViewerClient } from '../components/ViewerClient';
+
+export default function Home() {
+ return ;
+}
diff --git a/examples/next-app-router/app/styles.css b/examples/next-app-router/app/styles.css
new file mode 100644
index 0000000..11e5d2d
--- /dev/null
+++ b/examples/next-app-router/app/styles.css
@@ -0,0 +1,7 @@
+html,
+body,
+main {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+}
diff --git a/examples/next-app-router/components/ViewerCanvas.tsx b/examples/next-app-router/components/ViewerCanvas.tsx
new file mode 100644
index 0000000..d3d6217
--- /dev/null
+++ b/examples/next-app-router/components/ViewerCanvas.tsx
@@ -0,0 +1,55 @@
+'use client';
+
+import { LeRobotViewer, type DataSource } from '@ioai/lerobot-studio';
+
+const files: Record = {
+ 'meta/info.json': JSON.stringify({
+ codebase_version: 'v2.1',
+ robot_type: 'next-consumer-fixture',
+ total_episodes: 1,
+ total_frames: 1,
+ total_tasks: 1,
+ total_videos: 0,
+ chunks_size: 1000,
+ fps: 30,
+ features: {
+ timestamp: { dtype: 'float32', shape: [1], names: null },
+ },
+ }),
+ 'meta/episodes.jsonl': '{"episode_index":0,"length":1,"tasks":["smoke test"]}\n',
+ 'meta/tasks.jsonl': '{"task_index":0,"task":"smoke test"}\n',
+};
+
+const dataSource: DataSource = {
+ async exists(filePath) {
+ return filePath in files;
+ },
+ async readText(filePath) {
+ const value = files[filePath];
+ if (value === undefined) throw new Error(`Fixture path not found: ${filePath}`);
+ return value;
+ },
+ async readBytes(filePath) {
+ return new TextEncoder().encode(await this.readText(filePath));
+ },
+ async getObjectUrl(filePath, mimeType = 'application/octet-stream') {
+ return URL.createObjectURL(new Blob([await this.readText(filePath)], { type: mimeType }));
+ },
+ clear() {},
+ async listPaths() {
+ return Object.keys(files);
+ },
+};
+
+export default function ViewerCanvas() {
+ return (
+
+
+
+ );
+}
diff --git a/examples/next-app-router/components/ViewerClient.tsx b/examples/next-app-router/components/ViewerClient.tsx
new file mode 100644
index 0000000..2f017ba
--- /dev/null
+++ b/examples/next-app-router/components/ViewerClient.tsx
@@ -0,0 +1,12 @@
+'use client';
+
+import dynamic from 'next/dynamic';
+
+const ViewerCanvas = dynamic(() => import('./ViewerCanvas'), {
+ ssr: false,
+ loading: () => Loading LeRobot Studio…
,
+});
+
+export function ViewerClient() {
+ return ;
+}
diff --git a/examples/next-app-router/next-env.d.ts b/examples/next-app-router/next-env.d.ts
new file mode 100644
index 0000000..b45390a
--- /dev/null
+++ b/examples/next-app-router/next-env.d.ts
@@ -0,0 +1,4 @@
+///
+///
+
+// This file is generated by Next.js and is checked in so the example typechecks after install.
diff --git a/examples/next-app-router/package.json b/examples/next-app-router/package.json
new file mode 100644
index 0000000..43ba27b
--- /dev/null
+++ b/examples/next-app-router/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "lerobot-studio-next-app-router-example",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@ioai/lerobot-studio": "file:../..",
+ "next": "latest",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "latest",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "typescript": "latest"
+ }
+}
diff --git a/examples/next-app-router/tsconfig.json b/examples/next-app-router/tsconfig.json
new file mode 100644
index 0000000..f9d454b
--- /dev/null
+++ b/examples/next-app-router/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": false,
+ "skipLibCheck": false,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [{ "name": "next" }]
+ },
+ "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/examples/vite-react/index.html b/examples/vite-react/index.html
new file mode 100644
index 0000000..010197a
--- /dev/null
+++ b/examples/vite-react/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ LeRobot Studio Vite consumer
+
+
+
+
+
+
diff --git a/examples/vite-react/package.json b/examples/vite-react/package.json
new file mode 100644
index 0000000..2863c7d
--- /dev/null
+++ b/examples/vite-react/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "lerobot-studio-vite-react-example",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "typecheck": "tsc --noEmit",
+ "build": "npm run typecheck && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@ioai/lerobot-studio": "file:../..",
+ "@vitejs/plugin-react": "latest",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "vite": "latest"
+ },
+ "devDependencies": {
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "typescript": "latest"
+ }
+}
diff --git a/examples/vite-react/src/App.tsx b/examples/vite-react/src/App.tsx
new file mode 100644
index 0000000..8f34269
--- /dev/null
+++ b/examples/vite-react/src/App.tsx
@@ -0,0 +1,57 @@
+import { LeRobotViewer, type DataSource } from '@ioai/lerobot-studio';
+
+const files = new Map([
+ [
+ 'meta/info.json',
+ JSON.stringify({
+ codebase_version: 'v2.1',
+ robot_type: 'npm-consumer-fixture',
+ total_episodes: 1,
+ total_frames: 1,
+ total_tasks: 1,
+ total_videos: 0,
+ chunks_size: 1000,
+ fps: 30,
+ features: {
+ timestamp: { dtype: 'float32', shape: [1], names: null },
+ },
+ }),
+ ],
+ ['meta/episodes.jsonl', '{"episode_index":0,"length":1,"tasks":["smoke test"]}\n'],
+ ['meta/tasks.jsonl', '{"task_index":0,"task":"smoke test"}\n'],
+]);
+
+const dataSource: DataSource = {
+ async exists(filePath) {
+ return files.has(filePath);
+ },
+ async readText(filePath) {
+ if (filePath === 'meta/info.json') window.__LEROBOT_CONSUMER__.infoRead = true;
+ const value = files.get(filePath);
+ if (value === undefined) throw new Error(`Fixture path not found: ${filePath}`);
+ return value;
+ },
+ async readBytes(filePath) {
+ return new TextEncoder().encode(await this.readText(filePath));
+ },
+ async getObjectUrl(filePath, mimeType = 'application/octet-stream') {
+ return URL.createObjectURL(new Blob([await this.readText(filePath)], { type: mimeType }));
+ },
+ clear() {},
+ async listPaths() {
+ return [...files.keys()];
+ },
+};
+
+export function App() {
+ return (
+
+
+
+ );
+}
diff --git a/examples/vite-react/src/main.tsx b/examples/vite-react/src/main.tsx
new file mode 100644
index 0000000..d38cbd8
--- /dev/null
+++ b/examples/vite-react/src/main.tsx
@@ -0,0 +1,44 @@
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+import '@ioai/lerobot-studio/style.css';
+import { App } from './App';
+import './styles.css';
+
+declare global {
+ interface Window {
+ __LEROBOT_CONSUMER__: {
+ infoRead: boolean;
+ wasmFetched: boolean;
+ workerConstructed: boolean;
+ };
+ }
+}
+
+window.__LEROBOT_CONSUMER__ = {
+ infoRead: false,
+ wasmFetched: false,
+ workerConstructed: false,
+};
+const nativeFetch = window.fetch.bind(window);
+window.fetch = async (...args) => {
+ const input = args[0];
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
+ const isWasm = url.startsWith('data:')
+ ? url.includes('wasm')
+ : new URL(url).pathname.endsWith('.wasm');
+ const response = await nativeFetch(...args);
+ if (isWasm && response.ok) window.__LEROBOT_CONSUMER__.wasmFetched = true;
+ return response;
+};
+window.Worker = new Proxy(window.Worker, {
+ construct(Target, args) {
+ window.__LEROBOT_CONSUMER__.workerConstructed = true;
+ return Reflect.construct(Target, args);
+ },
+});
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+);
diff --git a/examples/vite-react/src/styles.css b/examples/vite-react/src/styles.css
new file mode 100644
index 0000000..6410ea7
--- /dev/null
+++ b/examples/vite-react/src/styles.css
@@ -0,0 +1,8 @@
+html,
+body,
+#root,
+main {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+}
diff --git a/examples/vite-react/tsconfig.json b/examples/vite-react/tsconfig.json
new file mode 100644
index 0000000..07a1611
--- /dev/null
+++ b/examples/vite-react/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "skipLibCheck": false,
+ "types": ["vite/client"]
+ },
+ "include": ["src", "vite.config.ts"]
+}
diff --git a/examples/vite-react/vite.config.ts b/examples/vite-react/vite.config.ts
new file mode 100644
index 0000000..ea3bc2e
--- /dev/null
+++ b/examples/vite-react/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+
+export default defineConfig({
+ base: './',
+ plugins: [react()],
+});
diff --git a/package-lock.json b/package-lock.json
index 6eccd2e..7f1b785 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33,7 +33,10 @@
"use-sync-external-store": "^1.6.0"
},
"devDependencies": {
+ "@arethetypeswrong/cli": "^0.18.5",
+ "@changesets/cli": "^2.31.1",
"@eslint/js": "^10.0.1",
+ "@microsoft/api-extractor": "^7.58.12",
"@playwright/test": "^1.62.0",
"@tailwindcss/vite": "^4.3.3",
"@types/node": "^26.1.2",
@@ -43,6 +46,7 @@
"@vitest/browser": "^4.1.10",
"@vitest/browser-playwright": "^4.1.10",
"@vitest/coverage-v8": "^4.1.10",
+ "axe-core": "^4.12.1",
"eslint": "^10.8.0",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.3",
@@ -50,6 +54,7 @@
"lightningcss": "^1.33.0",
"playwright": "^1.62.0",
"prettier": "^3.6.2",
+ "publint": "^0.3.23",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"shadcn": "^4.16.0",
@@ -58,14 +63,12 @@
"typescript-eslint": "^8.65.0",
"vite": "^8.1.5",
"vite-plugin-dts": "^5.0.3",
+ "vitepress": "2.0.0-alpha.19",
"vitest": "^4.1.10"
},
- "engines": {
- "node": ">=24.0.0 <25"
- },
"peerDependencies": {
- "react": "^19.2.8",
- "react-dom": "^19.2.8"
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
}
},
"apps/web": {
@@ -92,6 +95,141 @@
"vite": "^8.1.5"
}
},
+ "node_modules/@andrewbranch/untar.js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz",
+ "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==",
+ "dev": true
+ },
+ "node_modules/@arethetypeswrong/cli": {
+ "version": "0.18.5",
+ "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.18.5.tgz",
+ "integrity": "sha512-gM+8vRsQOD/Uc7EnBedUhkG5OCsDWE4uoak5QvomGpMpaky0Eh41p04nIMgrWb8EOmqZUJGc6zz9hsP6E56R7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@arethetypeswrong/core": "0.18.5",
+ "chalk": "^4.1.2",
+ "cli-table3": "^0.6.3",
+ "commander": "^10.0.1",
+ "marked": "^9.1.2",
+ "marked-terminal": "^7.1.0",
+ "semver": "^7.5.4"
+ },
+ "bin": {
+ "attw": "dist/index.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@arethetypeswrong/cli/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@arethetypeswrong/cli/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@arethetypeswrong/cli/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@arethetypeswrong/core": {
+ "version": "0.18.5",
+ "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.18.5.tgz",
+ "integrity": "sha512-9ytjzGwxjm9Uz7I9avfbt5vlQt6uk9uRRESzJjqrznl6WKvI6dwYTo+vJ3U02Wrq/mR3iql/PzhvHhKdJIAjDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@andrewbranch/untar.js": "^1.0.3",
+ "@loaderkit/resolve": "^1.0.2",
+ "cjs-module-lexer": "^1.2.3",
+ "fflate": "^0.8.3",
+ "lru-cache": "^11.0.1",
+ "semver": "^7.5.4",
+ "typescript": "5.6.1-rc",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@arethetypeswrong/core/node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@arethetypeswrong/core/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@arethetypeswrong/core/node_modules/typescript": {
+ "version": "5.6.1-rc",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz",
+ "integrity": "sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/@arethetypeswrong/core/node_modules/validate-npm-package-name": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
@@ -611,182 +749,547 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@dotenvx/dotenvx": {
- "version": "1.75.1",
- "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.75.1.tgz",
- "integrity": "sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@dotenvx/primitives": "^0.8.0",
- "commander": "^11.1.0",
- "conf": "^10.2.0",
- "dotenv": "^17.2.1",
- "enquirer": "^2.4.1",
- "env-paths": "^2.2.1",
- "execa": "^5.1.1",
- "fdir": "^6.2.0",
- "ignore": "^5.3.0",
- "object-treeify": "1.1.33",
- "open": "^8.4.2",
- "picomatch": "^4.0.4",
- "systeminformation": "^5.22.11",
- "undici": "^7.11.0",
- "which": "^4.0.0",
- "yocto-spinner": "^1.1.0"
- },
- "bin": {
- "dotenvx": "src/cli/dotenvx.js"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/@dotenvx/dotenvx/node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "node_modules/@braidai/lang": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@braidai/lang/-/lang-1.1.2.tgz",
+ "integrity": "sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- }
+ "license": "ISC"
},
- "node_modules/@dotenvx/dotenvx/node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node_modules/@changesets/apply-release-plan": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz",
+ "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/config": "^3.1.4",
+ "@changesets/get-version-range-type": "^0.4.0",
+ "@changesets/git": "^3.0.4",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "detect-indent": "^6.0.0",
+ "fs-extra": "^7.0.1",
+ "lodash.startcase": "^4.4.0",
+ "outdent": "^0.5.0",
+ "prettier": "^2.7.1",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/@changesets/apply-release-plan/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
+ "bin": {
+ "prettier": "bin-prettier.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=10.13.0"
},
"funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/@changesets/apply-release-plan/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "node_modules/@changesets/assemble-release-plan": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz",
+ "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==",
"dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.17.0"
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.4",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "semver": "^7.5.3"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "node_modules/@changesets/assemble-release-plan/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"bin": {
- "is-docker": "cli.js"
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=10"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/@changesets/changelog-git": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz",
+ "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "dependencies": {
+ "@changesets/types": "^6.1.0"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "node_modules/@changesets/cli": {
+ "version": "2.31.1",
+ "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.1.tgz",
+ "integrity": "sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-docker": "^2.0.0"
+ "@changesets/apply-release-plan": "^7.1.1",
+ "@changesets/assemble-release-plan": "^6.0.10",
+ "@changesets/changelog-git": "^0.2.1",
+ "@changesets/config": "^3.1.4",
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.4",
+ "@changesets/get-release-plan": "^4.0.16",
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.7",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@changesets/write": "^0.4.0",
+ "@inquirer/external-editor": "^1.0.2",
+ "@manypkg/get-packages": "^1.1.3",
+ "ansi-colors": "^4.1.3",
+ "enquirer": "^2.4.1",
+ "fs-extra": "^7.0.1",
+ "mri": "^1.2.0",
+ "package-manager-detector": "^0.2.0",
+ "picocolors": "^1.1.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3",
+ "spawndamnit": "^3.0.1",
+ "term-size": "^2.1.0"
},
- "engines": {
- "node": ">=8"
+ "bin": {
+ "changeset": "bin.js"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/isexe": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
- "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "node_modules/@changesets/cli/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=10"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "node_modules/@changesets/config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz",
+ "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1",
+ "micromatch": "^4.0.8"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "node_modules/@changesets/errors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
+ "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "node_modules/@changesets/get-dependents-graph": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz",
+ "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "picocolors": "^1.1.0",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/get-dependents-graph/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@changesets/get-release-plan": {
+ "version": "4.0.16",
+ "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz",
+ "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/assemble-release-plan": "^6.0.10",
+ "@changesets/config": "^3.1.4",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.7",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "node_modules/@changesets/get-version-range-type": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz",
+ "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@changesets/git": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz",
+ "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "is-subdir": "^1.1.1",
+ "micromatch": "^4.0.8",
+ "spawndamnit": "^3.0.1"
+ }
+ },
+ "node_modules/@changesets/logger": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz",
+ "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.1.0"
+ }
+ },
+ "node_modules/@changesets/parse": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz",
+ "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "js-yaml": "^4.1.1"
+ }
+ },
+ "node_modules/@changesets/pre": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz",
+ "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ }
+ },
+ "node_modules/@changesets/read": {
+ "version": "0.6.7",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz",
+ "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/parse": "^0.4.3",
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0",
+ "picocolors": "^1.1.0"
+ }
+ },
+ "node_modules/@changesets/should-skip-package": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz",
+ "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "node_modules/@changesets/types": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz",
+ "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@changesets/write": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz",
+ "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "human-id": "^4.1.1",
+ "prettier": "^2.7.1"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.7.0.tgz",
+ "integrity": "sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.7.0.tgz",
+ "integrity": "sha512-x5lCqu1tetgsJFkjQ6VSocbHldsRkGEgwg5N98Vx21sq/V5wcmj4u226PY9k+TEpIgQ772zlYbPLTPicWyGnpA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/sidepanel-js": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.7.0.tgz",
+ "integrity": "sha512-A8r34jCU8kcIk2viECEn2msA28ojUF1BLi/3v5OWWc5G2N3jOuuumBXoeYjfr8dA0UxgFSy5R2bt12dnFJQSyA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@dotenvx/dotenvx": {
+ "version": "1.75.1",
+ "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.75.1.tgz",
+ "integrity": "sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@dotenvx/primitives": "^0.8.0",
+ "commander": "^11.1.0",
+ "conf": "^10.2.0",
+ "dotenv": "^17.2.1",
+ "enquirer": "^2.4.1",
+ "env-paths": "^2.2.1",
+ "execa": "^5.1.1",
+ "fdir": "^6.2.0",
+ "ignore": "^5.3.0",
+ "object-treeify": "1.1.33",
+ "open": "^8.4.2",
+ "picomatch": "^4.0.4",
+ "systeminformation": "^5.22.11",
+ "undici": "^7.11.0",
+ "which": "^4.0.0",
+ "yocto-spinner": "^1.1.0"
+ },
+ "bin": {
+ "dotenvx": "src/cli/dotenvx.js"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/isexe": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
+ "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@dotenvx/dotenvx/node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -1152,6 +1655,45 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.93",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.93.tgz",
+ "integrity": "sha512-/XhANjfGYOuqvSR3TmUnkQkINvQ4GVjVuukvymRbxtVFBvIq/yiXJqCDycKcQPT401OYT9H2vIY6ihAlz1QIAw==",
+ "dev": true,
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -1202,6 +1744,268 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@loaderkit/resolve": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.6.tgz",
+ "integrity": "sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@braidai/lang": "^1.0.0"
+ }
+ },
+ "node_modules/@manypkg/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@types/node": "^12.7.1",
+ "find-up": "^4.1.0",
+ "fs-extra": "^8.1.0"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/@types/node": {
+ "version": "12.20.55",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@manypkg/find-root/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@manypkg/get-packages": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz",
+ "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@changesets/types": "^4.0.1",
+ "@manypkg/find-root": "^1.1.0",
+ "fs-extra": "^8.1.0",
+ "globby": "^11.0.0",
+ "read-yaml-file": "^1.1.0"
+ }
+ },
+ "node_modules/@manypkg/get-packages/node_modules/@changesets/types": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz",
+ "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@manypkg/get-packages/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@microsoft/api-extractor": {
+ "version": "7.58.12",
+ "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.12.tgz",
+ "integrity": "sha512-VNpgC/1LaroLbn+UKmwDYspq+9r3EHyj4vJ3qUy/g8vB0rKt+1Wgs7WFj/JGpgxhG8SNyXs1XwYwe7nqkk8IDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/api-extractor-model": "7.33.10",
+ "@microsoft/tsdoc": "~0.16.0",
+ "@microsoft/tsdoc-config": "~0.18.1",
+ "@rushstack/node-core-library": "5.23.3",
+ "@rushstack/rig-package": "0.7.3",
+ "@rushstack/terminal": "0.24.2",
+ "@rushstack/ts-command-line": "5.3.12",
+ "diff": "~8.0.2",
+ "minimatch": "10.2.3",
+ "resolve": "~1.22.1",
+ "semver": "~7.7.4",
+ "source-map": "~0.6.1",
+ "typescript": "5.9.3"
+ },
+ "bin": {
+ "api-extractor": "bin/api-extractor"
+ }
+ },
+ "node_modules/@microsoft/api-extractor-model": {
+ "version": "7.33.10",
+ "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.10.tgz",
+ "integrity": "sha512-uPUK17xGxeQ3av6TN7awp+dTTSTvx8fZC0XFL1gyt7hFapYuxND3XLXH8vkmI7UjfW92oogzFAFqHSifmJROaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/tsdoc": "~0.16.0",
+ "@microsoft/tsdoc-config": "~0.18.1",
+ "@rushstack/node-core-library": "5.23.3"
+ }
+ },
+ "node_modules/@microsoft/api-extractor/node_modules/minimatch": {
+ "version": "10.2.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz",
+ "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@microsoft/api-extractor/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@microsoft/api-extractor/node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/@microsoft/tsdoc": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz",
+ "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@microsoft/tsdoc-config": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz",
+ "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/tsdoc": "0.16.0",
+ "ajv": "~8.18.0",
+ "jju": "~1.4.0",
+ "resolve": "~1.22.2"
+ }
+ },
+ "node_modules/@microsoft/tsdoc-config/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@modelcontextprotocol/sdk": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz",
@@ -1328,9 +2132,9 @@
}
},
"node_modules/@oxc-project/types": {
- "version": "0.139.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
- "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
+ "version": "0.142.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz",
+ "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -1360,6 +2164,22 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@publint/pack": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.6.tgz",
+ "integrity": "sha512-3uVNyGcVplhPZSLVyeIpL7+cIRn1YCSNHLG/rUIlBQMVH8YuN9++YF+5+UDIIO9RW98dujiUoTltO7RDB5bFJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyexec": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://bjornlu.com/sponsor"
+ }
+ },
"node_modules/@radix-ui/number": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz",
@@ -2857,9 +3677,9 @@
"license": "MIT"
},
"node_modules/@rolldown/binding-android-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
- "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz",
+ "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==",
"cpu": [
"arm64"
],
@@ -2874,9 +3694,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
- "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz",
+ "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==",
"cpu": [
"arm64"
],
@@ -2891,9 +3711,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
- "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz",
+ "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==",
"cpu": [
"x64"
],
@@ -2908,9 +3728,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
- "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz",
+ "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==",
"cpu": [
"x64"
],
@@ -2925,9 +3745,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
- "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz",
+ "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==",
"cpu": [
"arm"
],
@@ -2942,9 +3762,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
- "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz",
+ "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==",
"cpu": [
"arm64"
],
@@ -2959,9 +3779,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
- "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz",
+ "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==",
"cpu": [
"arm64"
],
@@ -2976,9 +3796,9 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
- "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz",
+ "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==",
"cpu": [
"ppc64"
],
@@ -2993,9 +3813,9 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
- "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz",
+ "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==",
"cpu": [
"s390x"
],
@@ -3010,9 +3830,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
- "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz",
+ "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==",
"cpu": [
"x64"
],
@@ -3027,9 +3847,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
- "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz",
+ "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==",
"cpu": [
"x64"
],
@@ -3044,9 +3864,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
- "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz",
+ "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==",
"cpu": [
"arm64"
],
@@ -3060,102 +3880,418 @@
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
- "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
- "cpu": [
- "wasm32"
- ],
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz",
+ "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz",
+ "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/node-core-library": {
+ "version": "5.23.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.23.3.tgz",
+ "integrity": "sha512-f6uuza7Um65bwsIJgf0MRs7IPA5IG+A+zs1AYGQvpZmLjtTGdfHowhQw4kwF0pPhJCrU4UHNhK8Qa6tLygYZCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "~8.20.0",
+ "ajv-draft-04": "~1.0.0",
+ "ajv-formats": "~3.0.1",
+ "fs-extra": "~11.3.0",
+ "import-lazy": "~4.0.0",
+ "jju": "~1.4.0",
+ "resolve": "~1.22.1",
+ "semver": "~7.7.4"
+ },
+ "peerDependencies": {
+ "@types/node": "*"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
+ "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.5.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/fs-extra": {
+ "version": "11.3.6",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz",
+ "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@rushstack/node-core-library/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@rushstack/problem-matcher": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz",
+ "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/node": "*"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rushstack/rig-package": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz",
+ "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jju": "~1.4.0",
+ "resolve": "~1.22.1"
+ }
+ },
+ "node_modules/@rushstack/terminal": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.2.tgz",
+ "integrity": "sha512-KB7PpvzDyKMw/RGU3TxOwxTs3OwZ4gq6+WHlTJN/JfQH4ezliNtWIqver78jTaAJyz/ZAAlJGH7a/M1WyFLFSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rushstack/node-core-library": "5.23.3",
+ "@rushstack/problem-matcher": "0.2.1",
+ "supports-color": "~8.1.1"
+ },
+ "peerDependencies": {
+ "@types/node": "*"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rushstack/terminal/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/@rushstack/ts-command-line": {
+ "version": "5.3.12",
+ "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.12.tgz",
+ "integrity": "sha512-Vg2n24arSf7JvUNga2DMHYTbxnVq9L5OtVCp4Gfr8YC/kmL/bmdR8FQhGcpMzMYNY9Vdw3+TaimG11Sf+z1Tpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rushstack/terminal": "0.24.2",
+ "@types/argparse": "1.0.38",
+ "argparse": "~1.0.9",
+ "string-argv": "~0.3.1"
+ }
+ },
+ "node_modules/@rushstack/ts-command-line/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@shikijs/core": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.1.tgz",
+ "integrity": "sha512-VeR2CY6Nn9/WbisoYLOQZ7HZOnwTrpBuOw4wExjqLnBCi62BNWynBUO6K2uPIASPFJwAv7cX1fUu+LrPlSstcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/primitive": "4.4.1",
+ "@shikijs/types": "4.4.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5",
+ "hast-util-to-html": "^9.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.1.tgz",
+ "integrity": "sha512-6U4lJBh8LTvIkEVqRHv/rr3ruwtO6IweFQt1ME1ntHJMGHS+6N86vfYGO1o8c/DtOCTia2lfhdQBtBrps1sDfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.6"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.1.tgz",
+ "integrity": "sha512-p23RugMKss0r5DAtRJW1yAXUDl60JvhQYV20yuxei//26JyDSJefV3umyWzzwep2weblMnJGDYahuti6XkcMgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.1",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.1.tgz",
+ "integrity": "sha512-xb2kCMloBCIraIy2fS5MW0t/BxVY3q2nDyQKBoeSeq6KNrQbShHetCFlw2n35fGIJ6t3+hXDLQogP5ir9O9bvA==",
"dev": true,
"license": "MIT",
- "optional": true,
"dependencies": {
- "@emnapi/core": "1.11.1",
- "@emnapi/runtime": "1.11.1",
- "@napi-rs/wasm-runtime": "^1.1.6"
+ "@shikijs/types": "4.4.1"
},
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": ">=20"
}
},
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
- "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@shikijs/primitive": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.1.tgz",
+ "integrity": "sha512-ko2OfDoG89YuQ7xL5LtcQiWKb7NIv1Ephb7g48TVU198OzAMLC8lXVEwaJGHK4sUMYrfAGJDqYmNLOLiW/Kz8w==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "@shikijs/types": "4.4.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
+ },
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": ">=20"
}
},
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
- "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@shikijs/themes": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.1.tgz",
+ "integrity": "sha512-wudOaoFro+/Zl9gQv2W1Ur5XlVduqvTuYLI483Xi0wgc1A+cy1hfB2r6ac6ufBgF+ID7KJEW7L41MHrzQ4wH+w==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "@shikijs/types": "4.4.1"
+ },
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": ">=20"
}
},
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "node_modules/@shikijs/transformers": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.4.1.tgz",
+ "integrity": "sha512-Sb9Eehas+5EhClpFgNuklwY3aWf354FLaKRCiAWmjdNbHAjoQUpv6WmSj+N19eTXO6GLIWh1dIOH9dxyauhVWw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.4.1",
+ "@shikijs/types": "4.4.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
},
- "node_modules/@rollup/pluginutils": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
- "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "node_modules/@shikijs/types": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.1.tgz",
+ "integrity": "sha512-GOwCLQDHM5EjGUWNPrhzJbr6JP8V/Dx/CDVkWvbZ1Avw5JFnNUckrgbLmE07qtg4WlW7Q7QFndhjIkeU9XMPvw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^4.0.2"
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=20"
}
},
- "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
"dev": true,
"license": "MIT"
},
- "node_modules/@sec-ant/readable-stream": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
- "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
},
"node_modules/@sindresorhus/merge-streams": {
"version": "4.0.0",
@@ -3733,6 +4869,13 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/argparse": {
+ "version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
+ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/chai": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
@@ -3780,6 +4923,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3787,6 +4940,41 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
"version": "26.1.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz",
@@ -3816,6 +5004,13 @@
"@types/react": "^19.2.0"
}
},
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/validate-npm-package-name": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz",
@@ -3823,6 +5018,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz",
@@ -4066,6 +5268,13 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz",
+ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/@vitejs/plugin-react": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.4.tgz",
@@ -4092,6 +5301,23 @@
}
}
},
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.8",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz",
+ "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "vue": "^3.2.25"
+ }
+ },
"node_modules/@vitest/browser": {
"version": "4.1.10",
"resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.10.tgz",
@@ -4265,51 +5491,310 @@
"dev": true,
"license": "MIT",
"funding": {
- "url": "https://opencollective.com/vitest"
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
+ "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/source-map": "2.4.28"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
+ "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@volar/typescript": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz",
+ "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.28",
+ "path-browserify": "^1.0.1",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz",
+ "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@vue/shared": "3.5.40",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz",
+ "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz",
+ "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@vue/compiler-core": "3.5.40",
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/shared": "3.5.40",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz",
+ "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.2.1.tgz",
+ "integrity": "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.2.1"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz",
+ "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^8.2.1",
+ "birpc": "^2.6.1",
+ "hookable": "^5.5.3",
+ "perfect-debounce": "^2.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz",
+ "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz",
+ "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz",
+ "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz",
+ "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.40",
+ "@vue/runtime-core": "3.5.40",
+ "@vue/shared": "3.5.40",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz",
+ "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz",
+ "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz",
+ "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "14.4.0",
+ "@vueuse/shared": "14.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
}
},
- "node_modules/@vitest/utils": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
- "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "node_modules/@vueuse/integrations": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.4.0.tgz",
+ "integrity": "sha512-oJz9qTgczvA7L1nXQFRU7h8tQbOCoiceqvMMhT9XYMyOGTqLJ2rEa09PON+nD2t48sZUfeOmg4eaWJXV4sZb/w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "4.1.10",
- "convert-source-map": "^2.0.0",
- "tinyrainbow": "^3.1.0"
+ "@vueuse/core": "14.4.0",
+ "@vueuse/shared": "14.4.0"
},
"funding": {
- "url": "https://opencollective.com/vitest"
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7 || ^8",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7 || ^8",
+ "vue": "^3.5.0"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
}
},
- "node_modules/@volar/language-core": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
- "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
+ "node_modules/@vueuse/metadata": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz",
+ "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@volar/source-map": "2.4.28"
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
}
},
- "node_modules/@volar/source-map": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
- "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@volar/typescript": {
- "version": "2.4.28",
- "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz",
- "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
+ "node_modules/@vueuse/shared": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz",
+ "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@volar/language-core": "2.4.28",
- "path-browserify": "^1.0.1",
- "vscode-uri": "^3.0.8"
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
}
},
"node_modules/@zip.js/zip.js": {
@@ -4429,6 +5914,22 @@
"node": ">=6"
}
},
+ "node_modules/ansi-escapes": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -4439,6 +5940,29 @@
"node": ">=8"
}
},
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/apache-arrow": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-21.2.0.tgz",
@@ -4488,6 +6012,16 @@
"node": ">=10"
}
},
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/assertion-error": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
@@ -4540,6 +6074,16 @@
"node": ">=10.12.0"
}
},
+ "node_modules/axe-core": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz",
+ "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
@@ -4563,6 +6107,29 @@
"node": ">=6.0.0"
}
},
+ "node_modules/better-path-resolve": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz",
+ "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-windows": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/body-parser": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
@@ -4603,9 +6170,9 @@
}
},
"node_modules/brace-expansion": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
- "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4750,6 +6317,17 @@
],
"license": "CC-BY-4.0"
},
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/chai": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
@@ -4773,6 +6351,52 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
@@ -4801,6 +6425,45 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/cli-highlight": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
+ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "highlight.js": "^10.7.1",
+ "mz": "^2.4.0",
+ "parse5": "^5.1.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.0",
+ "yargs": "^16.0.0"
+ },
+ "bin": {
+ "highlight": "bin/highlight"
+ },
+ "engines": {
+ "node": ">=8.0.0",
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
"node_modules/cli-spinners": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
@@ -4814,6 +6477,78 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-table3/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-table3/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -4830,12 +6565,43 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/comlink": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz",
"integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==",
"license": "Apache-2.0"
},
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/commander": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
@@ -5196,6 +6962,26 @@
"node": ">= 0.8"
}
},
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -5212,6 +6998,20 @@
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
"license": "MIT"
},
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/diff": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
@@ -5222,6 +7022,19 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/dockview": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/dockview/-/dockview-7.0.4.tgz",
@@ -5315,6 +7128,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/emojilib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -5353,6 +7173,19 @@
"node": ">=8.6"
}
},
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
@@ -5363,6 +7196,19 @@
"node": ">=6"
}
},
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/error-ex": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
@@ -5793,6 +7639,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/extendable-error": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz",
+ "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -6003,6 +7856,16 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/focus-trap": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.2.2.tgz",
+ "integrity": "sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.5.0"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -6050,6 +7913,21 @@
"node": ">= 0.8"
}
},
+ "node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -6092,6 +7970,16 @@
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-east-asian-width": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
@@ -6209,6 +8097,27 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -6265,6 +8174,44 @@
"node": ">= 0.4"
}
},
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hermes-estree": {
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
@@ -6282,16 +8229,33 @@
"hermes-estree": "0.25.1"
}
},
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/hono": {
- "version": "4.12.33",
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.33.tgz",
- "integrity": "sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz",
+ "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16.9.0"
}
},
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -6299,6 +8263,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
@@ -6320,6 +8295,16 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/human-id": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.0.tgz",
+ "integrity": "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "human-id": "dist/cli.js"
+ }
+ },
"node_modules/human-signals": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz",
@@ -6384,6 +8369,16 @@
"node": ">=4"
}
},
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -6438,6 +8433,22 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
@@ -6464,6 +8475,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -6588,6 +8609,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-subdir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz",
+ "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "better-path-resolve": "1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/is-unicode-supported": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
@@ -6601,6 +8635,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-wsl": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
@@ -6673,6 +8717,13 @@
"jiti": "lib/jiti-cli.mjs"
}
},
+ "node_modules/jju": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+ "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jose": {
"version": "6.2.7",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.7.tgz",
@@ -6780,6 +8831,16 @@
"node": ">=6"
}
},
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -7123,6 +9184,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/log-symbols": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
@@ -7223,6 +9291,61 @@
"node": ">=10"
}
},
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/marked": {
+ "version": "9.1.6",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz",
+ "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/marked-terminal": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz",
+ "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "ansi-regex": "^6.1.0",
+ "chalk": "^5.4.1",
+ "cli-highlight": "^2.1.11",
+ "cli-table3": "^0.6.5",
+ "node-emoji": "^2.2.0",
+ "supports-hyperlinks": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "marked": ">=1 <16"
+ }
+ },
+ "node_modules/marked-terminal/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -7233,6 +9356,28 @@
"node": ">= 0.4"
}
},
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/media-typer": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz",
@@ -7271,29 +9416,123 @@
"integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
}
},
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
"dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT"
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
},
"node_modules/micromatch": {
"version": "4.0.8",
@@ -7398,6 +9637,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minisearch": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
+ "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/mlly": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
@@ -7445,6 +9691,16 @@
"integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==",
"license": "MIT"
},
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
@@ -7462,6 +9718,18 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.16",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
@@ -7508,6 +9776,22 @@
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
+ "node_modules/node-emoji": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz",
+ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^4.6.0",
+ "char-regex": "^1.0.2",
+ "emojilib": "^2.4.0",
+ "skin-tone": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/node-releases": {
"version": "2.0.48",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz",
@@ -7644,6 +9928,25 @@
"node": ">=6"
}
},
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
"node_modules/open": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz",
@@ -7736,6 +10039,26 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/outdent": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz",
+ "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/p-filter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
+ "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -7768,6 +10091,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -7778,6 +10111,16 @@
"node": ">=6"
}
},
+ "node_modules/package-manager-detector": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
+ "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^0.2.7"
+ }
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -7829,6 +10172,30 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse5": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^6.0.1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -7866,6 +10233,13 @@
"node": ">=8"
}
},
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/path-to-regexp": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
@@ -7877,6 +10251,16 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
@@ -7884,6 +10268,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/perfect-debounce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
+ "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -7904,6 +10295,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pkce-challenge": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
@@ -8169,6 +10570,17 @@
"node": ">=6"
}
},
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -8183,6 +10595,35 @@
"node": ">= 0.10"
}
},
+ "node_modules/publint": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.23.tgz",
+ "integrity": "sha512-5MQipUPcB7MWw84zLUkHrg/H/UBtk3LL+A0GngTTBSsiNJLQurMUaSIRG3edlOrRz4UFe0AOKK9TZdIWviV+jQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@publint/pack": "^0.1.6",
+ "package-manager-detector": "^1.7.0",
+ "picocolors": "^1.1.1",
+ "sade": "^1.8.1"
+ },
+ "bin": {
+ "publint": "src/cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://bjornlu.com/sponsor"
+ }
+ },
+ "node_modules/publint/node_modules/package-manager-detector": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",
+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -8470,6 +10911,46 @@
"react-dom": "^18.0.0 || ^19.0.0"
}
},
+ "node_modules/read-yaml-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz",
+ "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.6.1",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/js-yaml": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz",
+ "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
"node_modules/recast": {
"version": "0.23.19",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz",
@@ -8487,6 +10968,43 @@
"node": ">= 4"
}
},
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -8503,6 +11021,38 @@
"integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
"license": "MIT"
},
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/restore-cursor": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
@@ -8548,13 +11098,13 @@
}
},
"node_modules/rolldown": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
- "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz",
+ "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@oxc-project/types": "=0.139.0",
+ "@oxc-project/types": "=0.142.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -8564,21 +11114,20 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.1.5",
- "@rolldown/binding-darwin-arm64": "1.1.5",
- "@rolldown/binding-darwin-x64": "1.1.5",
- "@rolldown/binding-freebsd-x64": "1.1.5",
- "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
- "@rolldown/binding-linux-arm64-gnu": "1.1.5",
- "@rolldown/binding-linux-arm64-musl": "1.1.5",
- "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
- "@rolldown/binding-linux-s390x-gnu": "1.1.5",
- "@rolldown/binding-linux-x64-gnu": "1.1.5",
- "@rolldown/binding-linux-x64-musl": "1.1.5",
- "@rolldown/binding-openharmony-arm64": "1.1.5",
- "@rolldown/binding-wasm32-wasi": "1.1.5",
- "@rolldown/binding-win32-arm64-msvc": "1.1.5",
- "@rolldown/binding-win32-x64-msvc": "1.1.5"
+ "@rolldown/binding-android-arm64": "1.2.2",
+ "@rolldown/binding-darwin-arm64": "1.2.2",
+ "@rolldown/binding-darwin-x64": "1.2.2",
+ "@rolldown/binding-freebsd-x64": "1.2.2",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.2",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.2",
+ "@rolldown/binding-linux-arm64-musl": "1.2.2",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.2",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.2",
+ "@rolldown/binding-linux-x64-gnu": "1.2.2",
+ "@rolldown/binding-linux-x64-musl": "1.2.2",
+ "@rolldown/binding-openharmony-arm64": "1.2.2",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.2",
+ "@rolldown/binding-win32-x64-msvc": "1.2.2"
}
},
"node_modules/router": {
@@ -8635,6 +11184,19 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -8830,6 +11392,26 @@
"node": ">=8"
}
},
+ "node_modules/shiki": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.1.tgz",
+ "integrity": "sha512-rFP+iYKzjLEIqiMiKANhARqiAbk4deDhWnBtnUO/K0D0dPxMGDH4N0FVfBY/VeI+lPrV4wNGCHQZp7EOr7NNBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.4.1",
+ "@shikijs/engine-javascript": "4.4.1",
+ "@shikijs/engine-oniguruma": "4.4.1",
+ "@shikijs/langs": "4.4.1",
+ "@shikijs/themes": "4.4.1",
+ "@shikijs/types": "4.4.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
"node_modules/side-channel": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
@@ -8948,6 +11530,29 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/skin-tone": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
+ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-emoji-modifier-base": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/sonner": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz",
@@ -8978,6 +11583,35 @@
"node": ">=0.10.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spawndamnit": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz",
+ "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "cross-spawn": "^7.0.5",
+ "signal-exit": "^4.0.1"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/stackback": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
@@ -9015,6 +11649,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
"node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
@@ -9062,6 +11706,21 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/stringify-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz",
@@ -9142,6 +11801,36 @@
"node": ">=8"
}
},
+ "node_modules/supports-hyperlinks": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz",
+ "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/systeminformation": {
"version": "5.33.1",
"resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz",
@@ -9169,6 +11858,13 @@
"url": "https://www.buymeacoffee.com/systeminfo"
}
},
+ "node_modules/tabbable": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
+ "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tailwind-merge": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
@@ -9200,6 +11896,42 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/tiny-invariant": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
@@ -9284,6 +12016,17 @@
"node": ">=6"
}
},
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
@@ -9446,6 +12189,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/unicode-emoji-modifier-base": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
+ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
@@ -9459,6 +12212,89 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -9665,17 +12501,47 @@
"node": ">= 0.8"
}
},
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/vite": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
- "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz",
+ "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "lightningcss": "^1.32.0",
+ "lightningcss": "^1.33.0",
"picomatch": "^4.0.5",
- "postcss": "^8.5.17",
- "rolldown": "~1.1.5",
+ "postcss": "^8.5.23",
+ "rolldown": "~1.2.0",
"tinyglobby": "^0.2.17"
},
"bin": {
@@ -9692,7 +12558,7 @@
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
- "@vitejs/devtools": "^0.3.0",
+ "@vitejs/devtools": "^0.4.0",
"esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",
@@ -9784,6 +12650,49 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/vitepress": {
+ "version": "2.0.0-alpha.19",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.19.tgz",
+ "integrity": "sha512-WnBsb0Bwr43kXKyiis+lld/7ri3hnMbthS8N3hpFtjjwsdLO4IRmiAE08D7aud4q6oMDf9uwRowxzNqRFe/amw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "^4.7.0",
+ "@docsearch/js": "^4.7.0",
+ "@docsearch/sidepanel-js": "^4.7.0",
+ "@iconify-json/simple-icons": "^1.2.92",
+ "@shikijs/core": "^4.4.1",
+ "@shikijs/transformers": "^4.4.1",
+ "@shikijs/types": "^4.4.1",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^6.0.8",
+ "@vue/devtools-api": "^8.2.1",
+ "@vue/shared": "^3.5.40",
+ "@vueuse/core": "^14.4.0",
+ "@vueuse/integrations": "^14.4.0",
+ "focus-trap": "^8.2.2",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.2.0",
+ "shiki": "^4.4.1",
+ "vite": "^8.2.0",
+ "vue": "^3.5.40"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vitest": {
"version": "4.1.10",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
@@ -9881,6 +12790,28 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/vue": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz",
+ "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-sfc": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/server-renderer": "3.5.40",
+ "@vue/shared": "3.5.40"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
@@ -9931,6 +12862,46 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -9977,6 +12948,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -9984,6 +12965,57 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/yargs": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz",
+ "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -10059,6 +13091,17 @@
"zod": "^3.25.0 || ^4.0.0"
}
},
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"packages/core": {
"name": "@/core",
"version": "1.0.0",
diff --git a/package.json b/package.json
index ad94612..6dfd6d6 100644
--- a/package.json
+++ b/package.json
@@ -4,15 +4,21 @@
"version": "1.0.0",
"type": "module",
"packageManager": "npm@11.7.0",
- "engines": {
- "node": ">=24.0.0 <25"
- },
"scripts": {
"dev": "vite",
"build": "tsc -p tsconfig.app.json --noEmit && vite build",
- "build:lib": "vite build --config vite.lib.config.ts",
+ "build:lib": "vite build --config vite.lib.config.ts && api-extractor run",
+ "docs:dev": "vitepress dev docs",
+ "docs:build": "vitepress build docs",
+ "api:report": "api-extractor run --local",
+ "api:report:check": "api-extractor run",
+ "check:package": "npm run api:report:check && publint && attw --pack . --profile esm-only --exclude-entrypoints ./style.css ./index.css && npm run verify:npm-consumer",
+ "check:bundle-size": "node scripts/check-bundle-size.mjs",
+ "sbom": "npm sbom --sbom-format cyclonedx > sbom.cdx.json",
+ "changeset": "changeset",
+ "version-packages": "changeset version",
"verify:npm-consumer": "node scripts/verify-npm-consumer.mjs",
- "lint": "eslint .",
+ "lint": "eslint . --max-warnings 0",
"format": "prettier --write .",
"format:check": "prettier --check \"*.{md,json}\" \"docs/**/*.md\" \".github/**/*.{yml,yaml,md}\" \"src/**/*.{ts,tsx,js,mjs,css,json,md}\" \"vite/**/*.{ts,tsx}\" \"scripts/**/*.{ts,tsx,js,mjs,json}\" \"tests/**/*.{ts,tsx,js,mjs,json}\"",
"fixtures:generate": "node scripts/generate-test-fixtures.mjs",
@@ -20,12 +26,16 @@
"test": "vitest run",
"test:unit": "vitest run",
"test:browser": "vitest run --config vitest.browser.config.ts",
+ "test:browser:smoke": "vitest run --config vitest.browser.smoke.config.ts",
"test:compat": "vitest run tests/compat",
"test:coverage": "vitest run --coverage",
"preview": "vite preview"
},
"devDependencies": {
+ "@arethetypeswrong/cli": "^0.18.5",
+ "@changesets/cli": "^2.31.1",
"@eslint/js": "^10.0.1",
+ "@microsoft/api-extractor": "^7.58.12",
"@playwright/test": "^1.62.0",
"@tailwindcss/vite": "^4.3.3",
"@types/node": "^26.1.2",
@@ -35,6 +45,7 @@
"@vitest/browser": "^4.1.10",
"@vitest/browser-playwright": "^4.1.10",
"@vitest/coverage-v8": "^4.1.10",
+ "axe-core": "^4.12.1",
"eslint": "^10.8.0",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.3",
@@ -42,24 +53,26 @@
"lightningcss": "^1.33.0",
"playwright": "^1.62.0",
"prettier": "^3.6.2",
+ "publint": "^0.3.23",
+ "react": "^19.2.8",
+ "react-dom": "^19.2.8",
+ "shadcn": "^4.16.0",
"tailwindcss": "^4.3.3",
"typescript": "6.0.3",
"typescript-eslint": "^8.65.0",
"vite": "^8.1.5",
"vite-plugin-dts": "^5.0.3",
- "vitest": "^4.1.10",
- "react": "^19.2.8",
- "react-dom": "^19.2.8",
- "shadcn": "^4.16.0"
+ "vitepress": "2.0.0-alpha.19",
+ "vitest": "^4.1.10"
},
"description": "Browser-based LeRobot dataset visualizer and React embeddable studio",
"license": "MIT",
"main": "./dist-lib/lerobot.es.js",
"module": "./dist-lib/lerobot.es.js",
- "types": "./dist-lib/react/index.d.ts",
+ "types": "./dist-lib/lerobot.d.ts",
"exports": {
".": {
- "types": "./dist-lib/react/index.d.ts",
+ "types": "./dist-lib/lerobot.d.ts",
"import": "./dist-lib/lerobot.es.js",
"default": "./dist-lib/lerobot.es.js"
},
@@ -67,11 +80,14 @@
"./index.css": "./dist-lib/lerobot-studio.css"
},
"files": [
- "dist-lib"
+ "dist-lib",
+ "CHANGELOG.md",
+ "LICENSE",
+ "NOTICE",
+ "README.md"
],
"sideEffects": [
- "**/*.css",
- "./src/platform/workers/**"
+ "**/*.css"
],
"repository": {
"type": "git",
@@ -82,8 +98,8 @@
},
"homepage": "https://github.com/ioai-tech/lerobot-studio#readme",
"peerDependencies": {
- "react": "^19.2.8",
- "react-dom": "^19.2.8"
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
},
"publishConfig": {
"access": "public"
diff --git a/scripts/check-bundle-size.mjs b/scripts/check-bundle-size.mjs
new file mode 100644
index 0000000..b339a2c
--- /dev/null
+++ b/scripts/check-bundle-size.mjs
@@ -0,0 +1,283 @@
+import { spawnSync } from 'node:child_process';
+import { readdir, readFile } from 'node:fs/promises';
+import path from 'node:path';
+import { gzipSync } from 'node:zlib';
+
+const ROOT = process.cwd();
+const LIB_DIR = path.join(ROOT, 'dist-lib');
+const WEB_DIR = path.join(ROOT, 'dist');
+const scale = Number(process.env.BUNDLE_SIZE_BUDGET_SCALE ?? '1');
+
+if (!Number.isFinite(scale) || scale <= 0 || scale > 1) {
+ console.error('BUNDLE_SIZE_BUDGET_SCALE must be greater than 0 and at most 1.');
+ process.exit(2);
+}
+
+// These hard limits are approximately 5% above the measured 2026-08-04 baseline.
+// Raising one requires an explicit review of the generated artifacts.
+const budgets = {
+ libEntry: { raw: 330_300, gzip: 107_300 },
+ libCss: { raw: 354_200, gzip: 108_500 },
+ webInitialJs: { raw: 2_664_000, gzip: 715_000 },
+ webInitialCss: { raw: 192_000, gzip: 24_400 },
+ libDataLoader: { raw: 272_100, gzip: 56_200 },
+ webDataLoader: { raw: 33_500, gzip: 9_300 },
+ libDockview: { raw: 670_900, gzip: 158_700 },
+ webDockview: { raw: 91_500, gzip: 26_900 },
+ libWorkerWasm: { raw: 9_100_000, gzip: 2_940_000 },
+ libWorkers: { raw: 461_000, gzip: 106_000 },
+ webWorkerWasm: { raw: 6_819_000, gzip: 2_014_000 },
+ webWorkers: { raw: 461_000, gzip: 106_000 },
+ largestLibJs: { raw: 670_900, gzip: 158_700 },
+ largestWebJs: { raw: 1_108_200, gzip: 313_400 },
+ npmTarball: { raw: 11_554_000, gzip: 3_444_000 },
+};
+
+const failures = [];
+
+async function walkFiles(directory) {
+ let entries;
+ try {
+ entries = await readdir(directory, { withFileTypes: true });
+ } catch (error) {
+ failures.push(`Missing build output directory: ${path.relative(ROOT, directory)}/`);
+ return [];
+ }
+
+ const files = [];
+ for (const entry of entries) {
+ const absolute = path.join(directory, entry.name);
+ if (entry.isDirectory()) {
+ files.push(...(await walkFiles(absolute)));
+ } else if (entry.isFile()) {
+ files.push(absolute);
+ }
+ }
+ return files;
+}
+
+function oneFile(files, pattern, description) {
+ const matches = files.filter((file) => pattern.test(path.basename(file)));
+ if (matches.length !== 1) {
+ failures.push(
+ `Expected exactly one ${description}; found ${matches.length}: ${
+ matches.map((file) => path.relative(ROOT, file)).join(', ') || 'none'
+ }`,
+ );
+ }
+ return matches;
+}
+
+async function measureFiles(files) {
+ let raw = 0;
+ let gzip = 0;
+ for (const file of files) {
+ try {
+ const contents = await readFile(file);
+ raw += contents.byteLength;
+ gzip += gzipSync(contents, { level: 9 }).byteLength;
+ } catch (error) {
+ failures.push(`Cannot read artifact ${path.relative(ROOT, file)}: ${error.message}`);
+ }
+ }
+ return { raw, gzip };
+}
+
+function budgetFor(key) {
+ return {
+ raw: Math.floor(budgets[key].raw * scale),
+ gzip: Math.floor(budgets[key].gzip * scale),
+ };
+}
+
+function formatBytes(bytes) {
+ if (!Number.isFinite(bytes)) return '-';
+ if (bytes < 1024) return `${bytes} B`;
+ if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KiB`;
+ return `${(bytes / 1024 ** 2).toFixed(2)} MiB`;
+}
+
+const rows = [];
+
+async function checkGroup(label, key, files) {
+ const actual = await measureFiles(files);
+ const limit = budgetFor(key);
+ rows.push({ label, actual, limit });
+ for (const encoding of ['raw', 'gzip']) {
+ if (actual[encoding] > limit[encoding]) {
+ failures.push(
+ `${label} ${encoding} is ${formatBytes(actual[encoding])}; limit is ${formatBytes(limit[encoding])}.`,
+ );
+ }
+ }
+}
+
+async function checkLargestChunk(label, key, files) {
+ const measured = await Promise.all(
+ files.map(async (file) => ({ file, ...(await measureFiles([file])) })),
+ );
+ const largestRaw = measured.toSorted((a, b) => b.raw - a.raw)[0] ?? { raw: 0, gzip: 0 };
+ const largestGzip = measured.toSorted((a, b) => b.gzip - a.gzip)[0] ?? {
+ raw: 0,
+ gzip: 0,
+ };
+ const actual = { raw: largestRaw.raw, gzip: largestGzip.gzip };
+ const limit = budgetFor(key);
+ rows.push({ label, actual, limit });
+
+ for (const item of measured) {
+ if (item.raw > limit.raw || item.gzip > limit.gzip) {
+ failures.push(
+ `Unexpected huge chunk ${path.relative(ROOT, item.file)} is ${formatBytes(item.raw)} raw / ${formatBytes(item.gzip)} gzip; per-chunk limit is ${formatBytes(limit.raw)} raw / ${formatBytes(limit.gzip)} gzip.`,
+ );
+ }
+ }
+}
+
+function htmlAssetPaths(html, relation) {
+ const matches = [];
+ const tagPattern = relation === 'script' ? /
+