diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 55ac2b8..ca11559 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,9 @@ concurrency: env: ZIG_VERSION: "0.15.2" + RUST_VERSION: "1.89.0" + NODE_VERSION: "22.22.0" + BUN_VERSION: "1.3.14" jobs: fast: @@ -44,14 +47,22 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: "22" + node-version: ${{ env.NODE_VERSION }} + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.89.0 - name: Install native build dependencies - run: sudo apt-get update && sudo apt-get install -y cargo perl rustc + run: sudo apt-get update && sudo apt-get install -y perl - name: Install npm package dependencies working-directory: zevm - run: npm --prefix npm/zevm install --ignore-scripts + run: npm --prefix npm/zevm ci --ignore-scripts - name: Fetch Zig package dependencies working-directory: zevm @@ -127,8 +138,16 @@ jobs: with: version: ${{ env.ZIG_VERSION }} + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.89.0 + - name: Install native build dependencies - run: sudo apt-get update && sudo apt-get install -y cargo perl rustc + run: sudo apt-get update && sudo apt-get install -y perl - name: Fetch Zig package dependencies working-directory: zevm @@ -160,6 +179,8 @@ jobs: - name: Set up Bun uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} - name: Set up Go uses: actions/setup-go@v5 @@ -254,10 +275,12 @@ jobs: working-directory: zevm run: | ARTIFACT_DIR=.ops/release-metadata/"$RELEASE_IDENTIFIER" - echo "zevm_revision=$(jq -r '.zevmGitRevision' "$ARTIFACT_DIR/release-tuple.json")" >> "$GITHUB_OUTPUT" - echo "voltaire_revision=$(jq -r '.voltaireGitRevision' "$ARTIFACT_DIR/release-tuple.json")" >> "$GITHUB_OUTPUT" - echo "guillotine_mini_revision=$(jq -r '.guillotineMiniGitRevision' "$ARTIFACT_DIR/release-tuple.json")" >> "$GITHUB_OUTPUT" - echo "zig_version=$(jq -r '.zigVersion' "$ARTIFACT_DIR/release-tuple.json")" >> "$GITHUB_OUTPUT" + { + echo "zevm_revision=$(jq -r '.zevmGitRevision' "$ARTIFACT_DIR/release-tuple.json")" + echo "voltaire_revision=$(jq -r '.voltaireGitRevision' "$ARTIFACT_DIR/release-tuple.json")" + echo "guillotine_mini_revision=$(jq -r '.guillotineMiniGitRevision' "$ARTIFACT_DIR/release-tuple.json")" + echo "zig_version=$(jq -r '.zigVersion' "$ARTIFACT_DIR/release-tuple.json")" + } >> "$GITHUB_OUTPUT" - name: Set up tuple Zig uses: mlugg/setup-zig@v2 @@ -266,6 +289,8 @@ jobs: - name: Set up Bun uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} - name: Set up Go uses: actions/setup-go@v5 @@ -273,7 +298,10 @@ jobs: go-version: "1.24.x" - name: Install native build dependencies - run: sudo apt-get update && sudo apt-get install -y cargo perl rustc + run: sudo apt-get update && sudo apt-get install -y perl + + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.89.0 - name: Verify materialized release tuple working-directory: zevm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..db9b9ac --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,250 @@ +name: Release + +on: + push: + tags: + - "v*" + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +env: + ZIG_VERSION: "0.15.2" + RUST_VERSION: "1.89.0" + TEST_NODE_VERSION: "22.22.0" + PUBLISH_NODE_VERSION: "24.11.1" + PUBLISH_NPM_VERSION: "11.6.2" + BUN_VERSION: "1.3.14" + +jobs: + verify: + name: Verify Release + runs-on: ubuntu-24.04 + timeout-minutes: 45 + permissions: + contents: read + steps: + - name: Checkout release tag + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Require a commit merged to main + run: | + git fetch origin main + git merge-base --is-ancestor "$GITHUB_SHA" origin/main + + - name: Set up Zig + uses: mlugg/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.89.0 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.TEST_NODE_VERSION }} + cache: npm + cache-dependency-path: npm/zevm/package-lock.json + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Install native build dependencies + run: sudo apt-get update && sudo apt-get install -y perl + + - name: Install npm dependencies + run: npm --prefix npm/zevm ci --ignore-scripts + + - name: Verify release versions and tag + run: npm --prefix npm/zevm run verify:release -- "$GITHUB_REF_NAME" + + - name: Fetch and verify Zig dependencies + run: | + zig build --fetch + zig build dependency-preflight -- --zig-version "$ZIG_VERSION" + + - name: Build + run: zig build --summary all + + - name: Test + run: zig build test --summary all + + - name: Run release qualification + run: | + zig build qualification-check -- --require-covered + zig build verify --summary all + + - name: Verify native interfaces + run: | + zig build c-smoke + zig build npm-smoke + + - name: Build TypeScript package + run: | + npm --prefix npm/zevm run typecheck + npm --prefix npm/zevm run build + + - name: Verify clean generated state + run: git diff --exit-code -- . + + native: + name: Native ${{ matrix.platform }} + needs: verify + runs-on: ${{ matrix.runner }} + timeout-minutes: 45 + permissions: + contents: read + strategy: + fail-fast: false + matrix: + include: + - platform: darwin-arm64 + runner: macos-15 + zig-target: aarch64-macos + rust-target: aarch64-apple-darwin + smoke: true + - platform: darwin-x64 + runner: macos-15-intel + zig-target: x86_64-macos + rust-target: x86_64-apple-darwin + smoke: true + - platform: linux-arm64-gnu + runner: ubuntu-24.04-arm + zig-target: aarch64-linux-gnu + rust-target: aarch64-unknown-linux-gnu + smoke: true + - platform: linux-arm64-musl + runner: ubuntu-24.04-arm + zig-target: aarch64-linux-musl + rust-target: aarch64-unknown-linux-musl + smoke: false + - platform: linux-x64-gnu + runner: ubuntu-24.04 + zig-target: x86_64-linux-gnu + rust-target: x86_64-unknown-linux-gnu + smoke: true + - platform: linux-x64-musl + runner: ubuntu-24.04 + zig-target: x86_64-linux-musl + rust-target: x86_64-unknown-linux-musl + smoke: false + - platform: win32-arm64-msvc + runner: windows-11-arm + zig-target: aarch64-windows-msvc + rust-target: aarch64-pc-windows-msvc + smoke: true + - platform: win32-ia32-msvc + runner: windows-2025 + zig-target: x86-windows-msvc + rust-target: i686-pc-windows-msvc + smoke: false + - platform: win32-x64-msvc + runner: windows-2025 + zig-target: x86_64-windows-msvc + rust-target: x86_64-pc-windows-msvc + smoke: true + steps: + - name: Checkout release tag + uses: actions/checkout@v4 + + - name: Set up Zig + uses: mlugg/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.89.0 + with: + targets: ${{ matrix.rust-target }} + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.TEST_NODE_VERSION }} + + - name: Install musl build tools + if: endsWith(matrix.platform, '-musl') + shell: bash + run: sudo apt-get update && sudo apt-get install -y musl-tools + + - name: Fetch Zig dependencies + shell: bash + run: zig build --fetch + + - name: Build native addon + shell: bash + run: >- + zig build npm-platform-artifacts + -Dtarget=${{ matrix.zig-target }} + -Doptimize=ReleaseSafe + --summary all + + - name: Smoke test native addon + if: matrix.smoke + shell: bash + run: node npm/zevm/scripts/smoke.cjs "zig-out/npm/prebuilds/${{ matrix.platform }}/zevm.node" + + - name: Verify native artifact + shell: bash + run: test -s "zig-out/npm/prebuilds/${{ matrix.platform }}/zevm.node" + + - name: Upload native artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.platform }} + path: zig-out/npm/prebuilds/${{ matrix.platform }}/zevm.node + if-no-files-found: error + retention-days: 7 + + publish: + name: Publish npm Packages + needs: + - verify + - native + runs-on: ubuntu-24.04 + timeout-minutes: 20 + environment: npm + permissions: + contents: read + id-token: write + steps: + - name: Checkout release tag + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.PUBLISH_NODE_VERSION }} + + - name: Pin publishing npm + run: npm install --global "npm@${PUBLISH_NPM_VERSION}" + + - name: Install package dependencies + run: npm --prefix npm/zevm ci --ignore-scripts + + - name: Download native artifacts + uses: actions/download-artifact@v4 + with: + path: zig-out/npm/prebuilds + + - name: Verify release payload + run: | + test "$(find zig-out/npm/prebuilds -name zevm.node -type f | wc -l)" -eq 9 + npm --prefix npm/zevm run verify:release -- "$GITHUB_REF_NAME" + npm --prefix npm/zevm run build + + - name: Publish platform packages and main package + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + if [ -n "${NPM_TOKEN:-}" ]; then + npm config set //registry.npmjs.org/:_authToken "$NPM_TOKEN" + fi + npm --prefix npm/zevm run publish:all diff --git a/.gitignore b/.gitignore index 242be00..7883224 100644 --- a/.gitignore +++ b/.gitignore @@ -94,6 +94,8 @@ _ .direnv *.node +/npm/zevm/LICENSE +/npm/platforms/*/LICENSE ./debug/ **/*.pdb diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..85e5027 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +22.22.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6ac437..16a19bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,17 +5,18 @@ ZEVM uses docs-first changes and pinned Zig package-manager dependencies. ## Prerequisites - Zig `0.15.2` -- Rust/Cargo -- Node `22` or newer for npm package checks -- Bun for Hive and release audit tooling +- Rust/Cargo `1.89.0` (pinned by `rust-toolchain.toml`) +- Node `22.22.0` or newer for npm package checks (pinned by `.node-version`) +- Bun `1.3.14` for Hive and release audit tooling - `jj` for local version-control work in this repository ## Setup ```bash +git submodule update --init --depth 1 lib/execution-apis zig build --fetch zig build dependency-preflight -- --zig-version 0.15.2 -npm --prefix npm/zevm install --ignore-scripts +npm --prefix npm/zevm ci --ignore-scripts zig build ``` @@ -51,6 +52,15 @@ zig build npm-platform-artifacts -Doptimize=ReleaseSafe The C ABI contract lives in `include/zevm.h`. The TypeScript package in `npm/zevm` must call ZEVM through that header and the N-API addon in `npm/zevm/native`. +## Publishing + +Do not publish from a workstation. Update the matching versions in +`build.zig.zon`, `src/c_bindings.zig`, `npm/zevm/package.json`, its lockfile, and +every supported `npm/platforms/*/package.json`. After the release commit reaches +`main`, publish a GitHub Release tagged `v`. The release +workflow verifies the tag and versions, reruns the build and tests, builds all +native packages, and publishes to npm with provenance. + ## Docs-First Rule Behavior changes that affect startup, runtime modes, JSON-RPC behavior, release metadata, C ABI, or npm distribution need docs/spec updates in the same change. Start with: diff --git a/README.md b/README.md index 965f090..13408a9 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,27 @@ Forking is trusted-mode configuration, not a separate runtime mode. ## Installation -ZEVM builds from pinned Zig package-manager dependencies. Requires Zig `0.15.2` or newer plus Rust/Cargo for Voltaire's Rust crypto archive. +Install the prerelease TypeScript bindings and native addon from npm: + +```bash +npm install @evmts/zevm@beta +``` + +`@evmts/zevm` is published from this repository together with optional native +packages for macOS, Linux (glibc and musl), and Windows. The Zig package is also +consumable directly from a pinned Git commit, but npm is the supported +distribution target for Node.js consumers. + +ZEVM builds from pinned Zig package-manager dependencies. The supported source +toolchain is Zig `0.15.2`, Rust `1.89.0`, and Node.js `22.22.0` or newer. Release +publishing uses Node.js `24.11.1` with npm `11.6.2` for npm trusted publishing. ### Build From Source ```bash -git clone git@github.com:evmts/zevm.git +git clone https://github.com/evmts/zevm.git cd zevm +git submodule update --init --depth 1 lib/execution-apis zig build --fetch zig build dependency-preflight -- --zig-version 0.15.2 zig build @@ -23,6 +37,12 @@ zig build The binary is installed to `./zig-out/bin/zevm`. +Run the complete local unit suite: + +```bash +zig build test +``` + Release-style artifacts for the selected target: ```bash @@ -37,6 +57,8 @@ For pinned release tuples, mode-specific startup, and runtime configuration, sta ## Documentation +Published documentation lives at [zevm.tevm.sh](https://zevm.tevm.sh). + The public docs are authored under [docs/](./docs/), with Astro/Starlight site sources mirrored under [docs/src/content/docs/](./docs/src/content/docs/). Canonical contract sources: @@ -49,7 +71,7 @@ If implementation, tests, or public docs diverge from those specs, treat the mis ## Contributing ```bash -npm --prefix npm/zevm install --ignore-scripts +npm --prefix npm/zevm ci --ignore-scripts zig build test zig build verify-fast zig build c-smoke @@ -60,3 +82,12 @@ npm --prefix npm/zevm run typecheck Behavior changes are docs-first: update `docs/specs/prd.md` and `docs/specs/json-rpc-contract.md` before landing code that changes startup, runtime modes, JSON-RPC behavior, release metadata, the C ABI, or npm distribution. The full process is in [docs/specs/docs-first-process.md](./docs/specs/docs-first-process.md). See [CONTRIBUTING.md](./CONTRIBUTING.md) for the local workflow, release gates, C ABI, and npm package notes. + +## Release policy + +The first real release is `0.1.0-beta.1`: the public API and native ABI are +usable, while the client is still pre-1.0 and its cross-platform packaging needs +consumer feedback. A GitHub Release whose tag exactly matches +`v` runs the full build and tests, builds every supported native +package, and publishes the platform packages before `@evmts/zevm` with npm +provenance. Maintainers must not run `npm publish` locally. diff --git a/build.zig b/build.zig index 26ea24b..9b58e93 100644 --- a/build.zig +++ b/build.zig @@ -275,8 +275,8 @@ pub fn build(b: *std.Build) void { const npm_native_path = b.getInstallPath(.{ .custom = "npm/native" }, "zevm.node"); const npm_smoke_cmd = b.addSystemCommand(&.{ "node", "npm/zevm/scripts/smoke.cjs", npm_native_path }); + npm_smoke_cmd.step.dependOn(&npm_native.step); const npm_smoke_step = b.step("npm-smoke", "Run a Node-API addon smoke test"); - npm_smoke_step.dependOn(&npm_native.step); npm_smoke_step.dependOn(&npm_smoke_cmd.step); const release_name = releaseTargetName(b, target); diff --git a/build.zig.zon b/build.zig.zon index e4b6c8b..c686566 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -9,7 +9,7 @@ .name = .zevm, // This is a [Semantic Version](https://semver.org/). // In a future version of Zig it will be used for package deduplication. - .version = "0.0.0", + .version = "0.1.0-beta.1", // Together with name, this represents a globally unique package // identifier. This field is generated by the Zig toolchain when the // package is first created, and then *never changes*. This allows diff --git a/lib/hive b/lib/hive index 0baff34..c37a9a2 160000 --- a/lib/hive +++ b/lib/hive @@ -1 +1 @@ -Subproject commit 0baff3468ee42bb24180f35259f1a7cce0def16f +Subproject commit c37a9a26873ea74a084d59f035d57cb1fe20a0eb diff --git a/npm/platforms/darwin-arm64/package.json b/npm/platforms/darwin-arm64/package.json index efd9c7c..0f6c447 100644 --- a/npm/platforms/darwin-arm64/package.json +++ b/npm/platforms/darwin-arm64/package.json @@ -1,13 +1,21 @@ { "name": "@evmts/zevm-darwin-arm64", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for macOS arm64.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/darwin-arm64" + }, "os": ["darwin"], "cpu": ["arm64"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/darwin-x64/package.json b/npm/platforms/darwin-x64/package.json index e4c5280..0ffa3e9 100644 --- a/npm/platforms/darwin-x64/package.json +++ b/npm/platforms/darwin-x64/package.json @@ -1,13 +1,21 @@ { "name": "@evmts/zevm-darwin-x64", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for macOS x64.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/darwin-x64" + }, "os": ["darwin"], "cpu": ["x64"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/freebsd-arm64/README.md b/npm/platforms/freebsd-arm64/README.md deleted file mode 100644 index 580d0b0..0000000 --- a/npm/platforms/freebsd-arm64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @evmts/zevm-freebsd-arm64 - -Native Node-API addon for `@evmts/zevm` on FreeBSD arm64. diff --git a/npm/platforms/freebsd-arm64/package.json b/npm/platforms/freebsd-arm64/package.json deleted file mode 100644 index fbab2b1..0000000 --- a/npm/platforms/freebsd-arm64/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@evmts/zevm-freebsd-arm64", - "version": "0.0.0", - "description": "ZEVM native Node-API addon for FreeBSD arm64.", - "license": "MIT", - "os": ["freebsd"], - "cpu": ["arm64"], - "main": "./zevm.node", - "files": ["zevm.node", "README.md"], - "publishConfig": { - "access": "public" - } -} diff --git a/npm/platforms/freebsd-x64/README.md b/npm/platforms/freebsd-x64/README.md deleted file mode 100644 index 53425a6..0000000 --- a/npm/platforms/freebsd-x64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @evmts/zevm-freebsd-x64 - -Native Node-API addon for `@evmts/zevm` on FreeBSD x64. diff --git a/npm/platforms/freebsd-x64/package.json b/npm/platforms/freebsd-x64/package.json deleted file mode 100644 index d2be22e..0000000 --- a/npm/platforms/freebsd-x64/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@evmts/zevm-freebsd-x64", - "version": "0.0.0", - "description": "ZEVM native Node-API addon for FreeBSD x64.", - "license": "MIT", - "os": ["freebsd"], - "cpu": ["x64"], - "main": "./zevm.node", - "files": ["zevm.node", "README.md"], - "publishConfig": { - "access": "public" - } -} diff --git a/npm/platforms/linux-arm64-gnu/package.json b/npm/platforms/linux-arm64-gnu/package.json index 4558e6f..0687d62 100644 --- a/npm/platforms/linux-arm64-gnu/package.json +++ b/npm/platforms/linux-arm64-gnu/package.json @@ -1,14 +1,22 @@ { "name": "@evmts/zevm-linux-arm64-gnu", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Linux arm64 glibc.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/linux-arm64-gnu" + }, "os": ["linux"], "cpu": ["arm64"], "libc": ["glibc"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/linux-arm64-musl/package.json b/npm/platforms/linux-arm64-musl/package.json index c03b73d..1460a51 100644 --- a/npm/platforms/linux-arm64-musl/package.json +++ b/npm/platforms/linux-arm64-musl/package.json @@ -1,14 +1,22 @@ { "name": "@evmts/zevm-linux-arm64-musl", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Linux arm64 musl.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/linux-arm64-musl" + }, "os": ["linux"], "cpu": ["arm64"], "libc": ["musl"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/linux-x64-gnu/package.json b/npm/platforms/linux-x64-gnu/package.json index 8499c5b..0d10707 100644 --- a/npm/platforms/linux-x64-gnu/package.json +++ b/npm/platforms/linux-x64-gnu/package.json @@ -1,14 +1,22 @@ { "name": "@evmts/zevm-linux-x64-gnu", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Linux x64 glibc.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/linux-x64-gnu" + }, "os": ["linux"], "cpu": ["x64"], "libc": ["glibc"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/linux-x64-musl/package.json b/npm/platforms/linux-x64-musl/package.json index 6f8e950..e08d348 100644 --- a/npm/platforms/linux-x64-musl/package.json +++ b/npm/platforms/linux-x64-musl/package.json @@ -1,14 +1,22 @@ { "name": "@evmts/zevm-linux-x64-musl", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Linux x64 musl.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/linux-x64-musl" + }, "os": ["linux"], "cpu": ["x64"], "libc": ["musl"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/win32-arm64-msvc/package.json b/npm/platforms/win32-arm64-msvc/package.json index 6338b2d..9056fc3 100644 --- a/npm/platforms/win32-arm64-msvc/package.json +++ b/npm/platforms/win32-arm64-msvc/package.json @@ -1,13 +1,21 @@ { "name": "@evmts/zevm-win32-arm64-msvc", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Windows arm64 MSVC.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/win32-arm64-msvc" + }, "os": ["win32"], "cpu": ["arm64"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/win32-ia32-msvc/package.json b/npm/platforms/win32-ia32-msvc/package.json index 1202773..44915bb 100644 --- a/npm/platforms/win32-ia32-msvc/package.json +++ b/npm/platforms/win32-ia32-msvc/package.json @@ -1,13 +1,21 @@ { "name": "@evmts/zevm-win32-ia32-msvc", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Windows ia32 MSVC.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/win32-ia32-msvc" + }, "os": ["win32"], "cpu": ["ia32"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/platforms/win32-x64-msvc/package.json b/npm/platforms/win32-x64-msvc/package.json index 74bb98e..d46dfaa 100644 --- a/npm/platforms/win32-x64-msvc/package.json +++ b/npm/platforms/win32-x64-msvc/package.json @@ -1,13 +1,21 @@ { "name": "@evmts/zevm-win32-x64-msvc", - "version": "0.0.0", + "version": "0.1.0-beta.1", "description": "ZEVM native Node-API addon for Windows x64 MSVC.", "license": "MIT", + "homepage": "https://zevm.tevm.sh", + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/platforms/win32-x64-msvc" + }, "os": ["win32"], "cpu": ["x64"], "main": "./zevm.node", - "files": ["zevm.node", "README.md"], + "files": ["zevm.node", "LICENSE", "README.md"], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" } } diff --git a/npm/zevm/README.md b/npm/zevm/README.md index e2d4804..533b0b3 100644 --- a/npm/zevm/README.md +++ b/npm/zevm/README.md @@ -1,14 +1,71 @@ # @evmts/zevm -TypeScript bindings for ZEVM's C ABI. +TypeScript bindings and a native Node.js addon for ZEVM's light-client C ABI. -Native addons are distributed as optional platform packages. Local development builds can be produced from the repository root: +## Install + +`0.1.0-beta.1` is a prerelease while ZEVM's pre-1.0 API and native packaging +receive production feedback: + +```bash +npm install @evmts/zevm@beta +``` + +The install selects an optional native package for macOS (arm64/x64), Linux +(arm64/x64, glibc/musl), or Windows (arm64/ia32/x64). Node.js 22 or newer is +required. + +## Use + +```ts +import { + LightClient, + ZEVM_NETWORK_MAINNET, + ZEVM_STATUS_SYNCED, +} from "@evmts/zevm"; + +const client = new LightClient( + ZEVM_NETWORK_MAINNET, + "https://your-beacon-api.example", + "https://your-execution-rpc.example", +); + +try { + while (client.status() !== ZEVM_STATUS_SYNCED) { + client.syncStep(); + } + + const balance = client.getBalance( + "0x0000000000000000000000000000000000000000", + ); + console.log(balance); +} finally { + client.close(); +} +``` + +Calls on one `LightClient` instance must be serialized by the caller. Block +number `0` means the latest verified head. ZEVM does not retain arbitrary +historical state, so a non-zero block is available only when it matches the +current optimistic or finalized header. + +The root native binding is ESM. Compatibility subpaths such as +`@evmts/zevm/evm`, `@evmts/zevm/rlp`, and `@evmts/zevm/trie` expose both ESM and +CommonJS builds. + +## Develop + +Local development builds can be produced from the repository root: ```bash -npm --prefix npm/zevm install --ignore-scripts +npm --prefix npm/zevm ci --ignore-scripts zig build npm-native npm --prefix npm/zevm run typecheck node npm/zevm/scripts/smoke.cjs zig-out/npm/native/zevm.node ``` -The package exposes a light-client wrapper around the public `include/zevm.h` API. Calls on one `LightClient` instance must be serialized by the caller. Set `ZEVM_NATIVE_PATH=/absolute/path/to/zevm.node` to load a locally built addon instead of an optional platform package. +Set `ZEVM_NATIVE_PATH=/absolute/path/to/zevm.node` to load a locally built addon +instead of an optional platform package. + +See the [ZEVM documentation](https://zevm.tevm.sh) and +[source repository](https://github.com/evmts/zevm). diff --git a/npm/zevm/package-lock.json b/npm/zevm/package-lock.json index 807cdb1..80169e0 100644 --- a/npm/zevm/package-lock.json +++ b/npm/zevm/package-lock.json @@ -1,12 +1,12 @@ { "name": "@evmts/zevm", - "version": "0.0.0", + "version": "0.1.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@evmts/zevm", - "version": "0.0.0", + "version": "0.1.0-beta.1", "license": "MIT", "dependencies": { "@ethereumjs/common": "^10.1.1", @@ -18,21 +18,22 @@ }, "devDependencies": { "@types/debug": "^4.1.13", - "@types/node": "^22.15.0", - "typescript": "^5.9.0" + "@types/node": "^25.9.1", + "typescript": "^6.0.3" + }, + "engines": { + "node": ">=22" }, "optionalDependencies": { - "@evmts/zevm-darwin-arm64": "0.0.0", - "@evmts/zevm-darwin-x64": "0.0.0", - "@evmts/zevm-freebsd-arm64": "0.0.0", - "@evmts/zevm-freebsd-x64": "0.0.0", - "@evmts/zevm-linux-arm64-gnu": "0.0.0", - "@evmts/zevm-linux-arm64-musl": "0.0.0", - "@evmts/zevm-linux-x64-gnu": "0.0.0", - "@evmts/zevm-linux-x64-musl": "0.0.0", - "@evmts/zevm-win32-arm64-msvc": "0.0.0", - "@evmts/zevm-win32-ia32-msvc": "0.0.0", - "@evmts/zevm-win32-x64-msvc": "0.0.0" + "@evmts/zevm-darwin-arm64": "0.1.0-beta.1", + "@evmts/zevm-darwin-x64": "0.1.0-beta.1", + "@evmts/zevm-linux-arm64-gnu": "0.1.0-beta.1", + "@evmts/zevm-linux-arm64-musl": "0.1.0-beta.1", + "@evmts/zevm-linux-x64-gnu": "0.1.0-beta.1", + "@evmts/zevm-linux-x64-musl": "0.1.0-beta.1", + "@evmts/zevm-win32-arm64-msvc": "0.1.0-beta.1", + "@evmts/zevm-win32-ia32-msvc": "0.1.0-beta.1", + "@evmts/zevm-win32-x64-msvc": "0.1.0-beta.1" } }, "node_modules/@ethereumjs/binarytree": { @@ -213,12 +214,6 @@ "node_modules/@evmts/zevm-darwin-x64": { "optional": true }, - "node_modules/@evmts/zevm-freebsd-arm64": { - "optional": true - }, - "node_modules/@evmts/zevm-freebsd-x64": { - "optional": true - }, "node_modules/@evmts/zevm-linux-arm64-gnu": { "optional": true }, @@ -367,12 +362,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.19.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", - "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "version": "25.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/readable-stream": { @@ -515,9 +510,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -529,9 +524,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, "node_modules/util-deprecate": { diff --git a/npm/zevm/package.json b/npm/zevm/package.json index 850e28a..7306152 100644 --- a/npm/zevm/package.json +++ b/npm/zevm/package.json @@ -1,8 +1,28 @@ { "name": "@evmts/zevm", - "version": "0.0.0", - "description": "TypeScript bindings for the ZEVM light-client C ABI.", + "version": "0.1.0-beta.1", + "description": "TypeScript bindings and native Node.js addon for the ZEVM Ethereum client.", "license": "MIT", + "author": "evmts", + "homepage": "https://zevm.tevm.sh", + "bugs": { + "url": "https://github.com/evmts/zevm/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/evmts/zevm.git", + "directory": "npm/zevm" + }, + "keywords": [ + "ethereum", + "evm", + "light-client", + "node-api", + "zig" + ], + "engines": { + "node": ">=22" + }, "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -71,10 +91,13 @@ "files": [ "dist", "native/zevm.node", + "LICENSE", "README.md" ], "publishConfig": { - "access": "public" + "access": "public", + "provenance": true, + "registry": "https://registry.npmjs.org" }, "scripts": { "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && node scripts/move-cjs.cjs", @@ -82,7 +105,8 @@ "publish:all:dry": "node scripts/publish-all.cjs --dry-run", "stage:artifacts": "node scripts/stage-artifacts.cjs", "typecheck": "tsc -p tsconfig.json --noEmit", - "smoke:native": "node scripts/smoke.cjs ../../zig-out/npm/native/zevm.node" + "smoke:native": "node scripts/smoke.cjs ../../zig-out/npm/native/zevm.node", + "verify:release": "node scripts/verify-release.cjs" }, "dependencies": { "@ethereumjs/common": "^10.1.1", @@ -93,17 +117,15 @@ "@noble/hashes": "^2.2.0" }, "optionalDependencies": { - "@evmts/zevm-darwin-arm64": "0.0.0", - "@evmts/zevm-darwin-x64": "0.0.0", - "@evmts/zevm-freebsd-arm64": "0.0.0", - "@evmts/zevm-freebsd-x64": "0.0.0", - "@evmts/zevm-linux-arm64-gnu": "0.0.0", - "@evmts/zevm-linux-arm64-musl": "0.0.0", - "@evmts/zevm-linux-x64-gnu": "0.0.0", - "@evmts/zevm-linux-x64-musl": "0.0.0", - "@evmts/zevm-win32-arm64-msvc": "0.0.0", - "@evmts/zevm-win32-ia32-msvc": "0.0.0", - "@evmts/zevm-win32-x64-msvc": "0.0.0" + "@evmts/zevm-darwin-arm64": "0.1.0-beta.1", + "@evmts/zevm-darwin-x64": "0.1.0-beta.1", + "@evmts/zevm-linux-arm64-gnu": "0.1.0-beta.1", + "@evmts/zevm-linux-arm64-musl": "0.1.0-beta.1", + "@evmts/zevm-linux-x64-gnu": "0.1.0-beta.1", + "@evmts/zevm-linux-x64-musl": "0.1.0-beta.1", + "@evmts/zevm-win32-arm64-msvc": "0.1.0-beta.1", + "@evmts/zevm-win32-ia32-msvc": "0.1.0-beta.1", + "@evmts/zevm-win32-x64-msvc": "0.1.0-beta.1" }, "devDependencies": { "@types/debug": "^4.1.13", diff --git a/npm/zevm/scripts/publish-all.cjs b/npm/zevm/scripts/publish-all.cjs index 3cb4626..dc04480 100644 --- a/npm/zevm/scripts/publish-all.cjs +++ b/npm/zevm/scripts/publish-all.cjs @@ -26,9 +26,18 @@ function readPackageName(packageDir) { return packageJson.name; } +function readPackage(packageDir) { + return JSON.parse(fs.readFileSync(path.resolve(packageDir, "package.json"), "utf8")); +} + +if (!dryRun && process.env.GITHUB_ACTIONS !== "true") { + throw new Error("publishing is only allowed from GitHub Actions; use publish:all:dry locally"); +} + run(process.execPath, [path.resolve(scriptDir, "stage-artifacts.cjs")], repoRoot); const packageDirs = []; +const mainPackage = readPackage(packageRoot); for (const entry of fs.readdirSync(platformsRoot, { withFileTypes: true })) { if (!entry.isDirectory()) continue; const packageDir = path.resolve(platformsRoot, entry.name); @@ -38,16 +47,31 @@ for (const entry of fs.readdirSync(platformsRoot, { withFileTypes: true })) { continue; } const nativeAddon = path.resolve(packageDir, "zevm.node"); - if (fs.existsSync(nativeAddon)) { - packageDirs.push(packageDir); - } else { - console.warn(`skip ${readPackageName(packageDir)}; no zevm.node staged`); + if (!fs.existsSync(nativeAddon)) { + throw new Error(`missing staged native addon for ${readPackageName(packageDir)}`); + } + const platformPackage = readPackage(packageDir); + if (platformPackage.version !== mainPackage.version) { + throw new Error( + `version mismatch: ${platformPackage.name}@${platformPackage.version} != ${mainPackage.name}@${mainPackage.version}`, + ); } + packageDirs.push(packageDir); } packageDirs.push(packageRoot); +const prerelease = mainPackage.version.split("-", 2)[1]; +const distTag = prerelease ? prerelease.split(".", 1)[0] : "latest"; + for (const packageDir of packageDirs) { - const args = ["publish", "--access", "public"]; + const args = [ + "publish", + "--access", + "public", + "--provenance", + "--tag", + distTag, + ]; if (dryRun) args.push("--dry-run"); console.log(`\n> npm ${args.join(" ")} (${path.relative(repoRoot, packageDir)})`); run("npm", args, packageDir); diff --git a/npm/zevm/scripts/stage-artifacts.cjs b/npm/zevm/scripts/stage-artifacts.cjs index ed6fb1e..0e51e1f 100644 --- a/npm/zevm/scripts/stage-artifacts.cjs +++ b/npm/zevm/scripts/stage-artifacts.cjs @@ -8,13 +8,12 @@ const packageRoot = path.resolve(scriptDir, ".."); const repoRoot = path.resolve(packageRoot, "../.."); const platformsRoot = path.resolve(packageRoot, "../platforms"); const zigOutNpm = path.resolve(repoRoot, "zig-out/npm"); +const rootLicense = path.resolve(repoRoot, "LICENSE"); const includeLocalNative = process.argv.includes("--include-local-native"); const platformPackages = new Map([ ["darwin-arm64", "@evmts/zevm-darwin-arm64"], ["darwin-x64", "@evmts/zevm-darwin-x64"], - ["freebsd-arm64", "@evmts/zevm-freebsd-arm64"], - ["freebsd-x64", "@evmts/zevm-freebsd-x64"], ["linux-arm64-gnu", "@evmts/zevm-linux-arm64-gnu"], ["linux-arm64-musl", "@evmts/zevm-linux-arm64-musl"], ["linux-x64-gnu", "@evmts/zevm-linux-x64-gnu"], @@ -33,6 +32,11 @@ function copyIfPresent(source, destination) { return true; } +if (!fs.existsSync(rootLicense)) { + throw new Error(`missing repository license: ${rootLicense}`); +} +fs.copyFileSync(rootLicense, path.resolve(packageRoot, "LICENSE")); + const localNativeDestination = path.resolve(packageRoot, "native/zevm.node"); if (includeLocalNative) { const localNativeSource = path.resolve(zigOutNpm, "native/zevm.node"); @@ -46,6 +50,10 @@ if (includeLocalNative) { } for (const [platformName, packageName] of platformPackages) { + fs.copyFileSync( + rootLicense, + path.resolve(platformsRoot, platformName, "LICENSE"), + ); const source = path.resolve(zigOutNpm, "prebuilds", platformName, "zevm.node"); const destination = path.resolve(platformsRoot, platformName, "zevm.node"); if (copyIfPresent(source, destination)) { diff --git a/npm/zevm/scripts/verify-release.cjs b/npm/zevm/scripts/verify-release.cjs new file mode 100644 index 0000000..aade18b --- /dev/null +++ b/npm/zevm/scripts/verify-release.cjs @@ -0,0 +1,76 @@ +"use strict"; + +const fs = require("node:fs"); +const path = require("node:path"); + +const scriptDir = __dirname; +const packageRoot = path.resolve(scriptDir, ".."); +const repoRoot = path.resolve(packageRoot, "../.."); +const platformsRoot = path.resolve(packageRoot, "../platforms"); + +function readJson(file) { + return JSON.parse(fs.readFileSync(file, "utf8")); +} + +function invariant(condition, message) { + if (!condition) throw new Error(message); +} + +const mainPackage = readJson(path.resolve(packageRoot, "package.json")); +const version = mainPackage.version; +const expectedTag = `v${version}`; +const actualTag = process.argv[2] ?? process.env.GITHUB_REF_NAME; + +invariant(version !== "0.0.0", "0.0.0 is not a releasable version"); +invariant( + /^0\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version), + `expected an honest pre-1.0 semantic version, received ${version}`, +); +if (actualTag) { + invariant(actualTag === expectedTag, `release tag ${actualTag} must equal ${expectedTag}`); +} + +const zon = fs.readFileSync(path.resolve(repoRoot, "build.zig.zon"), "utf8"); +const zonVersion = zon.match(/\.version\s*=\s*"([^"]+)"/)?.[1]; +invariant(zonVersion === version, `build.zig.zon version ${zonVersion} != ${version}`); + +const cBindings = fs.readFileSync(path.resolve(repoRoot, "src/c_bindings.zig"), "utf8"); +const nativeVersion = cBindings.match(/ZEVM_VERSION[^=]*=\s*"([^"]+)"/)?.[1]; +invariant(nativeVersion === version, `native ABI version ${nativeVersion} != ${version}`); + +const platformDirs = fs + .readdirSync(platformsRoot, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .filter((entry) => fs.existsSync(path.resolve(platformsRoot, entry, "package.json"))) + .sort(); + +invariant(platformDirs.length > 0, "no native platform packages found"); + +const expectedOptionalDependencies = new Set(); +for (const platform of platformDirs) { + const manifest = readJson(path.resolve(platformsRoot, platform, "package.json")); + expectedOptionalDependencies.add(manifest.name); + invariant(manifest.version === version, `${manifest.name} version must equal ${version}`); + invariant(manifest.publishConfig?.access === "public", `${manifest.name} must publish publicly`); + invariant(manifest.publishConfig?.provenance === true, `${manifest.name} must enable provenance`); + invariant( + mainPackage.optionalDependencies?.[manifest.name] === version, + `${mainPackage.name} must depend on ${manifest.name}@${version}`, + ); +} + +for (const [name, dependencyVersion] of Object.entries( + mainPackage.optionalDependencies ?? {}, +)) { + if (!name.startsWith("@evmts/zevm-")) continue; + invariant(expectedOptionalDependencies.has(name), `unknown native package ${name}`); + invariant(dependencyVersion === version, `${name} dependency must equal ${version}`); +} + +invariant(mainPackage.publishConfig?.access === "public", "main package must publish publicly"); +invariant(mainPackage.publishConfig?.provenance === true, "main package must enable provenance"); + +console.log( + `release metadata ok: ${mainPackage.name}@${version}, tag=${expectedTag}, nativePackages=${platformDirs.length}`, +); diff --git a/npm/zevm/src/index.ts b/npm/zevm/src/index.ts index 9d6d3b2..0fa4354 100644 --- a/npm/zevm/src/index.ts +++ b/npm/zevm/src/index.ts @@ -44,8 +44,6 @@ const require = createRequire(import.meta.url); const platformPackages: Record = { "darwin-arm64": ["@evmts/zevm-darwin-arm64"], "darwin-x64": ["@evmts/zevm-darwin-x64"], - "freebsd-arm64": ["@evmts/zevm-freebsd-arm64"], - "freebsd-x64": ["@evmts/zevm-freebsd-x64"], "linux-arm64-gnu": ["@evmts/zevm-linux-arm64-gnu"], "linux-arm64-musl": ["@evmts/zevm-linux-arm64-musl"], "linux-x64-gnu": ["@evmts/zevm-linux-x64-gnu"], diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..c762226 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.89.0" +profile = "minimal" diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..c626920 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,4 @@ +node_modules +dist +.vercel +cache diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..328de12 --- /dev/null +++ b/site/README.md @@ -0,0 +1,31 @@ +# ZEVM documentation site + +The published documentation at [zevm.tevm.sh](https://zevm.tevm.sh), built with +[vocs](https://vocs.dev) 2. + +```bash +npm install +npm run dev # local preview on http://localhost:5173 +npm run build # production build +``` + +## Layout + +- `vocs.config.ts` — site config: title, `baseUrl`, top nav, sidebar. +- `src/pages/**` — page sources (`.mdx`). The route is the path under `src/pages` + minus the extension, so `src/pages/reference/cli.mdx` serves `/reference/cli`. +- Cross-page links are absolute routes (`/reference/cli`), not relative file paths. + +## Relationship to `docs/` + +`docs/specs/**` remains the canonical contract source (PRD and JSON-RPC contract). +`src/pages/**` is the published public documentation. Behaviour changes are +docs-first: update the specs under `docs/specs/` before landing code, then reflect +the change here. See `docs/specs/docs-first-process.md`. + +## Deployment + +Vercel, with the project's **Root Directory** set to `site`. vocs auto-selects its +Vercel adapter when the `VERCEL` environment variable is present and writes the +Build Output API tree to `.vercel/output`, so no output directory needs to be +configured. diff --git a/site/package-lock.json b/site/package-lock.json new file mode 100644 index 0000000..2b5304e --- /dev/null +++ b/site/package-lock.json @@ -0,0 +1,11950 @@ +{ + "name": "@zevm/docs-site", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@zevm/docs-site", + "devDependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0", + "vite": "^8.1.5", + "vocs": "2.7.2", + "waku": "^1.0.0-beta.8" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base-ui/react": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.6.0.tgz", + "integrity": "sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@base-ui/utils": "0.3.1", + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@date-fns/tz": "^1.2.0", + "@types/react": "^17 || ^18 || ^19", + "date-fns": "^4.0.0", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@date-fns/tz": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "date-fns": { + "optional": true + } + } + }, + "node_modules/@base-ui/utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.1.tgz", + "integrity": "sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@floating-ui/utils": "^0.2.11", + "reselect": "^5.2.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", + "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-yaml": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.3.tgz", + "integrity": "sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.0.0", + "@lezer/yaml": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.7", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.7.tgz", + "integrity": "sha512-FZsExxkoxnAN+d9TgqXLg5g4A1oQwzX9WlkOT5i2PKkcW7xx3Bmu0vs90g6fo9Mpdsb/l96dnAraQ8932aO4/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@codesandbox/nodebox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz", + "integrity": "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==", + "dev": true, + "license": "SEE LICENSE IN ./LICENSE", + "dependencies": { + "outvariant": "^1.4.0", + "strict-event-emitter": "^0.4.3" + } + }, + "node_modules/@codesandbox/sandpack-client": { + "version": "2.19.8", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.19.8.tgz", + "integrity": "sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@codesandbox/nodebox": "0.1.8", + "buffer": "^6.0.3", + "dequal": "^2.0.2", + "mime-db": "^1.52.0", + "outvariant": "1.4.0", + "static-browser-server": "1.0.3" + } + }, + "node_modules/@codesandbox/sandpack-react": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-react/-/sandpack-react-2.20.0.tgz", + "integrity": "sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@codemirror/autocomplete": "^6.4.0", + "@codemirror/commands": "^6.1.3", + "@codemirror/lang-css": "^6.0.1", + "@codemirror/lang-html": "^6.4.0", + "@codemirror/lang-javascript": "^6.1.2", + "@codemirror/language": "^6.3.2", + "@codemirror/state": "^6.2.0", + "@codemirror/view": "^6.7.1", + "@codesandbox/sandpack-client": "^2.19.8", + "@lezer/highlight": "^1.1.3", + "@react-hook/intersection-observer": "^3.1.1", + "@stitches/core": "^1.2.6", + "anser": "^2.1.1", + "clean-set": "^1.1.2", + "dequal": "^2.0.2", + "escape-carriage": "^1.3.1", + "lz-string": "^1.4.4", + "react-devtools-inline": "4.4.0", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19", + "react-dom": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@emnapi/core": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", + "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "2.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", + "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", + "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.9.tgz", + "integrity": "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4", + "@floating-ui/utils": "^0.2.10", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@headlessui/tailwindcss": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.2.2.tgz", + "integrity": "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "tailwindcss": "^3.0 || ^4.0" + } + }, + "node_modules/@headlessui/vue": { + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", + "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/vue-virtual": "^3.0.0-beta.60" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@hono/node-server": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.0.12.tgz", + "integrity": "sha512-eWpQYr67tqJLeaSUl0Q+TquuYfUdTibpOJlUMV2FfUP7+KqCC5TufnwnlXL6mobZBJbGAYRd7ZvEBDCbLInjhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@iconify-json/lucide": { + "version": "1.2.120", + "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.120.tgz", + "integrity": "sha512-4ECF24fxag1n5tZlPGrbWuCGqhkwD0rvAzfCXretqQb4KEC8Y6ja3khF8qmvpR1Mk0NQDhBTRK3Fr/YoV8QyJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/ri": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.10.tgz", + "integrity": "sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.92", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.92.tgz", + "integrity": "sha512-hR0ozxR97t1dzWw+esoxFijZ15gagt7EIgF3CNifu2yICXhS7gnun4Y+j+odJQtNSl7wvqMdoLbViIShwe/fdw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/vscode-icons": { + "version": "1.2.67", + "resolved": "https://registry.npmjs.org/@iconify-json/vscode-icons/-/vscode-icons-1.2.67.tgz", + "integrity": "sha512-/fObxEkBtqK2e1qf1IRjuZ4drWknAnzykdT2ngGAKESf35tCcj0Lx3MdsxYBneE5YbgvsUfOl0hbZ59R5s19vw==", + "dev": true, + "license": "MIT", + "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/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", + "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.4.tgz", + "integrity": "sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/xml": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", + "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/yaml": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.4.tgz", + "integrity": "sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.4.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", + "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mdx-js/rollup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/rollup/-/rollup-3.1.1.tgz", + "integrity": "sha512-v8satFmBB+DqDzYohnm1u2JOvxx6Hl3pUvqzJvfs2Zk/ngZ1aRUhsWpXvwPkNeGN9c2NCm/38H29ZqXQUjf8dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@rollup/pluginutils": "^5.0.0", + "source-map": "^0.7.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "rollup": ">=2" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9 || ^2.0.5", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.0.tgz", + "integrity": "sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^2.0.0-alpha.3", + "@emnapi/runtime": "^2.0.0-alpha.3" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@phosphor-icons/core": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@phosphor-icons/core/-/core-2.1.1.tgz", + "integrity": "sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@react-hook/intersection-observer": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-hook/intersection-observer/-/intersection-observer-3.1.2.tgz", + "integrity": "sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@react-hook/passive-layout-effect": "^1.2.0", + "intersection-observer": "^0.10.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@remix-run/node-fetch-server": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/@remix-run/node-fetch-server/-/node-fetch-server-0.13.3.tgz", + "integrity": "sha512-UfjOXed/DQteaM5VyTfqTeGpHwyL2J5aoRGY6cydip4tt1ehNNeSwuXCC7AEGE0RWBs/7bgKxYkL/B/+UDe4AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@replit/codemirror-css-color-picker": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@replit/codemirror-css-color-picker/-/codemirror-css-color-picker-6.3.0.tgz", + "integrity": "sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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" + ], + "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.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" + ], + "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/@rollup/rollup-android-arm-eabi": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@scalar/api-client": { + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/@scalar/api-client/-/api-client-3.13.7.tgz", + "integrity": "sha512-bd+2nI27gnfCgzCGEP13u7rd2IlNdAB+Rx+CX0i29UXEu6SVxWpv5hBVrLLTQebfNzcUk9Evr+NkIX/WjSHp0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@headlessui/tailwindcss": "^0.2.2", + "@headlessui/vue": "1.7.23", + "@scalar/blocks": "0.1.8", + "@scalar/components": "0.27.9", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/oas-utils": "0.19.8", + "@scalar/openapi-types": "0.9.3", + "@scalar/sidebar": "0.9.33", + "@scalar/snippetz": "0.9.23", + "@scalar/themes": "0.17.1", + "@scalar/typebox": "^0.1.3", + "@scalar/types": "0.16.4", + "@scalar/use-codemirror": "0.14.14", + "@scalar/use-hooks": "0.4.9", + "@scalar/use-toasts": "0.10.4", + "@scalar/workspace-store": "0.55.6", + "@vueuse/core": "13.9.0", + "@vueuse/integrations": "13.9.0", + "focus-trap": "^7.8.0", + "fuse.js": "^7.1.0", + "js-base64": "^3.7.8", + "jsonc-parser": "3.3.1", + "nanoid": "^5.1.6", + "pretty-ms": "^9.3.0", + "radix-vue": "^1.9.17", + "set-cookie-parser": "3.1.0", + "vue": "^3.5.30", + "yaml": "^2.8.3", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/api-client/node_modules/@scalar/schemas": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.7.4.tgz", + "integrity": "sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/validation": "0.6.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/api-client/node_modules/@scalar/workspace-store": { + "version": "0.55.6", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.55.6.tgz", + "integrity": "sha512-l7yuW1XplVRu+bqN7Mt+XtMovuKRBOHSGb00e+nEvjkkL1WIFd6pMJCogYt0ZlLvyLFPbWODWA4oG6LZjr7ijQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/asyncapi-upgrader": "0.1.4", + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-upgrader": "0.2.11", + "@scalar/schemas": "0.7.4", + "@scalar/snippetz": "0.9.23", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.16.4", + "@scalar/validation": "0.6.2", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/asyncapi-upgrader": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@scalar/asyncapi-upgrader/-/asyncapi-upgrader-0.1.4.tgz", + "integrity": "sha512-pyAoyuFVlUf+ZThiuHAShV4lyF9LlPab5AJrvoER8JBz00bHF1NWiGveYySRcNcvke5U5nWCr7NxtiMIokP8sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/blocks": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@scalar/blocks/-/blocks-0.1.8.tgz", + "integrity": "sha512-I0bOMnb8+8cjboaRMWz4Vo16rcYu8+4tzLIpPeJHsJs4I5OaIIgaoNHRPaWDip9ZrqbD4m1I2gMDJmpJU/hEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/components": "0.27.9", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/snippetz": "0.9.23", + "@scalar/themes": "0.17.1", + "@scalar/types": "0.16.4", + "@scalar/workspace-store": "0.55.6", + "@types/har-format": "^1.2.16", + "js-base64": "^3.7.8", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/blocks/node_modules/@scalar/schemas": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.7.4.tgz", + "integrity": "sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/validation": "0.6.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/blocks/node_modules/@scalar/workspace-store": { + "version": "0.55.6", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.55.6.tgz", + "integrity": "sha512-l7yuW1XplVRu+bqN7Mt+XtMovuKRBOHSGb00e+nEvjkkL1WIFd6pMJCogYt0ZlLvyLFPbWODWA4oG6LZjr7ijQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/asyncapi-upgrader": "0.1.4", + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-upgrader": "0.2.11", + "@scalar/schemas": "0.7.4", + "@scalar/snippetz": "0.9.23", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.16.4", + "@scalar/validation": "0.6.2", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/code-highlight": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@scalar/code-highlight/-/code-highlight-0.4.3.tgz", + "integrity": "sha512-uueW22siajrJUtszH+k/PmABqau2MmJzajpEFTPapK7Zak167xcKUIjcMbFFFgW8SGKLMSVzLkuB/VNDbOHuOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hast-util-to-text": "^4.0.2", + "highlight.js": "^11.11.1", + "lowlight": "^3.3.0", + "rehype-external-links": "^3.0.0", + "rehype-format": "^5.0.1", + "rehype-parse": "^9.0.1", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/components": { + "version": "0.27.9", + "resolved": "https://registry.npmjs.org/@scalar/components/-/components-0.27.9.tgz", + "integrity": "sha512-AoUTHwTfVc44zZbZnridPd7mp8lhe2LgX9KeyKw5keFlhLY1MzQv9OuXD7riLbJPrFFF/7lbqCLEpyG6vWSXQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "0.2.10", + "@floating-ui/vue": "1.1.9", + "@headlessui/tailwindcss": "^0.2.2", + "@headlessui/vue": "1.7.23", + "@scalar/code-highlight": "0.4.3", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/themes": "0.17.1", + "@scalar/use-hooks": "0.4.9", + "@vueuse/core": "13.9.0", + "cva": "1.0.0-beta.4", + "radix-vue": "^1.9.17", + "vue": "^3.5.30", + "vue-component-type-helpers": "^3.2.6" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/components/node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scalar/components/node_modules/cva": { + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/cva/-/cva-1.0.0-beta.4.tgz", + "integrity": "sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + }, + "peerDependencies": { + "typescript": ">= 4.5.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@scalar/helpers": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.9.2.tgz", + "integrity": "sha512-hjyMpMZjTBZQhyByZmz5oUgRKUQJO5V5AOiJxsVEGbUmgA7sJRQeTrXLB+BEwzaKS5nm2opJeNyMBYLFNK4hiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/icons": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@scalar/icons/-/icons-0.7.5.tgz", + "integrity": "sha512-kWYkjmYlHzrZ+31d8L1uJpVeil6r1xNcyR+MewnxFslpMBCDIeo9udhYzg09v8s6nWKxwuPokhdQPLbKS+SSgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@phosphor-icons/core": "^2.1.1", + "@types/node": "^24.1.0", + "chalk": "^5.6.2", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/json-magic": { + "version": "0.12.19", + "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.12.19.tgz", + "integrity": "sha512-1T4QoFYZ1nKt25xFeHtghAuZzaLq2X4CpCSLFXG0Fjcz6K2HIZqo+RtywfI0WD8RRRRgS34keo7X4Gv1BQUNoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "pathe": "^2.0.3", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/oas-utils": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@scalar/oas-utils/-/oas-utils-0.19.8.tgz", + "integrity": "sha512-A/bGTqthxnsgoveQ7Xomxtwk0JQ7V/cweaxz/Dhp9/JmvnAnjBjpcG050gcC1EuVkHhJL1sPH2+IczS9liQQ3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/themes": "0.17.1", + "@scalar/types": "0.16.4", + "@scalar/workspace-store": "0.55.6", + "flatted": "^3.4.0", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/oas-utils/node_modules/@scalar/schemas": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.7.4.tgz", + "integrity": "sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/validation": "0.6.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/oas-utils/node_modules/@scalar/workspace-store": { + "version": "0.55.6", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.55.6.tgz", + "integrity": "sha512-l7yuW1XplVRu+bqN7Mt+XtMovuKRBOHSGb00e+nEvjkkL1WIFd6pMJCogYt0ZlLvyLFPbWODWA4oG6LZjr7ijQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/asyncapi-upgrader": "0.1.4", + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-upgrader": "0.2.11", + "@scalar/schemas": "0.7.4", + "@scalar/snippetz": "0.9.23", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.16.4", + "@scalar/validation": "0.6.2", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-parser": { + "version": "0.28.10", + "resolved": "https://registry.npmjs.org/@scalar/openapi-parser/-/openapi-parser-0.28.10.tgz", + "integrity": "sha512-jn3ftvtNTcWOgxf7XVn9CvJGMjFS7QU1b6FiGmibzAlR/6pOP3Ei7sBBnfIY4PBwHjHgMAGBoGApfOV8h75gPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-types": "0.9.3", + "@scalar/openapi-upgrader": "0.2.11", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^3.0.1", + "jsonpointer": "^5.0.1", + "leven": "^4.0.0", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.9.3.tgz", + "integrity": "sha512-34qglt5jSo55iZfH9i7EhjQCdE0Po2xZeh8wytQKolSnXrxsYMSyFDJEBxz1Gaew4on9N3XIWsd0QpwKVA5CSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-upgrader": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.11.tgz", + "integrity": "sha512-eYEFBO8mZfgXEO/hv8rdL5OA4oOB8orFT5kXNK4I/x9xca2D7A4BteuFXqRaw9lE1CIjtG+StlAUYVz5omTXew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/openapi-types": "0.9.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/schemas": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.6.0.tgz", + "integrity": "sha512-Oacaq7RTLhe3vWOoNc8tZufqthetu1VjWkdrGMMYoVSyMBQpvDI48gwBBQO6+iySeNpk9y8NHaGxqhHeoLbDiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.8.2", + "@scalar/validation": "0.6.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/schemas/node_modules/@scalar/helpers": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.8.2.tgz", + "integrity": "sha512-qNbqUjSB3S4Gr4A0oANcm5G1Ip+EqBxICYKhe9YzmnaBpbmW6shxqpiivApTvvuDf+uIhR3uMwWyVQbYcGLsxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/schemas/node_modules/@scalar/validation": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@scalar/validation/-/validation-0.6.0.tgz", + "integrity": "sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/sidebar": { + "version": "0.9.33", + "resolved": "https://registry.npmjs.org/@scalar/sidebar/-/sidebar-0.9.33.tgz", + "integrity": "sha512-y00qMs6dPu4Te+OuyyGSg0hGWTPsnUrn7juErtF4bOIse2w9BM1rHkYZWSdEL/afYv27x1wMBZJwAReiUeHguA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/components": "0.27.9", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/themes": "0.17.1", + "@scalar/use-hooks": "0.4.9", + "@scalar/workspace-store": "0.55.6", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/sidebar/node_modules/@scalar/schemas": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.7.4.tgz", + "integrity": "sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/validation": "0.6.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/sidebar/node_modules/@scalar/workspace-store": { + "version": "0.55.6", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.55.6.tgz", + "integrity": "sha512-l7yuW1XplVRu+bqN7Mt+XtMovuKRBOHSGb00e+nEvjkkL1WIFd6pMJCogYt0ZlLvyLFPbWODWA4oG6LZjr7ijQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/asyncapi-upgrader": "0.1.4", + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-upgrader": "0.2.11", + "@scalar/schemas": "0.7.4", + "@scalar/snippetz": "0.9.23", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.16.4", + "@scalar/validation": "0.6.2", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/snippetz": { + "version": "0.9.23", + "resolved": "https://registry.npmjs.org/@scalar/snippetz/-/snippetz-0.9.23.tgz", + "integrity": "sha512-bjahBX9J7VQsOpDERMPZSPuIKZmz1DEh9NHdCE5dEe6uz1rHicai0Zqjpuduw6DVDVyWrDI0trxPzCqGzpj0oQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/types": "0.16.4", + "js-base64": "^3.7.8", + "stringify-object": "^6.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/themes": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@scalar/themes/-/themes-0.17.1.tgz", + "integrity": "sha512-aqR6o44CpDvgVT6dHlc1/56JRdWUrbNgaLyHKEd1KC/+Gcznix9Ud0fW7cKw2VvNgPgcqlO+MhZIrYHwbkNMew==", + "dev": true, + "license": "MIT", + "dependencies": { + "nanoid": "^5.1.6" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/typebox": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@scalar/typebox/-/typebox-0.1.3.tgz", + "integrity": "sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scalar/types": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.16.4.tgz", + "integrity": "sha512-fLf0ANAC3iQq0sIVdmH6aGM+pFSLyD8GfGBxSWcLpI0jE0iFAzX2A3p0qVZm7vqBT4TQnn0fSwg5U+h+FZ52BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "nanoid": "^5.1.6", + "type-fest": "^5.3.1", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-codemirror": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/@scalar/use-codemirror/-/use-codemirror-0.14.14.tgz", + "integrity": "sha512-A7Exfctudg7d3DeQFSSrZYc6yhrEsLX3Iq6GJ7m7ruqgev9y8Hbx7g8yvZWYRQuMUdFtLH5euP7a1ZwM8OrHKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.18.3", + "@codemirror/commands": "^6.7.1", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.8", + "@codemirror/lang-json": "^6.0.0", + "@codemirror/lang-xml": "^6.0.0", + "@codemirror/lang-yaml": "^6.1.2", + "@codemirror/language": "^6.10.7", + "@codemirror/lint": "^6.8.4", + "@codemirror/state": "^6.5.0", + "@codemirror/view": "^6.35.3", + "@lezer/common": "^1.2.3", + "@lezer/highlight": "^1.2.1", + "@replit/codemirror-css-color-picker": "^6.3.0", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-hooks": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@scalar/use-hooks/-/use-hooks-0.4.9.tgz", + "integrity": "sha512-RnflJ178BPdH7pKY9/YBcRlhyc7uJxtqG4hBbi8IPEM4YkpLHcMmxWKgHAgC3MBc21rpuKKBE+DTJOiYmU+UyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/use-toasts": "0.10.4", + "@scalar/validation": "0.6.2", + "@vueuse/core": "13.9.0", + "cva": "1.0.0-beta.4", + "tailwind-merge": "3.5.0", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-hooks/node_modules/cva": { + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/cva/-/cva-1.0.0-beta.4.tgz", + "integrity": "sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + }, + "peerDependencies": { + "typescript": ">= 4.5.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@scalar/use-toasts": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@scalar/use-toasts/-/use-toasts-0.10.4.tgz", + "integrity": "sha512-OHXkVfFKV0qx2WpKlzUpvIUkoA/PiloBcXe6soX2S/1z/D042QlKO8rNxkuC3Hlamvyvj8ru8XN17XNl+D0OPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.30", + "vue-sonner": "^1.3.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/validation": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@scalar/validation/-/validation-0.6.2.tgz", + "integrity": "sha512-Sc1TkcwGV6aVCO51AyKeaGiP8gpwAHxEtO5d3tZzPV+KsnlC/YokQxFxwBrbIXw73k9hmcExnJyGu3k5i6n6VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/workspace-store": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.54.5.tgz", + "integrity": "sha512-MMaELRxKNwJ1dxbDcFNRwh229jAX5DQhkQpHgDSbr+oAt6AqFf2BTr9Fr/8kbLIJK+L4P2C8rANE8xrnqjKGLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.8.2", + "@scalar/json-magic": "0.12.16", + "@scalar/openapi-upgrader": "0.2.9", + "@scalar/schemas": "0.6.0", + "@scalar/snippetz": "0.9.18", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.15.0", + "@scalar/validation": "0.6.0", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/helpers": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.8.2.tgz", + "integrity": "sha512-qNbqUjSB3S4Gr4A0oANcm5G1Ip+EqBxICYKhe9YzmnaBpbmW6shxqpiivApTvvuDf+uIhR3uMwWyVQbYcGLsxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/json-magic": { + "version": "0.12.16", + "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.12.16.tgz", + "integrity": "sha512-w8cDbZhHCzmIblWx92IVWoAXsbI4Fz3m++jiBANTSO1hgphF6UqEPQiCt3wnMPaxaanjMQxjS/iBk1UGXR2EGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.8.2", + "pathe": "^2.0.3", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/openapi-types": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.9.1.tgz", + "integrity": "sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/openapi-upgrader": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.9.tgz", + "integrity": "sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/openapi-types": "0.9.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/snippetz": { + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/@scalar/snippetz/-/snippetz-0.9.18.tgz", + "integrity": "sha512-C0lflx3Az9epM4dFsDl73w5fxgyw68ZMTr8W0fkLHJvWTM8q26jjDDrgDCDivG0SBc2UUs3xRKSjjsfC6TkZKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.8.2", + "@scalar/types": "0.15.0", + "js-base64": "^3.7.8", + "stringify-object": "^6.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.15.0.tgz", + "integrity": "sha512-Rn9XAFrnQL4cAINCyNlPdvSbd3+Cvqgv2SBX1J8WgtZLxqC32+8Ptmns51Lvn6zKeiX+mFHk1UdvIWmqiG1xRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.8.2", + "nanoid": "^5.1.6", + "type-fest": "^5.3.1", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/workspace-store/node_modules/@scalar/validation": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@scalar/validation/-/validation-0.6.0.tgz", + "integrity": "sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/rehype": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.23.0.tgz", + "integrity": "sha512-GepKJxXHbXFfAkiZZZ+4V7x71Lw3s0ALYmydUxJRdvpKjSx9FOMSaunv6WRLFBXR6qjYerUq1YZQno+2gLEPwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@types/hast": "^3.0.4", + "hast-util-to-string": "^3.0.1", + "shiki": "3.23.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.23.0.tgz", + "integrity": "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/twoslash": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.23.0.tgz", + "integrity": "sha512-pNaLJWMA3LU7PhT8tm9OQBZ1epy0jmdgeJzntBtr1EVXLbHxGzTj3mnf9vOdcl84l96qnlJXkJ/NGXZYBpXl5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/types": "3.23.0", + "twoslash": "^0.3.6" + }, + "peerDependencies": { + "typescript": ">=5.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "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/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stitches/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", + "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@takumi-rs/core": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core/-/core-0.62.8.tgz", + "integrity": "sha512-1KNknsY0r9+fhvMD4gijFuJ2qx63JIVII1dZLiz8/YuZ3mFd9IFW90RTeeAdsP83lNCn6nWCrR8W2hLQgjjCCg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + }, + "optionalDependencies": { + "@takumi-rs/core-darwin-arm64": "0.62.8", + "@takumi-rs/core-darwin-x64": "0.62.8", + "@takumi-rs/core-linux-arm64-gnu": "0.62.8", + "@takumi-rs/core-linux-arm64-musl": "0.62.8", + "@takumi-rs/core-linux-x64-gnu": "0.62.8", + "@takumi-rs/core-linux-x64-musl": "0.62.8", + "@takumi-rs/core-win32-arm64-msvc": "0.62.8", + "@takumi-rs/core-win32-x64-msvc": "0.62.8" + } + }, + "node_modules/@takumi-rs/core-darwin-arm64": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-darwin-arm64/-/core-darwin-arm64-0.62.8.tgz", + "integrity": "sha512-TxVakpycL4g99i2mmLp7abKaQXMCirkrmIXOmQtOaezwsX+yKzDqfm8XH3fhhj5febqgtpHkNvKus8F5k81RHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-darwin-x64": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-darwin-x64/-/core-darwin-x64-0.62.8.tgz", + "integrity": "sha512-2a9TzXpPkpUUBc3dSU3BZAriBuLTPpVc0LzIvI72sp9qyYAVn5Itry+z1Xl+nt5As/xkFdOJccqQxe7tLLBtpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-arm64-gnu": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-arm64-gnu/-/core-linux-arm64-gnu-0.62.8.tgz", + "integrity": "sha512-e8Oe1aOFew+1rbu9y5JRaDvLqw4FqGJx1uPLo5mfdYQKWZ3ltdFseRUCCQI3rOXMXKz6uIWRuHd3Qw5sBp+wJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-arm64-musl": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-arm64-musl/-/core-linux-arm64-musl-0.62.8.tgz", + "integrity": "sha512-qR04H4DQfFsKmkl2kq/fh48zTC3QqBdvHjmHzJUckIktvJPKk1aK+jERIXeARkH6pfQuq+NI5Kbl1t9//qb8nQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-x64-gnu": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-x64-gnu/-/core-linux-x64-gnu-0.62.8.tgz", + "integrity": "sha512-/LouBAUVqK5/H3pwzOnitRz4JEJNrGJEN/L3TU0375M+uXFewWAl2iSwFqgMt9vCtKPrKa/oK+Iy3pdvFAnX2w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-linux-x64-musl": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-linux-x64-musl/-/core-linux-x64-musl-0.62.8.tgz", + "integrity": "sha512-FIt0fpowyh9dse8F29cYBPVhrdc7Zzjz1pEyJunNzIzCIpC0yG3eUwFnK0wsoYoyzbgVZkbLRFRRAFmUORLvDg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-win32-arm64-msvc": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-win32-arm64-msvc/-/core-win32-arm64-msvc-0.62.8.tgz", + "integrity": "sha512-ucQmG2bp6yH+7oNQUev+0re+6FBHUOUcee4mwpQa+BKCtUSgkgQuw3ZAGdyXBQEfr3NrNsMqfc47b3Ljv3bIWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/core-win32-x64-msvc": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/core-win32-x64-msvc/-/core-win32-x64-msvc-0.62.8.tgz", + "integrity": "sha512-KxntZ5d7Cu87WQx0AUw0yzZ3AQuTjeTPZMe4MhYdQbgqw4y6hyOqUL3fz8z80/jh6XxLNHBgcBC0nn9FvJnvSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "(MIT OR Apache-2.0)", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0" + } + }, + "node_modules/@takumi-rs/helpers": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/helpers/-/helpers-0.62.8.tgz", + "integrity": "sha512-9qRFeuk0yTvAeVAaQoU2uW1XeigbTBta/fTReHxEsa0hYqyJe4gM4YicA0D29tfObhSRJUN/j2b2WmHuADAmcQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/@takumi-rs/image-response": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/image-response/-/image-response-0.62.8.tgz", + "integrity": "sha512-he79pvjif5psP8jyDiugUph3qbvKl7SaMetIuYUCI1asES5NMW3yw/nY2zQd73gqwqverhfnOEO/k4we6UxiIA==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@takumi-rs/core": "0.62.8", + "@takumi-rs/helpers": "0.62.8", + "@takumi-rs/wasm": "0.62.8" + } + }, + "node_modules/@takumi-rs/wasm": { + "version": "0.62.8", + "resolved": "https://registry.npmjs.org/@takumi-rs/wasm/-/wasm-0.62.8.tgz", + "integrity": "sha512-V3L4LMoa1hqUxYel+j2oaIYhx7TdfSI/5iStU+7sTDru3o0gwJxw923jG66/F+lLSPGeY4rmYejcJCJN5VfpBA==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.7", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.7.tgz", + "integrity": "sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.35", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.35.tgz", + "integrity": "sha512-lOfSPvgPdlaH6Qy+CyIc3XpycitaSQ9GECndGpTuDiu+uDA1am+90yWXwzDSd/20ZM196ggWJLS+Qb6WjVd/OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "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", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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/mdx": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", + "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "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/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/vfs": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.4.tgz", + "integrity": "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "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", + "integrity": "sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc": { + "version": "0.5.32", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-rsc/-/plugin-rsc-0.5.32.tgz", + "integrity": "sha512-9lKCNZ3gSV46CA6/r+0ONjUXfGuwIJeGcm60VapwWCEuCrhO0f9IBw3pLv+2usZtE2NztxQq5Rlum6b3XESRgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1", + "es-module-lexer": "^2.3.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "srvx": "^0.12.4", + "strip-literal": "^3.1.0", + "turbo-stream": "^3.2.0", + "vitefu": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, + "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/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/@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/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": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.9.0.tgz", + "integrity": "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "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/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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/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/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/anser": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.5.tgz", + "integrity": "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==", + "dev": true, + "license": "MIT" + }, + "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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.7.tgz", + "integrity": "sha512-APw5YuIQAg6L9w4sHDI6j26DGFJI6RpYOhnkMPdC9lWbkKvsyPHzDsve1yd73lk21yz7Y09Kci8B2Pp9FonzWA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/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/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-set": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz", + "integrity": "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==", + "dev": true, + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cva": { + "name": "class-variance-authority", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "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-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.398", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.398.tgz", + "integrity": "sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.4.tgz", + "integrity": "sha512-GVoi+ICHocoOIU7qVVM48wOJziRsqrsyqlI0Ce0LdowRn6v3bcH2zUa9kp85ncx0nwIb9/HOCOLS3fdThDG/XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-carriage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", + "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "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", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/flatted": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fuse.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-sanitize": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "unist-util-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "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/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hono": { + "version": "4.12.32", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", + "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "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/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/identifier-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/identifier-regex/-/identifier-regex-1.1.0.tgz", + "integrity": "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==", + "dev": true, + "license": "MIT", + "dependencies": { + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "dev": true, + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "dev": true, + "license": "MIT" + }, + "node_modules/intersection-observer": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz", + "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==", + "deprecated": "The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019.", + "dev": true, + "license": "W3C-20150513" + }, + "node_modules/ip-address": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-identifier/-/is-identifier-1.1.0.tgz", + "integrity": "sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "identifier-regex": "^1.1.0", + "super-regex": "^1.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.5.tgz", + "integrity": "sha512-2E5L2yRp03FnwreJLJX8/r7mHiZICCf8kG7fAsTWkSQTDAcc46NIZoQLKy+EJ8sPoJlxyS4OQR5H70LjIZZlIQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-base64": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.2.tgz", + "integrity": "sha512-6zayE8QlUdiweYI6cETD/XBSqFcoCUlufn/29PJR99r82x1yDnIprRca0YvAYpAW+ez0GuQkVBC6xG5QkD7OjA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-4.1.0.tgz", + "integrity": "sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "highlight.js": "~11.11.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-asynchronous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", + "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "^1.5.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.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/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.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", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "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", + "peer": true + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "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-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "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-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "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-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "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" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "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-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "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" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^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-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "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-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "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" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "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/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "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/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, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "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", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/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": "5.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", + "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nuqs": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.9.3.tgz", + "integrity": "sha512-Hdb4WfGMGX2dH0GCPFxdSevA2hgTSQs+kv+1G0OPr43/LIm1cyXIZSp0zCd7a/ZZXhbbCBDbyjXKPWHx/aBNWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "1.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/franky47" + }, + "peerDependencies": { + "@remix-run/react": ">=2", + "@tanstack/react-router": "^1", + "next": ">=14.2.0", + "react": ">=18.2.0 || ^19.0.0-0", + "react-router": "^5 || ^6 || ^7 || ^8", + "react-router-dom": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "next": { + "optional": true + }, + "react-router": { + "optional": true + }, + "react-router-dom": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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/outvariant": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/radix-vue": { + "version": "1.9.17", + "resolved": "https://registry.npmjs.org/radix-vue/-/radix-vue-1.9.17.tgz", + "integrity": "sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.7", + "@floating-ui/vue": "^1.1.0", + "@internationalized/date": "^3.5.4", + "@internationalized/number": "^3.5.3", + "@tanstack/vue-virtual": "^3.8.1", + "@vueuse/core": "^10.11.0", + "@vueuse/shared": "^10.11.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.4", + "fast-deep-equal": "^3.1.3", + "nanoid": "^5.0.7" + }, + "peerDependencies": { + "vue": ">= 3.2.0" + } + }, + "node_modules/radix-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/radix-vue/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/radix-vue/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-inline": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/react-devtools-inline/-/react-devtools-inline-4.4.0.tgz", + "integrity": "sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-symbol": "^3" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-error-boundary": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.1.2.tgz", + "integrity": "sha512-3DpCr5HVdZ0caUjYE/kIHBEJN0mNP3ZCgf16c48uJ5TbWjorKVp+YG8W3XqlJ7vJAVNw6wNIImyPXmFydwmyng==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-server-dom-webpack": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.2.8.tgz", + "integrity": "sha512-rFO1VJZ+cH9ZH6hGy9+qmIsmZHZpCMKJZXhWHqT71UnSfg+w+W+gwrwp58MVzMqdFquG8GF1c6C8q0OGphkEdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "acorn-loose": "^8.3.0", + "neo-async": "^2.6.1", + "webpack-sources": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "webpack": "^5.59.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/rehype-autolink-headings": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sanitize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", + "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-sanitize": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx-frontmatter": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-5.2.0.tgz", + "integrity": "sha512-U/hjUYTkQqNjjMRYyilJgLXSPF65qbLPdoESOkXyrwz2tVyhAnm4GUKhfXqOOS9W34M3545xEMq+aMpHgVjEeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "estree-util-value-to-estree": "^3.0.0", + "toml": "^3.0.0", + "unified": "^11.0.0", + "unist-util-mdx-define": "^1.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "dev": true, + "license": "MIT" + }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "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" + } + }, + "node_modules/rollup": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rsc-html-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/rsc-html-stream/-/rsc-html-stream-0.0.7.tgz", + "integrity": "sha512-v9+fuY7usTgvXdNl8JmfXCvSsQbq2YMd60kOeeMIqCJFZ69fViuIxztHei7v5mlMMa2h3SqS+v44Gu9i9xANZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "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/srvx": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.12.4.tgz", + "integrity": "sha512-RixzFlMn3dvzDTpKIAXhXrqL4cy6vScNCP0VVwgVbUBU94o+DiXLsFnAZetbyKAEnK6Ox3hzHXWGsyv/Iibv7g==", + "dev": true, + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/static-browser-server": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz", + "integrity": "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@open-draft/deferred-promise": "^2.1.0", + "dotenv": "^16.0.3", + "mime-db": "^1.52.0", + "outvariant": "^1.3.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", + "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==", + "dev": true, + "license": "MIT" + }, + "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": "6.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-6.0.0.tgz", + "integrity": "sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-identifier": "^1.0.1", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/super-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "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/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss-logical": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss-logical/-/tailwindcss-logical-4.2.0.tgz", + "integrity": "sha512-G+7NFU8xiMczeaykFRvaDbfbpqvFWv05YG6RtS2klW1wvTRkUs96P/e+Zy/Qse6y0HL8tLQ+da8M7trDfu12sw==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "tailwindcss": ">=4.0.0" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", + "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "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/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true, + "license": "MIT" + }, + "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/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/turbo-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-3.2.0.tgz", + "integrity": "sha512-EK+bZ9UVrVh7JLslVFOV0GEMsociOqVOvEMTAd4ixMyffN5YNIEdLZWXUx5PJqDbTxSIBWw04HS9gCY4frYQDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/twoslash": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/twoslash/-/twoslash-0.3.9.tgz", + "integrity": "sha512-rDclk+OtzuTX+tnea7DYLCkqGQ3eP0IyfD+kzUJ7t46X/NzlaxwrhecmEBNuSCuEn3V+n1PhcjUUQQ7gUJzX5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript/vfs": "^1.6.4", + "twoslash-protocol": "0.3.9" + }, + "peerDependencies": { + "typescript": "^5.5.0 || ^6.0.0" + } + }, + "node_modules/twoslash-protocol": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.9.tgz", + "integrity": "sha512-9/iwp+CXOnjFMPQuPL5PkuRbZnDoNpBvtJCLs9t8kDYkL3YHujbvnHfZA1i5fApDftVEdBw+T/4F+dH5kIzpYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/type-fest": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unhead": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-3.2.3.tgz", + "integrity": "sha512-BBkKvthUOufEJzG4C4u5NCdxnGMNaQdb//oPDI8lkv/6qj0faEqnPIvIPejt3FnSE501LX25Gbe2MVgKDuFnyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookable": "^6.1.1", + "unplugin": "^3.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vite": ">=6.4.2" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "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/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-mdx-define": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-mdx-define/-/unist-util-mdx-define-1.1.2.tgz", + "integrity": "sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "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-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", + "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.4", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-icons": { + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-22.5.0.tgz", + "integrity": "sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/utils": "^3.0.2", + "debug": "^4.4.3", + "local-pkg": "^1.1.2", + "unplugin": "^2.3.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@svgr/core": ">=7.0.0", + "@svgx/core": "^1.0.1", + "@vue/compiler-sfc": "^3.0.2 || ^2.7.0", + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0", + "vue-template-compiler": "^2.6.12", + "vue-template-es2015-compiler": "^1.9.0" + }, + "peerDependenciesMeta": { + "@svgr/core": { + "optional": true + }, + "@svgx/core": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + }, + "vue-template-es2015-compiler": { + "optional": true + } + } + }, + "node_modules/unplugin-icons/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "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-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-arraybuffer/-/vite-plugin-arraybuffer-0.1.4.tgz", + "integrity": "sha512-Ubfsw/g4PhdjlgsKYDm2Hlc0qmNJheX8VCeOMayq1k9fMVB1nNuqtWjDH1fj9hSlhlSnlndz/ehMKIuXpB0SeA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-wasm": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.6.0.tgz", + "integrity": "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vocs": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/vocs/-/vocs-2.7.2.tgz", + "integrity": "sha512-Sppu2STAa37Aon2rR/oXAktzW8dTlPcvxNPdfb0PMGL1FRaJlXfYe1EgFLfQzqtorwWk98iCtedtRmuI9IzhZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@base-ui/react": "^1.0.0", + "@codesandbox/sandpack-react": "^2.20.0", + "@hono/node-server": "^2.0.2", + "@iconify-json/lucide": "^1.2.82", + "@iconify-json/ri": "^1.2.10", + "@iconify-json/simple-icons": "^1.2.65", + "@iconify-json/vscode-icons": "^1.2.39", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^3.1.0", + "@mdx-js/mdx": "^3.1.1", + "@mdx-js/react": "^3.1.1", + "@mdx-js/rollup": "^3.1.1", + "@modelcontextprotocol/sdk": "^1.25.2", + "@remix-run/node-fetch-server": "^0.13.0", + "@scalar/api-client": "^3.10.4", + "@scalar/openapi-parser": "^0.28.7", + "@scalar/snippetz": "^0.9.17", + "@scalar/workspace-store": "^0.54.4", + "@shikijs/rehype": "^3.20.0", + "@shikijs/transformers": "^3.20.0", + "@shikijs/twoslash": "^3.20.0", + "@shikijs/types": "^3.20.0", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0", + "@tailwindcss/vite": "^4.3.0", + "@takumi-rs/image-response": "^0.62.7", + "@takumi-rs/wasm": "^0.62.7", + "@vitejs/plugin-react": "^6.0.2", + "@vitejs/plugin-rsc": "^0.5.26", + "cac": "^6.7.14", + "cva": "npm:class-variance-authority@^0.7.1", + "debug": "^4.4.0", + "es-module-lexer": "^2.3.0", + "esast-util-from-js": "^2.0.1", + "estree-util-value-to-estree": "^3.5.0", + "estree-util-visit": "^2.0.0", + "extend": "^3.0.2", + "github-slugger": "^2.0.0", + "hono": "^4.12.14", + "image-size": "^2.0.2", + "lz-string": "^1.5.0", + "magic-string": "^0.30.21", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-gfm": "^3.1.0", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-hast": "^13.2.1", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "micromark-extension-gfm": "^3.0.0", + "minisearch": "^7.2.0", + "nuqs": "^2.4.3", + "react-error-boundary": "^6.0.2", + "rehype-autolink-headings": "^7.1.0", + "rehype-slug": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-directive": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-mdx": "^3.1.1", + "remark-mdx-frontmatter": "^5.2.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "shiki": "^3.20.0", + "sucrase": "^3.35.1", + "tailwindcss": "^4.3.0", + "tailwindcss-logical": "^4.1.0", + "tsx": "^4.21.0", + "twoslash": "^0.3.6", + "unhead": "^3.1.7", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "unplugin-icons": "^22.5.0", + "urlpattern-polyfill": "^10.1.0", + "vfile": "^6.0.3", + "vite-plugin-arraybuffer": "^0.1.1", + "vite-plugin-wasm": "^3.6.0", + "yaml": "^2.8.2", + "zod": "^4.3.5" + }, + "bin": { + "vocs": "dist/cli.js" + }, + "peerDependencies": { + "@vocs/twoslash-rust": "^0.1.0", + "mermaid": "^11", + "react": "^19", + "react-dom": "^19", + "vite": "^8", + "waku": "^1.0.0-beta.6" + }, + "peerDependenciesMeta": { + "@vocs/twoslash-rust": { + "optional": true + }, + "mermaid": { + "optional": true + }, + "vite": { + "optional": true + }, + "waku": { + "optional": true + } + } + }, + "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/vue-component-type-helpers": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.8.tgz", + "integrity": "sha512-troqCMmQodQDqUqn63NQaFi+CDSclSe7sc8VEBFqf5GFLqmGR2Ph3P2WEC7qwpRVyEWsTi/aAr4vyOe/B1hU3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-sonner": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-1.3.2.tgz", + "integrity": "sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/waku": { + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/waku/-/waku-1.0.0-beta.8.tgz", + "integrity": "sha512-+Ek51aw/L0KwjCqlS8ZYB37t3H1BKbJIMd2rP7BsL0C/3FQvS9lH13SheowZqEe1rop01jkQr4bZzXAjt6cn5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^2.0.10", + "@vitejs/plugin-react": "^6.0.1", + "@vitejs/plugin-rsc": "^0.5.30", + "dotenv": "^17.4.2", + "hono": "^4.12.14", + "magic-string": "^1.0.0", + "picocolors": "^1.1.1", + "rsc-html-stream": "^0.0.7", + "vite": "^8.0.0" + }, + "bin": { + "waku": "cli.js" + }, + "engines": { + "node": "^26.0.0 || ^24.0.0 || ^22.15.0" + }, + "peerDependencies": { + "react": "~19.2.4", + "react-dom": "~19.2.4", + "react-server-dom-webpack": "~19.2.4" + } + }, + "node_modules/waku/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/waku/node_modules/magic-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.1.0.tgz", + "integrity": "sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webpack": { + "version": "5.109.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "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" + } + } + } +} diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..d9de713 --- /dev/null +++ b/site/package.json @@ -0,0 +1,17 @@ +{ + "name": "@zevm/docs-site", + "private": true, + "type": "module", + "scripts": { + "dev": "vocs dev", + "build": "vocs build", + "preview": "vocs preview" + }, + "devDependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0", + "vite": "^8.1.5", + "vocs": "2.7.2", + "waku": "^1.0.0-beta.8" + } +} diff --git a/site/src/pages/concepts/architecture-and-upstream-ownership.mdx b/site/src/pages/concepts/architecture-and-upstream-ownership.mdx new file mode 100644 index 0000000..04d89a0 --- /dev/null +++ b/site/src/pages/concepts/architecture-and-upstream-ownership.mdx @@ -0,0 +1,59 @@ +--- +title: Architecture And Upstream Ownership +description: Concise ownership boundary between ZEVM and upstream execution components. +--- + +# Architecture And Upstream Ownership + +ZEVM is an integration shell. It does not re-own upstream execution internals. + +## Layered Composition + +ZEVM composes upstream layers and keeps ownership boundaries explicit: + +| Layer | Primary owner | Role in ZEVM | +| --- | --- | --- | +| Execution foundations | `voltaire` | Ethereum primitives, state/journal/snapshot foundations, fork backend, and shared core data structures | +| EVM execution engine | `guillotine-mini` | Interpreter, execution host integration, and tracing substrate | +| Host adapter bridge | ZEVM composition over upstream APIs | Bridges ZEVM JSON-RPC/runtime context into upstream host/execution interfaces and maps results back into ZEVM method contracts | +| Product/runtime shell | ZEVM | CLI/config, mode selection, lifecycle, HTTP JSON-RPC transport/dispatch, mode gating, checkpoint wiring, and ZEVM canonical control naming (`zevm_*`) | + +## Ownership Boundary + +Voltaire owns execution primitives and shared Ethereum foundations, including: + +- JSON-RPC types +- state manager, journal, and snapshot foundations +- fork backend and blockchain data structures +- cryptographic and execution-layer primitives + +`guillotine-mini` owns: + +- EVM interpreter +- execution host integration +- tracing substrate + +ZEVM owns product-surface composition and runtime operations, including: + +- CLI/config parsing and mode selection +- runtime composition and lifecycle +- HTTP JSON-RPC transport and dispatch +- mode-aware routing and gating +- checkpoint wiring and light readiness reporting +- canonical naming for ZEVM nonstandard controls (`zevm_*`) + +Execution internals remain upstream-owned: ZEVM composes these components but does not re-specify or override EVM/state-transition semantics, proof-generation internals, or interpreter behavior. +Behavior changes or defects in those internals are owned by upstream projects; ZEVM owns integration behavior at the product/runtime shell boundary. + +## Contract Boundary + +- ZEVM concept docs define mode boundaries and selector behavior +- JSON-RPC reference pages define exact method-level contracts +- trusted compatibility aliases (`anvil_*`, selected `hardhat_*`, selected `evm_*`) are compatibility inputs, not canonical naming + +## Where To Go Next + +- Concept: [Runtime Modes](/concepts/runtime-modes) +- Concept: [Method Support By Mode](/concepts/method-support-by-mode) +- Quickstart: [Run Trusted Mode](/quickstart/run-trusted-mode) +- Reference: [JSON-RPC Overview](/reference/json-rpc/overview) diff --git a/site/src/pages/concepts/light-mode.mdx b/site/src/pages/concepts/light-mode.mdx new file mode 100644 index 0000000..ad96f18 --- /dev/null +++ b/site/src/pages/concepts/light-mode.mdx @@ -0,0 +1,123 @@ +--- +title: Light Mode +description: ZEVM's proof-backed, consensus-anchored read mode with readiness-gated selectors. +--- + +# Light Mode + +Light mode is ZEVM's read-only, proof-backed, consensus-anchored runtime. + +## What Light Mode Owns + +Light mode provides proof-backed, consensus-anchored reads and readiness reporting. It does not expose trusted-mode local-dev controls. + +Phase-1 operator-facing startup inputs are `network`, `consensusRpcUrl`, and `executionRpcUrl`, plus optional checkpoint controls (`checkpoint`, `checkpointDir`, `maxCheckpointAgeSeconds`, `strictCheckpointAge`). + +Supported light networks are a closed phase-1 set: `mainnet`, `sepolia`, and `holesky`. +Any other `network` value is invalid startup input. +Selected `network` constrains both runtime `eth_chainId` and pre-listener startup handshake root validation (`GET /eth/v1/beacon/genesis`); mismatch is startup failure before the HTTP listener opens. + +For exact startup/config contract wording, see: + +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [Canonical Chain ID And Genesis Root Mapping](/reference/configuration/light-mode#canonical-chain-id-and-genesis-root-mapping) +- [CLI And Config Field Map](/reference/configuration/light-mode#cli-and-config-field-map) +- [Validation Rules](/reference/configuration/light-mode#validation-rules) + +## Supported Surface + +Light mode supports: + +- `zevm_lightSyncStatus` +- `eth_chainId` +- `eth_blockNumber` (readiness-gated) +- proof-backed `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getTransactionCount` +- consensus-anchored selector semantics for `latest`, `safe`, and `finalized` + +Not exposed in light mode: + +- trusted-mode `zevm_*` controls (except `zevm_lightSyncStatus`) +- trusted compatibility aliases (`anvil_*`, `hardhat_*`, `evm_*`) +- simulation, transaction submission, mining, and trusted canonical block/receipt/log query surfaces + +Method-level support and exact alias handling are defined in: + +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [ZEVM Controls](/reference/json-rpc/dev-controls) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) + +## Readiness Model + +`zevm_lightSyncStatus` is the readiness control point for light mode. + +Operational guidance: + +- poll `zevm_lightSyncStatus` until `ready = true` and `status = "synced"` before treating proof-backed reads as serviceable +- `ready` is non-monotonic: after `ready = true`, ZEVM can transition back to `ready = false` if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`) +- `eth_chainId` is available before readiness +- while not ready, readiness-gated reads (including `eth_blockNumber`) are unavailable +- if status remains `error`, verify `network`, `consensusRpcUrl`, `executionRpcUrl`, and checkpoint inputs, then restart +- `zevm_lightSyncStatus` observability uses slot fields `optimisticSlot`, `safeSlot`, and `finalizedSlot`; while ready, expect `finalizedSlot <= safeSlot <= optimisticSlot` + +Canonical readiness/proof contract: + +- [Readiness And Proof Rules](/reference/json-rpc/verified-light-mode-reads#readiness-and-proof-rules) +- [`zevm_lightSyncStatus` Result](/reference/json-rpc/verified-light-mode-reads#zevm_lightsyncstatus-result) + +Canonical error map for readiness-gated reads: + +- `-32011`: light mode is not ready (`eth_blockNumber` and proof-backed reads are gated) +- `-32014`: proof verification failed at an otherwise supported selector +- `-32015`: malformed data from upstream proof source + +## Selector Model + +In light mode: + +| Tag or selector | Meaning | +| --- | --- | +| `latest` | latest verified optimistic execution head | +| `safe` | consensus-anchored safe head | +| `finalized` | consensus-finalized head | +| `earliest` | block `0` | +| numeric quantity | block `0` or retained verified-history block | +| `pending` | unsupported | + +Numeric selector acceptance is bounded to retained verified history plus genesis (`0`). +For exact accepted-set and error behavior, see [Retained-history numeric selector contract](/reference/json-rpc/verified-light-mode-reads#retained-history-numeric-selector-contract). + +## Checkpoint Selection (Startup) + +Startup checkpoint precedence: + +1. CLI checkpoint (`--checkpoint`), when provided +2. Config checkpoint (`mode.light.checkpoint`), when set +3. Persisted startup checkpoint input (`checkpointDir/checkpoint`) +4. Baked default checkpoint for the selected network + +Operational notes: + +- persisted checkpoint file lifecycle is operator-managed +- baked defaults are release/build-specific and can rotate +- `checkpointSource` in `zevm_lightSyncStatus` reports which startup source won precedence + +Canonical startup/checkpoint contract: + +- [Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) +- [Persisted Checkpoint Startup-Input Contract](/reference/configuration/light-mode#persisted-checkpoint-startup-input-contract) + +For detailed internal semantics (checkpoint-age policy, persisted-checkpoint handling, and readiness transitions), see [`docs/specs/internal/light-mode-semantics.md`](https://github.com/evmts/zevm/blob/main/docs/specs/internal/light-mode-semantics.md). + +## Where To Go Next + +- Quickstart: [Run Light Mode](/quickstart/run-light-mode) +- Quickstart: [Installation](/quickstart/installation) +- Reference: [Light-Mode Configuration](/reference/configuration/light-mode) +- Reference: [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- Reference: [Core Reads](/reference/json-rpc/core-reads) +- Reference: [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) + +## Related Pages + +- [Runtime Modes](/concepts/runtime-modes) +- [Method Support By Mode](/concepts/method-support-by-mode) diff --git a/site/src/pages/concepts/method-support-by-mode.mdx b/site/src/pages/concepts/method-support-by-mode.mdx new file mode 100644 index 0000000..f6f09b0 --- /dev/null +++ b/site/src/pages/concepts/method-support-by-mode.mdx @@ -0,0 +1,50 @@ +--- +title: Method Support By Mode +description: Practical capability matrix for trusted and light mode without duplicating method reference pages. +--- + +# Method Support By Mode + +Use this matrix to choose the right mode. This page is a summary of the normative contract sources in `docs/specs/prd.md` and `docs/specs/json-rpc-contract.md`. +Use JSON-RPC reference pages for exact method signatures, params, payloads, and errors. + +## Capability Matrix + +| Capability family | Trusted mode | Light mode | Method details | +| --- | --- | --- | --- | +| Core reads (`eth_chainId`, `eth_blockNumber`, account/code/storage/nonce reads, trusted batch storage reads) | yes | yes for the light subset (`eth_chainId` always; proof-backed account/code/storage/nonce reads and `eth_blockNumber` require `ready = true`; proof-backed numeric selectors are limited to block `0` plus the retained verified-history window); trusted batch storage reads are not in the light subset | [Core Reads](/reference/json-rpc/core-reads), [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| Simulation and execution testing (`eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, `testing_buildBlockV1`) | yes | no (`-32010`; these methods are trusted-only in phase 1, and `eth_call` remains a deferred light-mode proof-backed target) | [Simulation](/reference/json-rpc/simulation), [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) | +| Transaction submission and mining | yes | no | [Transactions And Mining](/reference/json-rpc/transactions-and-mining) | +| Compatibility utilities (`web3_*`, `net_*`, `eth_mining`, `eth_syncing`, `eth_protocolVersion`) | yes | no (`-32010`) | [JSON-RPC Overview](/reference/json-rpc/overview) | +| Txpool introspection (`txpool_content`, `txpool_contentFrom`, `txpool_status`, `txpool_inspect`) | yes | no (`-32010`) | [Transactions And Mining](/reference/json-rpc/transactions-and-mining) | +| Canonical block/transaction/receipt/log queries, including block tx counts, tx-by-block-index lookups, and `eth_getLogs` | yes | no | [Blocks, Receipts, And Logs](/reference/json-rpc/blocks-receipts-and-logs) | +| ZEVM trusted namespace (`zevm_*` except `zevm_lightSyncStatus`) | yes | no | [ZEVM Controls](/reference/json-rpc/dev-controls) | +| ZEVM light namespace (`zevm_lightSyncStatus`) | no | yes | [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| Trusted compatibility aliases (`anvil_*`, selected `hardhat_*`, selected `evm_*`) | yes | no | [ZEVM Controls](/reference/json-rpc/dev-controls), [Transactions And Mining](/reference/json-rpc/transactions-and-mining) | +| Optional Engine API listener (`engine_*`) | yes, only when enabled at trusted startup | no (`-32010`) | [Trusted-Mode Configuration](/reference/configuration/trusted-mode#engine-api-listener) | +| Filter lifecycle (`eth_newFilter`, `eth_newBlockFilter`, `eth_newPendingTransactionFilter`, `eth_getFilterChanges`, `eth_getFilterLogs`, `eth_uninstallFilter`) | yes, with empty trusted deltas/logs in phase 1 | no (`-32010`) | [Blocks, Receipts, And Logs](/reference/json-rpc/blocks-receipts-and-logs) | +| Subscriptions (`eth_subscribe`, `eth_unsubscribe`) | not part of current contract (deferred method surface) | not part of current contract (deferred method surface) | [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) | +| WebSocket transport | transport-level unsupported (HTTP JSON-RPC only; outside JSON-RPC method dispatch, not a method-level deferred mapping) | transport-level unsupported (HTTP JSON-RPC only; outside JSON-RPC method dispatch, not a method-level deferred mapping) | [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) | + +## Selector And Readiness Rules + +- mode-incompatible methods fail with `-32010` +- compatibility alias acceptance is closed-world: only aliases explicitly enumerated on JSON-RPC reference pages are accepted +- deferred-surface promotion and phase-1 boundary/graduation criteria are canonicalized in [Specs And Process](/reference/specs-and-process#deferred-surface-promotion-and-phase-1-boundary-and-graduation-criteria) +- in light mode, `eth_chainId` is always callable +- in light mode, while `ready = false`, proof-backed reads and `eth_blockNumber` fail with `-32011` +- in light mode, numeric selectors are limited to block `0` plus the retained verified-history window +- in light mode, numeric selectors outside that retained window fail with `-32602` +- in light mode, canonical query methods on the blocks/receipts/logs page (`eth_getBlockBy*`, `eth_getBlockTransactionCountBy*`, `eth_getTransactionBy*`, `eth_getTransactionReceipt`, `eth_getBlockReceipts`, `eth_getLogs`) fail with `-32010` +- trusted-mode `pending`, `safe`, and `finalized` are aliases of `latest` +- light-mode `safe` and `finalized` are consensus-anchored heads + +## Where To Go Next + +- Concept: [Runtime Modes](/concepts/runtime-modes) +- Concept: [Trusted Mode](/concepts/trusted-mode) +- Concept: [Light Mode](/concepts/light-mode) +- Quickstart: [Run Trusted Mode](/quickstart/run-trusted-mode) +- Quickstart: [Forked Dev Node](/quickstart/forked-dev-node) +- Reference: [Canonical Specs And Docs-First Process](/reference/specs-and-process) +- Reference: [Configuration Overview](/reference/configuration/overview) diff --git a/site/src/pages/concepts/runtime-modes.mdx b/site/src/pages/concepts/runtime-modes.mdx new file mode 100644 index 0000000..bde431e --- /dev/null +++ b/site/src/pages/concepts/runtime-modes.mdx @@ -0,0 +1,96 @@ +--- +title: Runtime Modes +description: ZEVM has two runtime modes with explicit startup selection and mode-gated JSON-RPC surfaces. +--- + +# Runtime Modes + +ZEVM has exactly two runtime modes: + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). + +- `trusted`: writable local development node +- `light`: proof-backed, consensus-anchored read-only runtime + +Forking is configuration inside trusted mode, not a third mode. + +## Startup Selection + +Mode is selected from startup inputs in this order: + +- explicit CLI selector: `--mode trusted` or `--mode light` +- otherwise, the config mode branch (`mode.trusted` or `mode.light`) +- otherwise, the trusted-mode default + +Light-mode operator-facing startup inputs are `network`, `consensusRpcUrl`, and `executionRpcUrl`, with optional checkpoint controls (`checkpoint`, `checkpointDir`, `maxCheckpointAgeSeconds`, `strictCheckpointAge`). +If operators want persisted checkpoint-source behavior, they must manage `checkpointDir/checkpoint` themselves; ZEVM does not auto-populate it. +Proof-source internals are not user-configurable in the public contract. + +## Current Sequencing Note + +The current public runtime/RPC scope remains trusted-first: + +- trusted mode carries the primary local dev-node surface (writes, simulation, mining, snapshots, and fork overlay controls) +- light mode currently exposes readiness-gated proof-backed reads plus `zevm_lightSyncStatus` +- deferred or unsupported light-mode methods are tracked in [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) +- deferred-surface promotion and phase-1 boundary/graduation criteria are canonicalized in [Specs And Process](/reference/specs-and-process#deferred-surface-promotion-and-phase-1-boundary-and-graduation-criteria) + +## Mode Boundary + +| Surface | Trusted mode | Light mode | +| --- | --- | --- | +| Core reads (`eth_chainId`, `eth_blockNumber`, account/code/storage/nonce reads) | yes | yes (limited to `eth_chainId`, `eth_blockNumber`, and proof-backed account/code/storage/nonce reads) | +| Simulation and execution testing (`eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, `testing_buildBlockV1`) | yes | no (`-32010`; these methods are trusted-only in phase 1, and `eth_call` remains a deferred light-mode proof-backed target) | +| Transaction submission and mining | yes | no | +| Canonical block, receipt, and log queries (including `eth_getLogs`) | yes | no | +| ZEVM trusted controls (`zevm_*` except `zevm_lightSyncStatus`) | yes | no | +| Trusted compatibility aliases (`anvil_*`, selected `hardhat_*`, selected `evm_*`) | yes | no | +| Light readiness/status (`zevm_lightSyncStatus`) | no | yes | + +Methods unavailable in the active mode fail with `-32010`. + +Compatibility alias acceptance is closed-world: accepted aliases are exactly those listed in the `Accepted aliases` columns on [ZEVM Controls](/reference/json-rpc/dev-controls#methods), [Submission Methods](/reference/json-rpc/transactions-and-mining#submission-methods), [Mining And Txpool Methods](/reference/json-rpc/transactions-and-mining#mining-and-txpool-methods), [Time And Block-Environment Methods](/reference/json-rpc/transactions-and-mining#time-and-block-environment-methods), and [Fork-Source Methods](/reference/json-rpc/transactions-and-mining#fork-source-methods). + +## Selector Semantics + +| Tag or selector | Trusted mode | Light mode | +| --- | --- | --- | +| `latest` | current local head | latest verified optimistic execution head | +| `pending` | alias of `latest` | unsupported | +| `safe` | alias of `latest` | consensus-anchored safe head | +| `finalized` | alias of `latest` | consensus-finalized head | +| `earliest` | block `0` | block `0` | +| numeric quantity | exact local block number | block `0`, or an exact block inside the retained verified-history window | + +Trusted-mode `pending`, `safe`, and `finalized` are compatibility aliases only. + +In light mode: + +- `eth_chainId` is always callable +- `ready = true` can be reached only after `status` transitions to `synced` and ZEVM has accepted verified optimistic (`latest`), safe (`safe`), and finalized (`finalized`) heads +- while `ready = true`, verified-head ordering must hold: `finalized <= safe <= latest` +- if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`), ZEVM sets `ready = false` in the same transition before serving the next readiness-gated RPC call +- while `ready = false`, proof-backed reads fail with `-32011` +- while `ready = false`, `eth_blockNumber` also fails with `-32011` +- once ready, `eth_blockNumber` returns the `latest` light-mode head number +- numeric selectors are bounded to block `0` and retained verified-history blocks +- numeric selectors outside that retained window fail with `-32602` + +## Where To Go Next + +- Quickstart: [Run Trusted Mode](/quickstart/run-trusted-mode) +- Quickstart: [Forked Dev Node](/quickstart/forked-dev-node) +- Reference: [Canonical Specs And Docs-First Process](/reference/specs-and-process) +- Reference: [JSON-RPC Overview](/reference/json-rpc/overview) +- Reference: [Core Reads](/reference/json-rpc/core-reads) +- Reference: [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- Reference: [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) +- Reference: [Configuration Overview](/reference/configuration/overview) + +## Related Pages + +- [Trusted Mode](/concepts/trusted-mode) +- [Light Mode](/concepts/light-mode) +- [State Fork And Snapshots](/concepts/state-fork-and-snapshots) +- [Method Support By Mode](/concepts/method-support-by-mode) +- [Architecture And Upstream Ownership](/concepts/architecture-and-upstream-ownership) diff --git a/site/src/pages/concepts/state-fork-and-snapshots.mdx b/site/src/pages/concepts/state-fork-and-snapshots.mdx new file mode 100644 index 0000000..6c21f1d --- /dev/null +++ b/site/src/pages/concepts/state-fork-and-snapshots.mdx @@ -0,0 +1,77 @@ +--- +title: State Fork And Snapshots +description: Trusted-mode fork overlay, snapshot boundary, and reset semantics. +--- + +# State Fork And Snapshots + +Forking is trusted-mode configuration. It is not a runtime mode. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For product-contract disputes, follow those normative sources. + +## Fork Overlay Model + +A forked trusted node uses upstream state as a read source and applies local writes in ZEVM's trusted-mode overlay. + +- upstream RPC: read source +- trusted overlay: writable local state +- `chainId`: trusted-mode setting (including runtime updates via `zevm_setChainId`), not inferred from upstream fork source + +Fork config union: + +- `null` +- `{ "url": "https://..." }` +- `{ "url": "https://...", "blockNumber": }` + +## Snapshot Boundary + +`zevm_snapshot` and `zevm_revert` operate on trusted-mode local state and ZEVM-owned runtime metadata. + +Included boundary: + +- local overlay/journal state +- canonical local head +- local receipt/log indexes +- pending txpool +- mining configuration +- block-environment overrides +- impersonation state +- time controls + +Excluded boundary: + +- upstream fork provider state +- light-mode checkpoint/consensus state + +## Related Control Families + +These families are separate and should not be conflated: + +- snapshot/revert: [`zevm_snapshot`, `zevm_revert`](/reference/json-rpc/dev-controls#methods) (`zevm_revert` result rules: [Method Rules](/reference/json-rpc/dev-controls#method-rules)) +- local state import/export: [`zevm_dumpState`, `zevm_loadState`](/reference/json-rpc/dev-controls#methods) +- fork-source/runtime reset: [`zevm_reset`, `zevm_setRpcUrl`](/reference/json-rpc/transactions-and-mining#fork-source-methods) (semantics: [Fork-source control semantics](/reference/json-rpc/transactions-and-mining#fork-source-control-semantics)) + +`zevm_reset` is a runtime/fork-source reset control, not a snapshot restore primitive. + +`zevm_setRpcUrl` precondition and behavior: + +- precondition: fork backing is already enabled; otherwise `zevm_setRpcUrl` fails with `-32603` +- `zevm_setRpcUrl` updates the active fork upstream URL in place +- `zevm_setRpcUrl` does not reset local canonical chain state, clear pending txpool, or invalidate snapshots +- `zevm_setRpcUrl` does not redefine snapshot/revert boundaries +- by contrast, successful `zevm_reset` resets local canonical chain to trusted genesis (`0x0`), clears pending txpool, invalidates snapshot IDs, and can optionally replace or clear fork source + +## Where To Go Next + +- Quickstart: [Forked Dev Node](/quickstart/forked-dev-node) +- Quickstart: [Run Trusted Mode](/quickstart/run-trusted-mode) +- Reference: [ZEVM Controls](/reference/json-rpc/dev-controls) +- Reference: [Transactions And Mining](/reference/json-rpc/transactions-and-mining) + +## Related Pages + +- [Trusted Mode](/concepts/trusted-mode) +- [Runtime Modes](/concepts/runtime-modes) +- [Method Support By Mode](/concepts/method-support-by-mode) diff --git a/site/src/pages/concepts/trusted-mode.mdx b/site/src/pages/concepts/trusted-mode.mdx new file mode 100644 index 0000000..c25989f --- /dev/null +++ b/site/src/pages/concepts/trusted-mode.mdx @@ -0,0 +1,87 @@ +--- +title: Trusted Mode +description: ZEVM's writable local dev-node mode and canonical control surface. +--- + +# Trusted Mode + +Trusted mode is ZEVM's writable local development node. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For product-contract disputes, follow those normative sources. + +## What Trusted Mode Owns + +Trusted mode is the mode for local execution and local writes: + +- core reads against local state +- simulation and execution testing (`eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, `testing_buildBlockV1`) +- transaction submission and mining +- canonical block, receipt, and log queries (including `eth_getLogs`) +- snapshots, revert, impersonation, state mutation, and time controls +- optional fork-backed reads with a local writable overlay + +Filter lifecycle APIs beyond `eth_getLogs` are deferred. + +Trusted mode also ships one exact deterministic managed dev-wallet contract. For mnemonic, derivation root, full address/key set, and signing behavior, see [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet). + +## Naming And Alias Policy + +- Canonical ZEVM controls use `zevm_*` +- Trusted mode accepts a fixed compatibility-alias set under `anvil_*`, selected `hardhat_*`, and selected `evm_*` +- Compatibility aliases are trusted-mode only + +Compatibility alias acceptance is closed-world: only aliases explicitly enumerated on JSON-RPC reference pages are accepted. + +Public docs should name `zevm_*` first, with aliases treated as compatibility inputs. + +## Trusted Config Shape + +```json +{ + "mode": { + "trusted": { + "chainId": 31337, + "mining": { "type": "auto" }, + "fork": null + } + } +} +``` + +Resolved unions: + +- `mode.trusted.mining`: `{ "type": "auto" }`, `{ "type": "manual" }`, or `{ "type": "interval", "blockTime": }` +- `mode.trusted.fork`: `null`, `{ "url": "https://..." }`, or `{ "url": "https://...", "blockNumber": }` + +## Trusted Block Tags + +| Tag | Meaning | +| --- | --- | +| `latest` | current local head | +| `pending` | alias of `latest` | +| `safe` | alias of `latest` | +| `finalized` | alias of `latest` | +| `earliest` | block `0` | +| numeric quantity | exact local block number | + +`pending`, `safe`, and `finalized` in trusted mode do not imply consensus finality. + +## Where To Go Next + +- Quickstart: [Run Trusted Mode](/quickstart/run-trusted-mode) +- Quickstart: [Forked Dev Node](/quickstart/forked-dev-node) +- Reference: [Trusted-Mode Configuration](/reference/configuration/trusted-mode) +- Reference: [Core Reads](/reference/json-rpc/core-reads) +- Reference: [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet) +- Reference: [Simulation](/reference/json-rpc/simulation) +- Reference: [Transactions And Mining](/reference/json-rpc/transactions-and-mining) +- Reference: [Blocks, Receipts, And Logs](/reference/json-rpc/blocks-receipts-and-logs) +- Reference: [ZEVM Controls](/reference/json-rpc/dev-controls) + +## Related Pages + +- [Runtime Modes](/concepts/runtime-modes) +- [State Fork And Snapshots](/concepts/state-fork-and-snapshots) +- [Method Support By Mode](/concepts/method-support-by-mode) diff --git a/site/src/pages/ecosystem.mdx b/site/src/pages/ecosystem.mdx new file mode 100644 index 0000000..8956782 --- /dev/null +++ b/site/src/pages/ecosystem.mdx @@ -0,0 +1,87 @@ +--- +title: Ecosystem +description: How ZEVM relates to tevm, guillotine, guillotine-mini, and voltaire. +--- + +# Ecosystem + +ZEVM is one layer of a stack that spans Zig, Rust, and TypeScript. This page is the map: what each +project owns, which way the dependencies point, and where to file an issue. + +## The layers + +| Project | Language | Owns | +| --- | --- | --- | +| [voltaire](https://github.com/evmts/voltaire) | Zig (+ Rust crypto) | Ethereum primitives: addresses, RLP, JSON-RPC types, state manager, journal and snapshot foundations, fork backend, blockchain data structures, cryptography. | +| [guillotine-mini](https://github.com/evmts/guillotine-mini) | Zig | The EVM interpreter, execution-host integration, tracing substrate. Spec-focused and small. | +| [guillotine](https://github.com/evmts/guillotine) | Zig | The larger EVM effort that guillotine-mini distills. | +| **zevm** (this project) | Zig | The client shell: CLI and config, runtime-mode selection, lifecycle, HTTP JSON-RPC transport and dispatch, mode gating, checkpoint wiring, light-client consensus sync and proof verification, the C ABI, and the npm distribution. | +| [tevm](https://github.com/evmts/tevm-monorepo) | TypeScript | The JavaScript-facing Ethereum tooling. Consumes ZEVM. | + +## Which way dependencies point + +```text +tevm (TypeScript) + └── @evmts/zevm (npm: ESM/CJS bindings + native addon) + └── zevm (Zig client) + ├── guillotine-mini (EVM interpreter) + │ └── voltaire (primitives, state, fork backend) + └── voltaire +``` + +Nothing points back up. ZEVM never re-specifies EVM or state-transition semantics — if the +interpreter is wrong, that is a guillotine-mini bug; if a primitive or the state journal is wrong, +that is a voltaire bug. ZEVM owns *integration* behaviour at the product boundary. The precise +split is written down in +[Architecture & Upstream Ownership](/concepts/architecture-and-upstream-ownership). + +## How ZEVM reaches upstream + +`build.zig.zon` pins voltaire and guillotine-mini by immutable URL + hash — not by sibling path +dependency, even in local development. A release records the exact triple it was built from: + +```bash +zig build dependency-preflight -- \ + --voltaire-revision "$VOLTAIRE_REVISION" \ + --guillotine-mini-revision "$GUILLOTINE_MINI_REVISION" \ + --zig-version 0.15.2 +``` + +Those revisions are published alongside each release as `release-tuple.json`. Do not make a +reproducibility claim from a source checkout that has not run the +[Release Metadata Runbook](/reference/release-metadata-runbook). + +## How tevm reaches ZEVM + +tevm consumes ZEVM two ways, and they have different pinning stories: + +- **As a pnpm workspace member.** The tevm monorepo may resolve `@evmts/zevm` from a local + `../zevm/npm/zevm` checkout during development. +- **By commit SHA in CI.** tevm's `.github/actions/setup` pins ZEVM by commit SHA. There is a + comment there explaining the pin — read it before you change anything about the ZEVM build + outputs, output paths, or platform package names, because tevm's CI is downstream of all three. + +Because of that pin, a ZEVM change that renames an artifact path or drops a platform target is a +breaking change for tevm even if `@evmts/zevm`'s semver does not move. + +## Choosing the right entry point + +| You are… | Use | +| --- | --- | +| Writing TypeScript app or test code | tevm | +| Wanting verified mainnet reads inside a Node process | [`@evmts/zevm`](/reference/node-api) | +| Wanting a scriptable local dev chain | the `zevm` binary in [trusted mode](/quickstart/run-trusted-mode) | +| Embedding a light client in Swift/Rust/C++ | the [C ABI](/reference/c-abi) | +| Writing a Zig program that needs an EVM | guillotine-mini directly, not ZEVM | +| Writing a Zig program that needs Ethereum primitives | voltaire directly | + +## Where to file an issue + +| Symptom | Repo | +| --- | --- | +| Wrong opcode result, wrong gas, tracing gap | guillotine-mini | +| Wrong RLP/address/hashing, state-journal or fork-backend defect | voltaire | +| Wrong JSON-RPC shape, mode gating, CLI/config, checkpoint handling, packaging | zevm | +| TypeScript API ergonomics, bundling, framework integration | tevm | + +If you are unsure, file against zevm — triage will route it up or down the stack. diff --git a/site/src/pages/guides/building-from-source.mdx b/site/src/pages/guides/building-from-source.mdx new file mode 100644 index 0000000..9c7eb32 --- /dev/null +++ b/site/src/pages/guides/building-from-source.mdx @@ -0,0 +1,177 @@ +--- +title: Building From Source +description: Toolchain requirements, every build step, platform support, and what each artifact is for. +--- + +# Building From Source + +ZEVM is a Zig project with a Rust component (voltaire's crypto archive) and a Node.js packaging +layer. All three toolchains are needed for a full build; a plain `zig build` of the binary needs +Zig and Rust only. + +## Toolchain + +| Tool | Pinned version | Where the pin lives | +| --- | --- | --- | +| Zig | `0.15.2` | `minimum_zig_version` in `build.zig.zon` | +| Rust | `1.89.0` | `rust-toolchain.toml` (`profile = "minimal"`) | +| Node.js | `22.22.0` | `.node-version` (the npm package declares `engines.node >= 22`) | + +Release publishing runs on Node.js `24.11.1` with npm `11.6.2` for npm trusted publishing; that is +a CI concern, not a requirement for building locally. + +Verify your toolchain: + +```bash +zig version # 0.15.2 +rustc --version # rustc 1.89.0 (29483883e 2025-08-04) +node -v # v22.22.0 or newer +``` + +## Clone and fetch + +```bash +git clone https://github.com/evmts/zevm.git +cd zevm +git submodule update --init --depth 1 lib/execution-apis +zig build --fetch +``` + +`build.zig.zon` pins voltaire and guillotine-mini by immutable URL and hash. `zig build --fetch` +populates the Zig package cache; there are no sibling path dependencies to set up. + +Optionally assert the pinned tuple before building: + +```bash +zig build dependency-preflight -- --zig-version 0.15.2 +``` + +## Build the binary + +```bash +zig build +``` + +The executable lands at `./zig-out/bin/zevm`. Run it: + +```bash +./zig-out/bin/zevm --mode trusted +``` + +Or go through Zig, passing runtime flags after `--`: + +```bash +zig build run -- --mode trusted --host 127.0.0.1 --port 8545 +``` + +## Run the tests + +```bash +npm --prefix npm/zevm ci --ignore-scripts +zig build test +zig build verify-fast +zig build c-smoke +zig build npm-smoke +npm --prefix npm/zevm run typecheck +``` + +`--ignore-scripts` matters: the npm package's install scripts expect prebuilt native artifacts +that a source checkout has not produced yet. + +## Release-style artifacts + +Three separate build steps produce the three distribution shapes. + +```bash +zig build release-binaries -Doptimize=ReleaseSafe +zig build c-ffi -Doptimize=ReleaseSafe +zig build npm-platform-artifacts -Doptimize=ReleaseSafe +``` + +| Step | Outputs | Consumed by | +| --- | --- | --- | +| `release-binaries` | `zig-out/dist//bin/zevm` | Operators running the client. | +| `c-ffi` | `zig-out/include/zevm.h`, `zig-out/lib/libzevm.a`, `zig-out/lib/libzevm.{dylib,so,dll}` | [C ABI](/reference/c-abi) embedders. | +| `npm-platform-artifacts` | `zig-out/npm/prebuilds//zevm.node`, `zig-out/npm/native/zevm.node` | The `@evmts/zevm-*` platform packages. | + +A real `c-ffi` run on macOS arm64 (Zig 0.15.2, Rust 1.89.0) produces: + +```text +zig-out/include: +-rw-r--r-- 1 williamcory staff 5871 zevm.h + +zig-out/lib: +-rw-r--r-- 1 williamcory staff 18658108 libzevm.a +-rwxr-xr-x 1 williamcory staff 1443904 libzevm.dylib +``` + +## Platform support + +Native prebuilds are published for these targets: + +| Platform | npm platform package | +| --- | --- | +| macOS arm64 | `@evmts/zevm-darwin-arm64` | +| macOS x64 | `@evmts/zevm-darwin-x64` | +| Linux arm64 (glibc) | `@evmts/zevm-linux-arm64-gnu` | +| Linux arm64 (musl) | `@evmts/zevm-linux-arm64-musl` | +| Linux x64 (glibc) | `@evmts/zevm-linux-x64-gnu` | +| Linux x64 (musl) | `@evmts/zevm-linux-x64-musl` | +| Windows arm64 | `@evmts/zevm-win32-arm64-msvc` | +| Windows ia32 | `@evmts/zevm-win32-ia32-msvc` | +| Windows x64 | `@evmts/zevm-win32-x64-msvc` | + +`npm/platforms/` additionally contains `freebsd-arm64` and `freebsd-x64` scaffolding, but those +are **not** wired into `@evmts/zevm`'s `optionalDependencies` and are not resolved at runtime — +treat FreeBSD as a source-build target. + +**Cross-compilation caveat.** Voltaire's Rust crypto archive is target-specific. One host cannot +produce every supported target without the matching Rust target and C toolchain installed, so +multi-platform releases run these steps in an OS/architecture matrix rather than cross-compiling +from a single machine. + +## Using a local build from Node.js + +Skip platform-package resolution entirely: + +```bash +zig build npm-platform-artifacts -Doptimize=ReleaseSafe +export ZEVM_NATIVE_PATH="$PWD/zig-out/npm/native/zevm.node" +node -e 'import("@evmts/zevm").then(m => console.log(m.version(), m.abiVersion()))' +``` + +Or run the package's own smoke test against it: + +```bash +npm --prefix npm/zevm run smoke:native +``` + +## Building the npm package + +```bash +npm --prefix npm/zevm ci --ignore-scripts +npm --prefix npm/zevm run build # tsc ESM + tsc CJS + move-cjs +npm --prefix npm/zevm run typecheck +``` + +The build runs `tsc` twice (`tsconfig.json` for ESM, `tsconfig.cjs.json` for CJS) and then +`scripts/move-cjs.cjs` renames the CJS output to `.cjs` so the subpath `require` conditions +resolve. + +## Do not publish by hand + +Publishing is CI-only. A GitHub Release whose tag exactly matches `v` runs the +full build and tests, builds every supported native package, and publishes the platform packages +before `@evmts/zevm` with npm provenance. Maintainers must not run `npm publish` locally — a +hand-published version breaks provenance and the platform-package ordering. See +[CI & Release Gates](/reference/ci-and-release-gates). + +## Docs + +The documentation site in `site/` is a [vocs](https://vocs.dev) app: + +```bash +npm --prefix site install +npm --prefix site run dev # local preview +npm --prefix site run build # static output in site/dist +``` diff --git a/site/src/pages/guides/contract-testing.mdx b/site/src/pages/guides/contract-testing.mdx new file mode 100644 index 0000000..e55cdb1 --- /dev/null +++ b/site/src/pages/guides/contract-testing.mdx @@ -0,0 +1,264 @@ +--- +title: Testing Contracts Against ZEVM +description: Drive a ZEVM trusted dev node from a test suite - snapshots, impersonation, time travel, and forked mainnet. +--- + +# Testing Contracts Against ZEVM + +A ZEVM trusted node is a writable dev chain that speaks the dev-control surface test suites +already expect (`zevm_*` canonical, with `anvil_*`/`hardhat_*`/`evm_*` aliases). This guide runs a +complete suite against one. + +## 1. Start the node + +Manual mining gives a test suite deterministic block boundaries — nothing is mined until you ask: + +```bash +zevm --mode trusted --mining manual --host 127.0.0.1 --port 8545 +``` + +Verify it is up: + +```bash +curl -s http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' +``` + +```json +{"jsonrpc":"2.0","id":1,"result":"0x7a69"} +``` + +Ten dev accounts are funded at genesis; account 0 is +`0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266`, the standard Hardhat account. Full table: +[CLI Reference](/reference/cli#dev-accounts). + +## 2. A minimal JSON-RPC helper + +Nothing here needs a library. `rpc.mjs`: + +```js +const ENDPOINT = process.env.ZEVM_RPC_URL ?? "http://127.0.0.1:8545"; + +let nextId = 1; + +export async function rpc(method, params = []) { + const response = await fetch(ENDPOINT, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ jsonrpc: "2.0", id: nextId++, method, params }), + }); + + if (!response.ok) { + throw new Error(`${method}: HTTP ${response.status}`); + } + + const body = await response.json(); + if (body.error) { + throw new Error(`${method}: ${body.error.code} ${body.error.message}`); + } + return body.result; +} +``` + +## 3. Snapshot and revert between tests + +`zevm_snapshot` captures the local chain, state and journal, receipt and log indexes, the pending +tx pool, mining and block-environment overrides, impersonation state, and time controls. +`zevm_revert` restores all of it and returns `false` for an unknown id. + +`test/setup.mjs`: + +```js +import { after, afterEach, beforeEach } from "node:test"; +import { rpc } from "../rpc.mjs"; + +let snapshotId; + +beforeEach(async () => { + snapshotId = await rpc("zevm_snapshot"); +}); + +afterEach(async () => { + const reverted = await rpc("zevm_revert", [snapshotId]); + if (reverted !== true) { + throw new Error(`revert to ${snapshotId} failed - test isolation is broken`); + } +}); + +after(async () => { + // Nothing to tear down: the node is external and stateless between runs. +}); +``` + +Snapshots do **not** capture light-mode consensus state and never mutate the remote fork source. + +## 4. A complete test + +`test/vault.test.mjs` deploys nothing and instead exercises the dev-control surface directly, so +it runs against a bare node: + +```js +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { rpc } from "../rpc.mjs"; +import "./setup.mjs"; + +const ALICE = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"; +const BOB = "0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; +const WHALE = "0x00000000000000000000000000000000000f00d5"; + +test("setBalance rewrites an account balance", async () => { + await rpc("zevm_setBalance", [WHALE, "0x21e19e0c9bab2400000"]); // 10,000 ETH + + const balance = await rpc("eth_getBalance", [WHALE, "latest"]); + assert.equal(BigInt(balance), 10_000n * 10n ** 18n); +}); + +test("an impersonated account can send a transaction", async () => { + await rpc("zevm_setBalance", [WHALE, "0x21e19e0c9bab2400000"]); + await rpc("zevm_impersonateAccount", [WHALE]); + + const txHash = await rpc("eth_sendTransaction", [ + { + from: WHALE, + to: BOB, + value: "0xde0b6b3a7640000", // 1 ETH + }, + ]); + + // Manual mining: the transaction sits in the pool until we mine. + const pendingBefore = await rpc("txpool_status"); + assert.equal(BigInt(pendingBefore.pending), 1n); + + await rpc("zevm_mine", [1]); + + const receipt = await rpc("eth_getTransactionReceipt", [txHash]); + assert.equal(receipt.status, "0x1"); + assert.equal(receipt.from.toLowerCase(), WHALE); + + await rpc("zevm_stopImpersonatingAccount", [WHALE]); +}); + +test("setCode installs bytecode that eth_call executes", async () => { + // PUSH1 0x2a PUSH1 0x00 MSTORE PUSH1 0x20 PUSH1 0x00 RETURN => returns 42 + const ANSWER = "0x602a60005260206000f3"; + const CONTRACT = "0x00000000000000000000000000000000c0de0001"; + + await rpc("zevm_setCode", [CONTRACT, ANSWER]); + + const result = await rpc("eth_call", [{ to: CONTRACT, data: "0x" }, "latest"]); + assert.equal(BigInt(result), 42n); +}); + +test("storage writes are visible to eth_getStorageAt", async () => { + const CONTRACT = "0x00000000000000000000000000000000c0de0002"; + const VALUE = "0x" + (7n).toString(16).padStart(64, "0"); + + await rpc("zevm_setStorageAt", [CONTRACT, "0x0", VALUE]); + + const stored = await rpc("eth_getStorageAt", [CONTRACT, "0x0", "latest"]); + assert.equal(BigInt(stored), 7n); +}); + +test("time travel moves the next block timestamp forward", async () => { + const before = await rpc("eth_getBlockByNumber", ["latest", false]); + + await rpc("zevm_increaseTime", ["0x15180"]); // +1 day + await rpc("zevm_mine", [1]); + + const after = await rpc("eth_getBlockByNumber", ["latest", false]); + assert.ok(BigInt(after.timestamp) - BigInt(before.timestamp) >= 86_400n); +}); + +test("snapshot isolation actually isolates", async () => { + // ALICE was never touched by the tests above, thanks to afterEach revert. + const balance = await rpc("eth_getBalance", [ALICE, "latest"]); + assert.equal(BigInt(balance), 10_000n * 10n ** 18n); +}); +``` + +Run it: + +```bash +node --test test/ +``` + +## 5. Testing against forked mainnet + +Point the node at an upstream RPC and pin the block so results are reproducible: + +```bash +zevm --mode trusted \ + --mining manual \ + --fork-url https://eth-mainnet.example/v2/KEY \ + --fork-block-number 21000000 +``` + +Now `zevm_dealErc20` gives any address a token balance without hunting for a whale: + +```js +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { rpc } from "../rpc.mjs"; +import "./setup.mjs"; + +const USDC = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; +const ME = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"; +const SPENDER = "0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; + +// balanceOf(address) +function balanceOfCalldata(address) { + return "0x70a08231" + address.slice(2).toLowerCase().padStart(64, "0"); +} + +test("dealErc20 mints a USDC balance on the fork", async () => { + await rpc("zevm_dealErc20", [USDC, ME, "0x3b9aca00"]); // 1000 USDC (6 decimals) + + const result = await rpc("eth_call", [ + { to: USDC, data: balanceOfCalldata(ME) }, + "latest", + ]); + assert.equal(BigInt(result), 1_000_000_000n); +}); + +test("setErc20Allowance grants an approval without a transaction", async () => { + await rpc("zevm_setErc20Allowance", [USDC, ME, SPENDER, "0x3b9aca00"]); + + // allowance(address,address) + const data = + "0xdd62ed3e" + + ME.slice(2).toLowerCase().padStart(64, "0") + + SPENDER.slice(2).toLowerCase().padStart(64, "0"); + + const result = await rpc("eth_call", [{ to: USDC, data }, "latest"]); + assert.equal(BigInt(result), 1_000_000_000n); +}); +``` + +`zevm_reset` re-forks at a new block mid-suite when you need a different pin, and +`zevm_setRpcUrl` swaps the fork source. See +[Forked Dev Node](/quickstart/forked-dev-node) and +[State, Fork & Snapshots](/concepts/state-fork-and-snapshots). + +## 6. Mining strategy per suite shape + +| Suite shape | Flag | Behaviour | +| --- | --- | --- | +| Unit-style, deterministic block boundaries | `--mining manual` | Blocks only on `zevm_mine` / `evm_mine`. | +| Integration-style, "just work" | `--mining auto` (default) | One block per submitted transaction. | +| Time-dependent protocols | `--mining interval --block-time 2` | A block every 2 seconds. | + +You can also switch at runtime with `zevm_setAutomine` and `zevm_setIntervalMining`. + +## Common errors + +| Error | Meaning | +| --- | --- | +| `-32602` | Malformed address, quantity, bytes, selector, tuple length, or object field. | +| `-32010` | You called a trusted-mode dev control while running in light mode. | +| `zevm_revert` → `false` | Unknown snapshot id — usually a snapshot already consumed by an earlier revert. | + +The full method-by-method contract is in +[Dev Controls](/reference/json-rpc/dev-controls) and +[Method Support By Mode](/concepts/method-support-by-mode). diff --git a/site/src/pages/guides/embedding-c-abi.mdx b/site/src/pages/guides/embedding-c-abi.mdx new file mode 100644 index 0000000..0816c93 --- /dev/null +++ b/site/src/pages/guides/embedding-c-abi.mdx @@ -0,0 +1,200 @@ +--- +title: Embedding The C ABI +description: A complete C program that syncs the ZEVM light client and reads verified state. +--- + +# Embedding The C ABI + +This guide builds the ZEVM static library, compiles a C program against it, and reads a +proof-verified balance. Everything here is complete and runnable — no elisions. + +## 1. Build the library and header + +From a ZEVM checkout (see [Building From Source](/guides/building-from-source) for prerequisites): + +```bash +zig build c-ffi -Doptimize=ReleaseSafe +``` + +That produces: + +```text +zig-out/include/zevm.h +zig-out/lib/libzevm.a +zig-out/lib/libzevm.dylib # .so on Linux, .dll on Windows +``` + +## 2. Write the program + +`light.c`: + +```c +#include +#include +#include +#include + +#include "zevm.h" + +static const char *ADDRESS = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"; + +int main(int argc, char **argv) { + if (argc != 3) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 2; + } + + if (zevm_abi_version() != ZEVM_ABI_VERSION) { + fprintf(stderr, "ABI mismatch: header %u, library %u\n", + (unsigned)ZEVM_ABI_VERSION, zevm_abi_version()); + return 1; + } + printf("zevm %s (abi %u), network %s\n", + zevm_version(), zevm_abi_version(), + zevm_light_network_name(ZEVM_NETWORK_MAINNET)); + + ZevmHandle *handle = zevm_light_init(ZEVM_NETWORK_MAINNET, argv[1], argv[2]); + if (handle == NULL) { + fprintf(stderr, "zevm_light_init failed\n"); + return 1; + } + + /* Drive the consensus sync until the client has a verified header. + This blocks on HTTP; in a real app run it on a background thread. */ + for (int attempt = 0; attempt < 120; attempt++) { + if (zevm_light_status(handle) == ZEVM_STATUS_SYNCED) break; + + int rc = zevm_light_sync_step(handle); + if (rc != ZEVM_OK) { + fprintf(stderr, "sync_step: %s (%s)\n", + zevm_error_message(rc), zevm_light_last_error(handle)); + sleep(1); + } + } + + if (zevm_light_status(handle) != ZEVM_STATUS_SYNCED) { + fprintf(stderr, "client did not reach ZEVM_STATUS_SYNCED\n"); + zevm_light_shutdown(handle); + return 1; + } + + /* Balance: 80 bytes is always sufficient per the header contract. */ + char balance[80]; + size_t balance_len = sizeof(balance); + int rc = zevm_light_get_balance(handle, ADDRESS, 0, balance, &balance_len); + if (rc != ZEVM_OK) { + fprintf(stderr, "get_balance: %s (%s)\n", + zevm_error_message(rc), zevm_light_last_error(handle)); + zevm_light_shutdown(handle); + return 1; + } + printf("balance(%s) = %s\n", ADDRESS, balance); + + uint64_t nonce = 0; + rc = zevm_light_get_transaction_count(handle, ADDRESS, 0, &nonce); + if (rc == ZEVM_OK) { + printf("nonce(%s) = %llu\n", ADDRESS, (unsigned long long)nonce); + } + + /* Storage: 67 bytes is always sufficient (0x + 64 hex digits + NUL). */ + char slot_value[67]; + size_t slot_len = sizeof(slot_value); + rc = zevm_light_get_storage( + handle, + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", /* USDC */ + "0x0", + 0, + slot_value, + &slot_len); + if (rc == ZEVM_OK) { + printf("storage slot 0 = %s\n", slot_value); + } + + zevm_light_shutdown(handle); + return 0; +} +``` + +## 3. Handle a growing buffer + +Code length is unbounded, so `zevm_light_get_code` is the one call where you should expect +`ZEVM_ERR_BUFFER_TOO_SMALL` and retry with the size it reports: + +```c +static int read_code(ZevmHandle *handle, const char *address, + uint8_t **out_buf, size_t *out_len) { + size_t capacity = 4096; + uint8_t *buf = malloc(capacity); + if (buf == NULL) return ZEVM_ERR_INTERNAL; + + size_t len = capacity; + int rc = zevm_light_get_code(handle, address, 0, buf, &len); + + if (rc == ZEVM_ERR_BUFFER_TOO_SMALL) { + uint8_t *grown = realloc(buf, len); + if (grown == NULL) { free(buf); return ZEVM_ERR_INTERNAL; } + buf = grown; + capacity = len; + rc = zevm_light_get_code(handle, address, 0, buf, &len); + } + + if (rc != ZEVM_OK) { free(buf); return rc; } + + *out_buf = buf; + *out_len = len; + return ZEVM_OK; +} +``` + +## 4. Compile and link + +macOS / Linux, static link: + +```bash +cc light.c \ + -I zig-out/include \ + zig-out/lib/libzevm.a \ + -o light +``` + +Dynamic link instead: + +```bash +cc light.c -I zig-out/include -L zig-out/lib -lzevm -o light +``` + +On Linux add `-Wl,-rpath,$PWD/zig-out/lib` (macOS: `-Wl,-rpath,@loader_path/zig-out/lib`) if you +link dynamically and want to run from the build directory. + +## 5. Run it + +```bash +./light https://beacon.example https://eth-mainnet.example/v2/KEY +``` + +Expected shape of the output: + +```text +zevm 0.1.0-beta.1 (abi 1), network mainnet +balance(0xd8da6bf26964af9d7eed9e03e53415d37aa96045) = 0x... +nonce(0xd8da6bf26964af9d7eed9e03e53415d37aa96045) = 1234 +storage slot 0 = 0x0000... +``` + +## Calling from other languages + +The ABI is plain C with no callbacks and no library-owned allocations to free, which makes it +straightforward to bind: + +- **Swift** — add `zig-out/include` as a system library target's header search path and link + `libzevm.a`. This is the ABI's original consumer, hence the caller-owned-buffer design. +- **Rust** — `bindgen` over `zevm.h`, `println!("cargo:rustc-link-lib=static=zevm")` and + `cargo:rustc-link-search=native=…/zig-out/lib` from `build.rs`. +- **Python** — `ctypes.CDLL("zig-out/lib/libzevm.dylib")` with `ctypes.create_string_buffer(80)` + for the balance output and `ctypes.c_size_t` for `out_len`. +- **Node.js** — don't bind it yourself; use the shipped N-API addon, + [`@evmts/zevm`](/reference/node-api). + +Whatever the host, the three rules from the [C ABI reference](/reference/c-abi) still apply: +serialize calls per handle, pass capacity in `*out_len`, and copy `zevm_light_last_error` before +the next call. diff --git a/site/src/pages/guides/node-light-client.mdx b/site/src/pages/guides/node-light-client.mdx new file mode 100644 index 0000000..8942951 --- /dev/null +++ b/site/src/pages/guides/node-light-client.mdx @@ -0,0 +1,227 @@ +--- +title: Embedding The Light Client In Node.js +description: Sync and query the ZEVM light client from Node.js with @evmts/zevm. +--- + +# Embedding The Light Client In Node.js + +`@evmts/zevm` ships the light client as a native N-API addon. There is no server and no subprocess +— the client runs in your process and verifies every read against a beacon header it synced +itself. + +## Prerequisites + +- Node.js `>=22` +- A beacon-chain (consensus-layer) HTTP API URL +- An execution-layer JSON-RPC URL, used as the *untrusted* proof source + +```bash +npm install @evmts/zevm@beta +``` + +## A complete program + +`light.mjs`: + +```js +import { + LightClient, + ZEVM_NETWORK_MAINNET, + ZEVM_STATUS_SYNCED, + abiVersion, + version, + networkName, + errorMessage, +} from "@evmts/zevm"; + +const BEACON_RPC_URL = process.env.BEACON_RPC_URL; +const EXECUTION_RPC_URL = process.env.EXECUTION_RPC_URL; + +if (!BEACON_RPC_URL || !EXECUTION_RPC_URL) { + console.error("set BEACON_RPC_URL and EXECUTION_RPC_URL"); + process.exit(2); +} + +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +console.log( + `zevm ${version()} (abi ${abiVersion()}) on ${networkName(ZEVM_NETWORK_MAINNET)}`, +); + +const client = new LightClient( + ZEVM_NETWORK_MAINNET, + BEACON_RPC_URL, + EXECUTION_RPC_URL, +); + +try { + // syncStep() blocks the calling thread on HTTP. Yield between attempts so + // the event loop is not starved, and give up rather than spinning forever. + for (let attempt = 0; attempt < 120; attempt++) { + if (client.status() === ZEVM_STATUS_SYNCED) break; + + const code = client.syncStep(); + if (code !== 0) { + console.warn(`sync step: ${errorMessage(code)} - ${client.lastError()}`); + } + await sleep(1000); + } + + if (client.status() !== ZEVM_STATUS_SYNCED) { + throw new Error(`client never synced: ${client.lastError()}`); + } + + const vitalik = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"; + const usdc = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; + + console.log("balance:", client.getBalance(vitalik)); + console.log("nonce: ", client.getTransactionCount(vitalik)); + + const code = client.getCode(usdc); + console.log("usdc code bytes:", code.length); + + console.log("usdc slot 0:", client.getStorage(usdc, "0x0")); +} finally { + client.close(); +} +``` + +Run it: + +```bash +BEACON_RPC_URL=https://beacon.example \ +EXECUTION_RPC_URL=https://eth-mainnet.example/v2/KEY \ +node light.mjs +``` + +## Keeping a client alive in a service + +`syncStep()` is synchronous and blocking, so a long-lived service should not call it on the main +thread. Push it into a worker and forward answers back: + +`light-worker.mjs`: + +```js +import { parentPort, workerData } from "node:worker_threads"; +import { LightClient, ZEVM_STATUS_SYNCED } from "@evmts/zevm"; + +const client = new LightClient( + workerData.network, + workerData.beaconRpcUrl, + workerData.executionRpcUrl, +); + +let running = true; + +function pump() { + if (!running) return; + client.syncStep(); + parentPort.postMessage({ type: "status", status: client.status() }); + setTimeout(pump, client.status() === ZEVM_STATUS_SYNCED ? 12_000 : 1_000); +} + +parentPort.on("message", (message) => { + if (message.type === "shutdown") { + running = false; + client.close(); + parentPort.close(); + return; + } + + if (message.type === "getBalance") { + try { + parentPort.postMessage({ + type: "balance", + id: message.id, + address: message.address, + balance: client.getBalance(message.address), + }); + } catch (error) { + parentPort.postMessage({ + type: "error", + id: message.id, + message: error.message, + lastError: client.lastError(), + }); + } + } +}); + +pump(); +``` + +`service.mjs`: + +```js +import { Worker } from "node:worker_threads"; +import { ZEVM_NETWORK_MAINNET, ZEVM_STATUS_SYNCED } from "@evmts/zevm"; + +const worker = new Worker(new URL("./light-worker.mjs", import.meta.url), { + workerData: { + network: ZEVM_NETWORK_MAINNET, + beaconRpcUrl: process.env.BEACON_RPC_URL, + executionRpcUrl: process.env.EXECUTION_RPC_URL, + }, +}); + +let synced = false; +let nextId = 0; +const pending = new Map(); + +worker.on("message", (message) => { + if (message.type === "status") { + synced = message.status === ZEVM_STATUS_SYNCED; + return; + } + + const resolvers = pending.get(message.id); + if (!resolvers) return; + pending.delete(message.id); + + if (message.type === "error") resolvers.reject(new Error(message.message)); + else resolvers.resolve(message.balance); +}); + +export function isSynced() { + return synced; +} + +export function getBalance(address) { + const id = nextId++; + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }); + worker.postMessage({ type: "getBalance", id, address }); + }); +} + +export function shutdown() { + worker.postMessage({ type: "shutdown" }); +} +``` + +One `LightClient` per worker: calls on a single handle are not internally synchronized, so never +share a handle across threads. + +## Using a locally built addon + +Point `ZEVM_NATIVE_PATH` at your own build to bypass platform-package resolution entirely: + +```bash +zig build npm-platform-artifacts -Doptimize=ReleaseSafe +ZEVM_NATIVE_PATH="$PWD/zig-out/npm/native/zevm.node" node light.mjs +``` + +## Failure modes worth handling + +| Symptom | Cause | Fix | +| --- | --- | --- | +| `No ZEVM native addon found for ` at import | No prebuild for this platform/libc | Check the supported list in [Node.js API](/reference/node-api); build locally and set `ZEVM_NATIVE_PATH`. | +| `Error: ZEVM light client is closed` | Read after `close()` | Guard reads, or create a fresh client. | +| Reads fail while `status()` is not `SYNCED` | The client refuses unverified answers | Keep calling `syncStep()`; check `lastError()`. | +| A read for an older block fails | Only the verified optimistic/finalized header is servable | Pass `0` for the latest verified head. | + +## Not what you wanted? + +If you need a *writable* dev node rather than verified mainnet reads, run the `zevm` binary in +trusted mode and talk JSON-RPC to it — see +[Testing Contracts Against ZEVM](/guides/contract-testing). diff --git a/site/src/pages/index.mdx b/site/src/pages/index.mdx new file mode 100644 index 0000000..82833cc --- /dev/null +++ b/site/src/pages/index.mdx @@ -0,0 +1,87 @@ +--- +title: ZEVM +description: A Zig Ethereum client with a writable trusted dev node and a proof-backed light client. +--- + +# ZEVM + +ZEVM is an Ethereum client written in Zig. It runs in exactly two modes: + +- **Trusted mode** — a writable local development node. Deterministic dev accounts, mining + controls, transaction submission, state snapshots, and direct state mutation over JSON-RPC. + Forking a remote chain is trusted-mode *configuration*, not a third mode. +- **Light mode** — a read-only client whose answers are anchored to consensus. Balances, nonces, + code, and storage are served from `eth_getProof` responses verified against a beacon-chain + header the client synced itself. + +Both modes speak HTTP JSON-RPC on `127.0.0.1:8545` by default. The same engine is also shipped as +a C static/shared library and as a Node.js N-API addon, so you can embed the light client without +running a server at all. + +## Why it exists + +Existing dev nodes ask you to trust them. Existing light clients are hard to embed. ZEVM is one +codebase that covers both ends: + +- **A dev node you can script.** `zevm_*` methods (with `anvil_*` and `evm_*` aliases) let a test + suite set balances, mint ERC-20 balances, impersonate accounts, jump time, mine on demand, and + snapshot/revert — the surface a forked-mainnet test needs. +- **Reads you don't have to trust.** In light mode ZEVM syncs the beacon chain from a checkpoint, + then verifies every execution-layer read against a Merkle proof rooted in the verified header. + A lying RPC provider gets rejected rather than believed. +- **Embeddable, not just runnable.** [`zevm.h`](/reference/c-abi) is a small caller-owned-buffer C + ABI for hosts like Swift or Rust; [`@evmts/zevm`](/reference/node-api) is the same thing for + Node.js, with prebuilt binaries for macOS, Linux (glibc and musl), and Windows. +- **Thin by design.** ZEVM does not re-implement the EVM. Execution primitives come from + [voltaire](https://github.com/evmts/voltaire), the interpreter from + [guillotine-mini](https://github.com/evmts/guillotine-mini). ZEVM owns the product shell: CLI, + config, modes, transport, dispatch, and checkpoint wiring. See + [Architecture & Upstream Ownership](/concepts/architecture-and-upstream-ownership). + +## Install + +```bash +npm install @evmts/zevm@beta +``` + +Or build the binary from source — see [Installation](/quickstart/installation) and +[Building From Source](/guides/building-from-source). + +## Start a dev node + +```bash +zevm --mode trusted --host 127.0.0.1 --port 8545 +``` + +```bash +curl -s http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' +``` + +```json +{"jsonrpc":"2.0","id":1,"result":"0x7a69"} +``` + +`0x7a69` is 31337, the default dev chain id. + +## Where to go next + +| If you want to… | Read | +| --- | --- | +| Get a node running locally | [Installation](/quickstart/installation) | +| Fork mainnet for tests | [Forked Dev Node](/quickstart/forked-dev-node) | +| Run a verifying light client | [Run Light Mode](/quickstart/run-light-mode) | +| Drive it from a test suite | [Testing Contracts Against ZEVM](/guides/contract-testing) | +| Embed it in Node.js | [Embedding The Light Client In Node.js](/guides/node-light-client) | +| Embed it in C/Swift/Rust | [Embedding The C ABI](/guides/embedding-c-abi) | +| Know every flag | [CLI Reference](/reference/cli) | +| Know every RPC method | [JSON-RPC Overview](/reference/json-rpc/overview) | +| Understand how this fits tevm | [Ecosystem](/ecosystem) | + +## Status + +ZEVM is pre-1.0. The first real release is `0.1.0-beta.1`; the public API and native ABI are +usable, but cross-platform packaging still wants consumer feedback. Phase-1 scope means HTTP +JSON-RPC only — no built-in TLS and no JSON-RPC authentication. Keep `--host 127.0.0.1` unless you +have put a reverse proxy in front of it. diff --git a/site/src/pages/quickstart/forked-dev-node.mdx b/site/src/pages/quickstart/forked-dev-node.mdx new file mode 100644 index 0000000..b39728d --- /dev/null +++ b/site/src/pages/quickstart/forked-dev-node.mdx @@ -0,0 +1,114 @@ +--- +title: Forked Dev Node +description: Run trusted mode with an upstream fork and validate local overlay behavior. +--- + +# Forked Dev Node + +A forked dev node is still trusted mode. ZEVM keeps local state and mining, and uses the upstream RPC as a backing read source. + +> Prerequisite: complete [Installation](/quickstart/installation) first, including Zig package fetch and a successful source build that produces `./zig-out/bin/zevm`. + +## 1. Start Trusted Mode With A Fork + +Before running fork startup commands, re-check [Installation](/quickstart/installation) prerequisites: Zig, Rust/Cargo, package-manager dependency pins, and the pinned build tuple in release `release-tuple.json` from [ZEVM release metadata](https://github.com/evmts/zevm/releases). For contract source ownership and docs-first change flow, see [Canonical Specs And Docs-First Process](/reference/specs-and-process). + +Pinned fork: + +```bash +./zig-out/bin/zevm \ + --mode trusted \ + --fork-url https://rpc.example \ + --fork-block-number 22000000 \ + --mining manual +``` + +Follow upstream latest instead of pinning: + +```bash +./zig-out/bin/zevm --mode trusted --fork-url https://rpc.example +``` + +## 2. Confirm Forked Runtime State + +Check local chain identity (trusted default chain ID remains `31337` unless changed): + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' +``` + +Check node metadata for fork status: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":2,"method":"zevm_metadata","params":[]}' +``` + +`zevm_metadata` reports whether forking is enabled and includes `forkUrl` and `forkBlockNumber`. + +## 3. Validate Local Overlay Behavior + +Take a snapshot: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":3,"method":"zevm_snapshot","params":[]}' +``` + +Set local balance for an account: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{ + "jsonrpc":"2.0", + "id":4, + "method":"zevm_setBalance", + "params":[ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x8ac7230489e80000" + ] + }' +``` + +Read the same account: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{ + "jsonrpc":"2.0", + "id":5, + "method":"eth_getBalance", + "params":["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266","latest"] + }' +``` + +Set `SNAPSHOT_ID` to the `result` returned by `zevm_snapshot`, then revert: + +```bash +SNAPSHOT_ID=0x1 # use the snapshot id returned by zevm_snapshot + +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":6,"method":"zevm_revert","params":["'"$SNAPSHOT_ID"'"]}' +``` + +## Fork Rules + +- `--fork-block-number` without `--fork-url` is a startup failure. +- `--fork-url` without `--fork-block-number` follows upstream head by default. +- Forking does not create a third mode and does not implicitly change `chainId`. +- Writes, mining, snapshots, and impersonation remain local to ZEVM. + +## Next Steps + +- [Run Trusted Mode](/quickstart/run-trusted-mode) +- [Run Light Mode](/quickstart/run-light-mode) +- [State Fork And Snapshots](/concepts/state-fork-and-snapshots) +- [Trusted-Mode Configuration](/reference/configuration/trusted-mode) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) diff --git a/site/src/pages/quickstart/installation.mdx b/site/src/pages/quickstart/installation.mdx new file mode 100644 index 0000000..7e6f40e --- /dev/null +++ b/site/src/pages/quickstart/installation.mdx @@ -0,0 +1,125 @@ +--- +title: Installation +description: Build ZEVM from source and run it locally. +--- + +# Installation + +ZEVM can be built from source or from release artifact jobs. Source builds use Zig package-manager pins in `build.zig.zon`. + +## Prerequisites + +- Zig `0.15.2` or newer (`minimum_zig_version` in `build.zig.zon`) +- Rust/Cargo for Voltaire's Rust crypto archive +- Git +- Node `22` or newer for TypeScript/N-API package checks + +## Clone And Fetch Dependencies + +Clone ZEVM and let Zig fetch pinned package dependencies: + +```bash +mkdir -p ~/code/zevm-workspace +cd ~/code/zevm-workspace + +git clone git@github.com:evmts/zevm.git zevm +cd zevm +zig build --fetch +``` + +If you use HTTPS, replace the clone URLs accordingly. + +For canonical release-metadata reproducibility, use [Release Metadata Runbook](/reference/release-metadata-runbook). +That runbook is the authoritative phase-1 flow for selecting `releaseIdentifier`, validating `release-tuple.json` and `light-default-checkpoints.json`, handling metadata-invalid identifiers, and recording operator provenance. +Its default artifact output path (`.ops/release-metadata/$RELEASE_IDENTIFIER/`) is reused by [Run Light Mode](/quickstart/run-light-mode) when selecting startup checkpoints from release metadata defaults. + +## Optional: Pin Build Inputs From Release Tuple + +If you want a pinned source build without running the full runbook automation: + +1. Open the selected release on [ZEVM release metadata](https://github.com/evmts/zevm/releases) and fetch both `release-tuple.json` and `light-default-checkpoints.json` for the same `releaseIdentifier`. +2. Check out `zevm` to the pinned `zevmGitRevision`; `voltaireGitRevision` and `guillotineMiniGitRevision` are materialized through `build.zig.zon` URL pins. +3. Confirm local Zig matches tuple `zigVersion` with `zig version`. +4. Run `zig build dependency-preflight -- --voltaire-revision "$VOLTAIRE_REVISION" --guillotine-mini-revision "$GUILLOTINE_MINI_REVISION" --zig-version "$PINNED_ZIG_VERSION"`. +5. Keep `light-default-checkpoints.json` available for [Run Light Mode](/quickstart/run-light-mode#2-choose-startup-checkpoint-input) checkpoint selection. + +For canonical public reproducibility claims, do not stop at tuple pinning alone; complete the full [Release Metadata Runbook](/reference/release-metadata-runbook). + +## Build ZEVM + +From the `zevm` repository root: + +```bash +zig build --fetch +zig build +``` + +The executable is installed to: + +```text +./zig-out/bin/zevm +``` + +## Run ZEVM + +Run the installed binary directly: + +```bash +./zig-out/bin/zevm +``` + +Or run through Zig's `run` step and pass runtime flags after `--`: + +```bash +zig build run -- --mode trusted --host 127.0.0.1 --port 8545 +``` + +## Run Tests + +```bash +npm --prefix npm/zevm install --ignore-scripts +zig build test +zig build c-smoke +zig build npm-smoke +npm --prefix npm/zevm run typecheck +``` + +## Build Release Artifacts + +Build release-style artifacts for the selected target: + +```bash +zig build release-binaries -Doptimize=ReleaseSafe +zig build c-ffi -Doptimize=ReleaseSafe +zig build npm-platform-artifacts -Doptimize=ReleaseSafe +``` + +Outputs: + +```text +zig-out/dist//bin/zevm +zig-out/lib/libzevm.a +zig-out/lib/libzevm.* +zig-out/include/zevm.h +zig-out/npm/prebuilds//zevm.node +``` + +Multi-platform releases should run those commands in an OS/architecture matrix. Voltaire's Rust crypto archive is target-specific, so do not assume one host can produce every supported target without the matching Rust target and C toolchain. + +## Setup Notes + +- In this docs site, **phase 1** means the current public ZEVM contract: two runtime modes (`trusted`, `light`) and HTTP JSON-RPC only (no built-in TLS/auth). +- `build.zig.zon` must use immutable URL/hash dependency pins, not sibling path dependencies. +- Align `zevm`, `voltaire`, and `guillotine-mini` revisions through release tuple metadata before making reproducibility claims. +- For canonical release-metadata reproducibility, follow [Release Metadata Runbook](/reference/release-metadata-runbook) end-to-end. +- If the selected `releaseIdentifier` does not publish valid `release-tuple.json` and `light-default-checkpoints.json`, treat it as an unpublished source-build boundary in this workflow. +- Phase-1 limitation: ZEVM does not expose `releaseIdentifier` via runtime JSON-RPC or CLI; keep operator provenance records for release/build identity. +- ZEVM phase 1 serves JSON-RPC over plain HTTP only and does not provide built-in TLS or JSON-RPC authentication. +- Default RPC listener is `127.0.0.1:8545`; binding `--host` beyond localhost exposes RPC to reachable networks. +- Keep `--host 127.0.0.1` unless remote access is required; if remote access is required, restrict ingress and place TLS/auth in front of ZEVM (reverse proxy or gateway). + +## Next Steps + +- [Run Trusted Mode](/quickstart/run-trusted-mode) +- [Forked Dev Node](/quickstart/forked-dev-node) +- [Run Light Mode](/quickstart/run-light-mode) diff --git a/site/src/pages/quickstart/run-light-mode.mdx b/site/src/pages/quickstart/run-light-mode.mdx new file mode 100644 index 0000000..42cf385 --- /dev/null +++ b/site/src/pages/quickstart/run-light-mode.mdx @@ -0,0 +1,246 @@ +--- +title: Run Light Mode +description: Start ZEVM light mode, check readiness, and run proof-backed reads. +--- + +# Run Light Mode + +Light mode is ZEVM's read-only, proof-backed, consensus-anchored runtime. + +> Prerequisite: complete [Installation](/quickstart/installation) first, including Zig package fetch and a successful source build that produces `./zig-out/bin/zevm`. + +## 1. Start Light Mode + +Before startup, re-check [Installation](/quickstart/installation) prerequisites (Zig, Rust/Cargo, package-manager dependency pins, successful build). +For release/build reproducibility and metadata audit workflow, use [Release Metadata Runbook](/reference/release-metadata-runbook). + +Minimal startup: + +```bash +./zig-out/bin/zevm \ + --mode light \ + --network sepolia \ + --consensus-rpc-url https://beacon.example \ + --execution-rpc-url https://execution.example +``` + +Config-file startup equivalent (`mode.light`): + +```bash +./zig-out/bin/zevm --config ./zevm.config.json +``` + +```json +{ + "mode": { + "light": { + "network": "sepolia", + "consensusRpcUrl": "https://beacon.example", + "executionRpcUrl": "https://execution.example" + } + } +} +``` + +Security baseline: + +- keep `--host 127.0.0.1` unless remote access is required +- if remote access is required, restrict ingress to trusted source IPs +- terminate TLS and enforce auth in a reverse proxy or gateway in front of ZEVM +- do not expose ZEVM RPC directly to the public Internet + +Operational startup notes: + +- supported light networks are `mainnet`, `sepolia`, `holesky` +- examples on this page use `sepolia`; keep `--network`, `--consensus-rpc-url`, `--execution-rpc-url`, and `checkpointDir` for the same network +- `--consensus-rpc-url` must be a Beacon API for the same selected network +- `--execution-rpc-url` must be an execution JSON-RPC endpoint that serves `eth_getProof` and `eth_getCode` for the same selected network +- startup validation runs before listener bind (consensus/network handshake + checkpoint/network checks) +- handshake root checks use the [canonical chain-id/genesis-root mapping](/reference/configuration/light-mode#canonical-chain-id-and-genesis-root-mapping) +- startup always calls `GET /eth/v1/beacon/genesis` and validates `data.genesis_validators_root` against `network`; any handshake failure or root mismatch exits before listener bind + +Canonical chain-id/genesis-root mapping for supported light networks: + +| Network | `eth_chainId` | `genesis_validators_root` | +| --- | --- | --- | +| `mainnet` | `0x1` | `0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95` | +| `sepolia` | `0xaa36a7` | `0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078` | +| `holesky` | `0x4268` | `0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1` | + +Canonical startup/config contract: + +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [CLI And Config Field Map](/reference/configuration/light-mode#cli-and-config-field-map) +- [Validation Rules](/reference/configuration/light-mode#validation-rules) +- [Troubleshooting handshake failures](/quickstart/troubleshooting#light-mode-startup-handshake-checks) + +## 2. Choose Startup Checkpoint Input + +### Precedence + +Startup checkpoint precedence: + +1. `--checkpoint` (CLI), when provided +2. `mode.light.checkpoint` (config), when set to a non-null value +3. `checkpointDir/checkpoint` (persisted startup input) +4. baked default checkpoint for selected network + +When `--checkpoint` or a non-null `mode.light.checkpoint` is provided, that explicit input overrides `checkpointDir/checkpoint` for startup selection. A config value of `mode.light.checkpoint: null` is treated as absent. To use persisted startup source (`checkpointSource = "persisted"`), remove explicit checkpoint inputs. + +`checkpointSource` in `zevm_lightSyncStatus` reports which source won at startup: + +- `explicit`: selected from CLI `--checkpoint` or config `mode.light.checkpoint` +- `persisted`: selected from operator-managed `checkpointDir/checkpoint` +- `default`: selected from baked network default when explicit and persisted inputs are absent +- this value is startup-source metadata and remains stable for the process lifetime + +Reference callouts: + +- [Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) +- [Validation Rules](/reference/configuration/light-mode#validation-rules) +- [`zevm_lightSyncStatus` Result](/reference/json-rpc/verified-light-mode-reads#zevm_lightsyncstatus-result) + +Use the configuration reference above for these exact semantics: + +- checkpoint age derivation chain, including `checkpointTimeSeconds` and `age = max(0, startupTimeSeconds - checkpointTimeSeconds)` +- selected-source terminal behavior (no fallback to lower-precedence sources after selection) +- stale policy behavior (`strictCheckpointAge = false` warns and continues, `strictCheckpointAge = true` fails startup) + +### Source Format + +Compact source-to-format map: + +- CLI/config (`--checkpoint` or `mode.light.checkpoint`) -> checkpoint hash value (required format: `0x`-prefixed 32-byte hash / `Hash32`) +- persisted file (`checkpointDir/checkpoint`) -> 64 hex chars, no `0x` + +### Reuse Runbook Metadata Outputs + +If you already ran [Release Metadata Runbook](/reference/release-metadata-runbook), derive a network checkpoint from that runbook's `light-default-checkpoints.json` output: + +```bash +RELEASE_IDENTIFIER='' +NETWORK=sepolia +ARTIFACT_DIR=.ops/release-metadata/"$RELEASE_IDENTIFIER" + +RELEASE_DEFAULT_CHECKPOINT="$(jq -r --arg network "$NETWORK" '.defaults[$network] // empty' "$ARTIFACT_DIR/light-default-checkpoints.json")" + +test -n "$RELEASE_DEFAULT_CHECKPOINT" +printf '%s\n' "$RELEASE_DEFAULT_CHECKPOINT" | grep -Eq '^0x[0-9a-fA-F]{64}$' +``` + +Use that value in either startup path: + +- explicit source: pass `--checkpoint "$RELEASE_DEFAULT_CHECKPOINT"` (or `mode.light.checkpoint`) +- persisted source: write `${RELEASE_DEFAULT_CHECKPOINT#0x}` to `checkpointDir/checkpoint` (64 hex chars, no `0x`) + +Example with explicit checkpoint: + +```bash +./zig-out/bin/zevm \ + --mode light \ + --network sepolia \ + --consensus-rpc-url https://beacon.example \ + --execution-rpc-url https://execution.example \ + --checkpoint 0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef +``` + +### Seed Persisted Checkpoint + +When `--checkpoint-dir` and `mode.light.checkpointDir` are both unset, ZEVM resolves `checkpointDir` to `.zevm/checkpoints/`, so the default persisted startup path is `.zevm/checkpoints//checkpoint` (for this page: `.zevm/checkpoints/sepolia/checkpoint`). See [Light-Mode Configuration](/reference/configuration/light-mode#cli-and-config-field-map) for path-resolution details. + +If using persisted startup input, write 64 hex characters (no `0x`) to `checkpointDir/checkpoint`. This file is operator-managed startup input: ZEVM does not create, update, or delete it during runtime. Persisted startup input is considered only when both explicit checkpoint inputs (`--checkpoint`, `mode.light.checkpoint`) are absent. + +```bash +CHECKPOINT_DIR=.zevm/checkpoints/sepolia +CHECKPOINT_HEX=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + +mkdir -p "$CHECKPOINT_DIR" +printf '%s\n' "$CHECKPOINT_HEX" > "$CHECKPOINT_DIR/checkpoint" +``` + +```bash +trimmed="$(tr -d '[:space:]' < "$CHECKPOINT_DIR/checkpoint")" +printf '%s\n' "$trimmed" | grep -Eq '^[0-9a-fA-F]{64}$' +``` + +Then restart ZEVM and confirm `checkpointSource`/`lastCheckpoint` from `zevm_lightSyncStatus`. + +Full checkpoint and stale-policy contract: + +- [Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) +- [Persisted Checkpoint Startup-Input Contract](/reference/configuration/light-mode#persisted-checkpoint-startup-input-contract) +- [Release Metadata Runbook](/reference/release-metadata-runbook) + +## 3. Check Readiness With `zevm_lightSyncStatus` + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"zevm_lightSyncStatus","params":[]}' +``` + +Serving guidance: + +- wait for `ready = true` with `status = "synced"` before treating proof-backed reads as available +- `eth_chainId` is callable before readiness +- readiness is non-monotonic: after reaching `ready = true`, ZEVM can return to `ready = false` if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`) +- `status = "error"` requires operator remediation and process restart before expecting readiness-gated reads to recover + +Error-state recovery path (`status = "error"`): + +1. Verify `network`, `consensusRpcUrl`, `executionRpcUrl`, and checkpoint inputs (`--checkpoint`, `mode.light.checkpoint`, `checkpointDir/checkpoint`) for format/network mismatches. +2. Correct the underlying input/configuration issue. +3. Restart the ZEVM process. +4. Re-check `zevm_lightSyncStatus` and continue only after `status = "synced"` with `ready = true`. + +Canonical readiness semantics: + +- [Readiness And Proof Rules](/reference/json-rpc/verified-light-mode-reads#readiness-and-proof-rules) +- [`zevm_lightSyncStatus` Result](/reference/json-rpc/verified-light-mode-reads#zevm_lightsyncstatus-result) + +## 4. Verify Readiness-Gated Behavior + +Before ready, `eth_blockNumber` is unavailable: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":2,"method":"eth_blockNumber","params":[]}' +``` + +Once ready, the same call returns the light-mode `latest` head block number. + +Proof-backed read example: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{ + "jsonrpc":"2.0", + "id":3, + "method":"eth_getBalance", + "params":["0x0000000000000000000000000000000000000000","finalized"] + }' +``` + +Method-level read contract: + +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [Retained-history numeric selector contract](/reference/json-rpc/verified-light-mode-reads#retained-history-numeric-selector-contract) + +Canonical error map in light mode: + +- `-32011`: not ready for readiness-gated reads +- `-32014`: proof verification failed at an otherwise supported selector +- `-32015`: malformed data from upstream proof source + +## Next Steps + +- [Light Mode](/concepts/light-mode) +- [Method Support By Mode](/concepts/method-support-by-mode) +- [Runtime Modes](/concepts/runtime-modes) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [Configuration Overview](/reference/configuration/overview) +- [Release Metadata Runbook](/reference/release-metadata-runbook) +- [Troubleshooting](/quickstart/troubleshooting) diff --git a/site/src/pages/quickstart/run-trusted-mode.mdx b/site/src/pages/quickstart/run-trusted-mode.mdx new file mode 100644 index 0000000..f17549c --- /dev/null +++ b/site/src/pages/quickstart/run-trusted-mode.mdx @@ -0,0 +1,141 @@ +--- +title: Run Trusted Mode +description: Start ZEVM as a local trusted dev node and validate core RPC flows. +--- + +# Run Trusted Mode + +Trusted mode is ZEVM's writable local dev-node runtime. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> Prerequisite: complete [Installation](/quickstart/installation) first, including Zig package fetch and a successful source build that produces `./zig-out/bin/zevm`. + +## 1. Start The Node + +Before running startup commands, re-check [Installation](/quickstart/installation) prerequisites: Zig, Rust/Cargo, package-manager dependency pins, and the pinned build tuple in release `release-tuple.json` from [ZEVM release metadata](https://github.com/evmts/zevm/releases). For contract source ownership and docs-first change flow, see [Canonical Specs And Docs-First Process](/reference/specs-and-process). + +Default startup (trusted mode): + +```bash +./zig-out/bin/zevm +``` + +Equivalent explicit startup: + +```bash +./zig-out/bin/zevm --mode trusted --host 127.0.0.1 --port 8545 +``` + +Config-file startup equivalent (`mode.trusted`): + +```bash +./zig-out/bin/zevm --config ./zevm.config.json +``` + +```json +{ + "mode": { + "trusted": { + "mining": { "type": "auto" } + } + } +} +``` + +See [Configuration Overview](/reference/configuration/overview) for full config shape and CLI/config precedence. + +## 2. Verify Baseline RPC + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' +``` + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":2,"method":"eth_blockNumber","params":[]}' +``` + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":3,"method":"eth_accounts","params":[]}' +``` + +Default trusted-mode values: + +- `eth_chainId` returns `0x7a69` (`31337`) +- `eth_accounts` returns 10 managed dev accounts in index order +- `eth_coinbase` is the managed account at `coinbaseIndex` (default `0`) +- exact wallet contract (mnemonic, derivation path, addresses, private keys, and signing constraints): [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet) + +> Warning: managed dev-account keys are deterministic/public test keys. Use them only for local development; never use them in production or with real funds. + +## 3. Send A Local Transaction + +This sends `1 ETH` from managed account `0` to managed account `1`: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{ + "jsonrpc":"2.0", + "id":4, + "method":"eth_sendTransaction", + "params":[{ + "from":"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to":"0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "value":"0xde0b6b3a7640000" + }] + }' +``` + +Set `TX_HASH` to the `result` returned by `eth_sendTransaction`, then fetch the receipt: + +```bash +TX_HASH=0x... # use the tx hash returned by the previous call + +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":5,"method":"eth_getTransactionReceipt","params":["'"$TX_HASH"'"]}' +``` + +## 4. Manual Mining Flow (Optional) + +Start with manual mining: + +```bash +./zig-out/bin/zevm --mode trusted --mining manual +``` + +Mine one block on demand: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":6,"method":"zevm_mine","params":[]}' +``` + +Mine multiple blocks: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":7,"method":"zevm_mine","params":["0x3"]}' +``` + +## Validation Rules You Will Hit Most Often + +- `--block-time` is valid only with `--mining interval`. +- `--mining interval` requires `--block-time `. +- `coinbaseIndex` must be in `0..9`. + +## Next Steps + +- [Forked Dev Node](/quickstart/forked-dev-node) +- [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet) +- [ZEVM Controls](/reference/json-rpc/dev-controls) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) diff --git a/site/src/pages/quickstart/troubleshooting.mdx b/site/src/pages/quickstart/troubleshooting.mdx new file mode 100644 index 0000000..1b1a098 --- /dev/null +++ b/site/src/pages/quickstart/troubleshooting.mdx @@ -0,0 +1,240 @@ +--- +title: Troubleshooting +description: Diagnose common ZEVM build, startup, configuration, and RPC errors. +--- + +# Troubleshooting + +Before troubleshooting startup/runtime behavior, confirm [Installation](/quickstart/installation) prerequisites are satisfied (Zig version, Rust/Cargo, package-manager dependency fetch, and successful source build output at `./zig-out/bin/zevm`). + +## Capture Startup Logs (Phase 1) + +Phase 1 has no dedicated ZEVM startup log-level or log-path knobs in the public CLI/config contract. +Capture process `stderr` from your shell or service manager and inspect it for startup warnings/errors. + +Shell redirection example: + +```bash +./zig-out/bin/zevm --mode light --network sepolia --consensus-rpc-url https://beacon.example --execution-rpc-url https://execution.example \ + 1>./zevm.stdout.log \ + 2>./zevm.stderr.log +``` + +Systemd example: + +```bash +journalctl -u zevm.service -b --no-pager +``` + +When startup fails before listener bind (or warns about non-strict stale checkpoint policy), check captured `stderr` first. +For `--config` failures, the startup error record includes the config `path`, a `failureClass` such as `missing-file`, `malformed-json`, `schema`, or `validation`, and the underlying error name. + +## RPC Request Logs + +Runtime JSON-RPC request telemetry is emitted on process `stderr` as JSON log records with `scope = "rpc"`. +The record `message` uses stable key-value fields: + +```text +rpc_request method=eth_blockNumber id_present=true batch_size=1 status=success error_code=null duration_us=123 mode=trusted +``` + +Fields: + +| Field | Meaning | +| --- | --- | +| `method` | JSON-RPC method name, or `` / `` when no valid method exists | +| `id_present` | whether the request had a JSON-RPC `id` and expects a response | +| `batch_size` | `1` for single requests, batch item count for batch requests, or `0` for parse/envelope failures | +| `status` | `success`, `error`, or `notification` | +| `error_code` | JSON-RPC error code, or `null` | +| `duration_us` | server-side request handling duration in microseconds | +| `mode` | active runtime mode: `trusted`, `light`, or `unknown` | + +Request params and raw request bodies are not logged by default. + +## Runtime Event Logs + +Runtime events also use JSON log records on process `stderr`. Important scopes: + +| Scope | Events | +| --- | --- | +| `rpc` | listener bind/stop, accept failures, connection accept/close, timeout setup failures, connection failures, request telemetry | +| `mining` | interval mining start/stop/tick failures, mined block number/hash, included tx count, gas used, and remaining txpool counts | +| `txpool` | accepted `eth_sendTransaction` / `eth_sendRawTransaction` hash, sender, nonce, gas limit, txpool counts, and active mining mode | +| `consensus_sync` | light checkpoint selection, stale checkpoint warnings, sync status transitions, upstream request failures, proof verification failures, checkpoint advancement | +| `fork` | trusted fork upstream request/response failures by method | + +Logs intentionally omit raw JSON-RPC bodies, request params, private keys, raw transaction bytes, auth-bearing upstream URLs, and proof payload bodies. + +## Build And Startup Issues + +| Symptom | Likely cause | Fix | +| --- | --- | --- | +| `zig build` fails to resolve dependencies | Missing package fetch or stale manifest pin | Run `zig build --fetch`, then `zig build dependency-preflight -- --zig-version 0.15.2`; do not replace URL/hash pins with sibling paths | +| Startup fails with unknown flag | Unsupported CLI argument | Use only documented startup flags from configuration reference pages | +| Startup fails loading `--config` | Missing file, unreadable file, or malformed JSON | Use the reported path/failure class to fix the config file; ZEVM exits non-zero and does not fall back to defaults | +| Startup fails with `--mode` + `--config` mode mismatch | User-supplied `--mode` disagrees with the single selected config mode branch | Ensure exactly one mode branch is set in config and it matches `--mode` (`mode.trusted` with `--mode trusted`, `mode.light` with `--mode light`); see [Configuration Overview -> Mode-branch Rules](/reference/configuration/overview#mode-branch-rules) | +| Startup fails with `--mining interval` | Missing `--block-time` | Add `--block-time ` | +| Startup fails with `--block-time` | Mining mode is not `interval` | Use `--mining interval --block-time ` or remove `--block-time` | +| Startup fails with `--fork-block-number` | Missing `--fork-url` | Provide `--fork-url` whenever `--fork-block-number` is set | +| Light-mode startup fails | Missing `--consensus-rpc-url` | Provide a valid consensus RPC URL | +| Light-mode startup fails before RPC listener opens, and logs mention `/eth/v1/beacon/genesis` request/parse errors | Consensus endpoint is unreachable, non-Beacon, requires auth, returns non-`200`, or serves malformed genesis payload | Verify `consensusRpcUrl` reaches a Beacon API and that `GET /eth/v1/beacon/genesis` returns HTTP `200` with `data.genesis_validators_root`; see [Validation Rules](/reference/configuration/light-mode#validation-rules) and [Light-mode startup handshake checks](#light-mode-startup-handshake-checks) | +| Light-mode startup fails with genesis/root mismatch (selected `network` disagrees with returned `genesis_validators_root`) | Beacon endpoint serves a different network than configured `network` | Point `--consensus-rpc-url` to Beacon API for the same network or switch `--network` to match endpoint root; verify against [Validation Rules](/reference/configuration/light-mode#validation-rules) | +| Light-mode startup fails with checkpoint/network mismatch | Selected startup checkpoint does not match selected light network | Use a checkpoint for the selected network, or remove/replace explicit and persisted checkpoint inputs | +| Light-mode startup fails on checkpoint parsing | Bad explicit checkpoint or malformed `checkpointDir/checkpoint` file | Use a 32-byte `0x`-prefixed checkpoint for CLI/config; keep persisted file as 64 hex chars without `0x` | +| Light-mode startup logs a stale-checkpoint warning but still opens listener | `strictCheckpointAge = false` and checkpoint is older than `maxCheckpointAgeSeconds` | Confirm selected-source winner first, then recompute checkpoint age from the Beacon derivation chain (`checkpointTimeSeconds`, `age` formula) and refresh/tighten policy as needed. See [Light-Mode Configuration -> Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) and [Validation Rules](/reference/configuration/light-mode#validation-rules). | +| Light-mode startup fails for stale checkpoint | `strictCheckpointAge = true` and checkpoint is older than `maxCheckpointAgeSeconds` | Strict stale policy is startup-fatal (`-32012`). Verify selected-source/no-fallback behavior, derive `checkpointTimeSeconds` from Beacon genesis+header inputs, then use a newer checkpoint or relax strict age policy. See [Light-Mode Configuration -> Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) and [Validation Rules](/reference/configuration/light-mode#validation-rules). | + +## Light-Mode Startup Handshake Checks + +Light-mode startup performs a pre-listener network-validation handshake: + +1. `GET /eth/v1/beacon/genesis` +2. require HTTP `200` +3. require `data.genesis_validators_root` to parse as `Hash32` +4. require root match for selected `network` using the [canonical chain-id/root mapping](/reference/configuration/light-mode#canonical-chain-id-and-genesis-root-mapping) + +Quick check: + +```bash +CONSENSUS_RPC_URL=https://beacon.example +curl -sS "$CONSENSUS_RPC_URL/eth/v1/beacon/genesis" | jq . +``` + +Root-only check: + +```bash +CONSENSUS_RPC_URL=https://beacon.example +curl -sS "$CONSENSUS_RPC_URL/eth/v1/beacon/genesis" \ + | jq -r '.data.genesis_validators_root' +``` + +If startup fails at this handshake: + +- verify URL, DNS, TLS, auth headers/proxy requirements, and that endpoint is Beacon API (not execution JSON-RPC) +- verify returned root matches selected `--network` +- if behind a gateway, ensure it preserves Beacon path/version and response body shape +- re-check [Validation Rules](/reference/configuration/light-mode#validation-rules), then restart ZEVM + +## Stale-Checkpoint Debug Chain + +When troubleshooting stale-checkpoint warnings/failures, use this order: + +1. Confirm which source won startup selection (`explicit`, `persisted`, or `default`) via `zevm_lightSyncStatus.checkpointSource`. +2. Apply selected-source semantics: once a source is selected, ZEVM does not fall back to lower-precedence sources on selected-source validation/derivation failures. +3. Recompute age from the documented chain: + `checkpointTimeSeconds = genesisTimeSeconds + (checkpointSlot * 12)`, + `age = max(0, startupTimeSeconds - checkpointTimeSeconds)`. +4. Compare `age` to `maxCheckpointAgeSeconds`, then apply stale policy (`strictCheckpointAge = false` warns/continues, `true` fails startup with `-32012`). + +Reference contract links: + +- [Light-Mode Configuration -> Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence) +- [Light-Mode Configuration -> Validation Rules](/reference/configuration/light-mode#validation-rules) + +## Runtime RPC Error Codes + +| Code | Meaning | Typical fix | +| --- | --- | --- | +| `-32601` | Method not found | Check method name, spelling, and namespace | +| `-32602` | Invalid params | Validate tuple length, hex encoding, addresses, and block selectors | +| `-32010` | Unsupported in current mode | Use methods supported by the active runtime mode, or switch modes | +| `-32011` | Light mode not ready | Poll `zevm_lightSyncStatus` until `ready = true`; apply [Verified Light-Mode Reads readiness semantics](/reference/json-rpc/verified-light-mode-reads#readiness-and-proof-rules) | +| `-32014` | Proof verification failure | Retry with a supported selector and verify upstream consensus/execution inputs | +| `-32015` | Malformed data from upstream proof source | Check upstream RPC health and response format | + +## HTTP Transport Statuses (JSON-RPC) + +These HTTP statuses are transport-level behavior, not JSON-RPC error objects. + +| HTTP status | Meaning | Practical fixes | +| --- | --- | --- | +| `404` | Request path does not match the ZEVM JSON-RPC endpoint (`/`) | Send requests to `/` (for example `http://127.0.0.1:8545/`), remove extra path segments (`/rpc`, `/v1`, etc.), and check reverse-proxy path rewrites | +| `405` | Request to `/` used a method other than `POST` | Use `POST` for JSON-RPC calls; update client/proxy health checks that currently use `GET` on `/` | +| `415` | `POST /` request has missing/unsupported `Content-Type` | Set `Content-Type: application/json` (parameters like `application/json; charset=utf-8` are allowed) and ensure proxies do not strip or overwrite the header | +| `413` | Request body is larger than `8,388,608` bytes | Split the request, reduce batch size, or move oversized tooling payloads outside the JSON-RPC call | +| `204` | Notification-only request (or notification-only batch), so ZEVM returns no JSON-RPC body by design | Include an `id` if you expect a JSON-RPC response payload; keep notification calls id-less when no response is needed | + +Quick transport checks: + +```bash +# 404: wrong path +curl -i -X POST http://127.0.0.1:8545/rpc \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' + +# 405: wrong method +curl -i -X GET http://127.0.0.1:8545/ + +# 415: wrong content type +curl -i -X POST http://127.0.0.1:8545/ \ + -H 'content-type: text/plain' \ + --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' + +# 413: body larger than the fixed 8 MiB transport limit +python3 - <<'PY' | curl -i -X POST http://127.0.0.1:8545/ \ + -H 'content-type: application/json' \ + --data-binary @- +print(' ' * 8388609) +PY + +# 204: notification (no id) +curl -i -X POST http://127.0.0.1:8545/ \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[]}' +``` + +## Startup-Reserved Codes (Pre-Listener) + +These reserved codes describe startup validation failures before ZEVM opens the HTTP listener. They occur only during startup and are never returned in runtime JSON-RPC responses after the listener is open. + +| Code | Meaning | Typical fix | +| --- | --- | --- | +| `-32012` | Selected checkpoint too old under strict startup policy | Refresh checkpoint or relax strict age policy | +| `-32013` | Checkpoint input or persisted checkpoint is malformed/corrupt | Fix checkpoint input or persisted checkpoint file | + +## Quick Diagnostics + +Check chain ID: + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' +``` + +Check trusted-mode identity (`zevm_metadata`): + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":2,"method":"zevm_metadata","params":[]}' +``` + +Check light-mode identity/readiness (`zevm_lightSyncStatus`): + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":3,"method":"zevm_lightSyncStatus","params":[]}' +``` + +Interpretation: + +- `zevm_metadata` succeeds only in trusted mode (`-32010` in light mode) +- `zevm_lightSyncStatus` succeeds only in light mode (`-32010` in trusted mode) + +Validate JSON config locally: + +```bash +jq . /path/to/zevm.config.json +``` + +## Related Pages + +- [Run Light Mode](/quickstart/run-light-mode) +- [Configuration Overview](/reference/configuration/overview) +- [Trusted-Mode Configuration](/reference/configuration/trusted-mode) +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [JSON-RPC Overview](/reference/json-rpc/overview) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) diff --git a/site/src/pages/reference/c-abi.mdx b/site/src/pages/reference/c-abi.mdx new file mode 100644 index 0000000..02b2d9e --- /dev/null +++ b/site/src/pages/reference/c-abi.mdx @@ -0,0 +1,139 @@ +--- +title: C ABI +description: zevm.h - the caller-owned-buffer C interface to the ZEVM light client. +--- + +# C ABI + +`zevm.h` exposes a minimal, read-only adapter around the consensus-layer sync engine and the +`eth_getProof`-based execution verifier. It is intended for embedding in non-Zig hosts (Swift, +Rust, C++, …). The header is generated into `zig-out/include/zevm.h`; the source of truth is +`include/zevm.h` and `src/c_bindings.zig`. + +```bash +zig build c-ffi -Doptimize=ReleaseSafe +# zig-out/include/zevm.h +# zig-out/lib/libzevm.a +# zig-out/lib/libzevm.{dylib,so,dll} +``` + +## Contract rules + +- **Threading.** Calls on the same `ZevmHandle*` are not synchronized internally — the caller must + serialize them. Different handles may be used concurrently from different threads. +- **Memory.** Output buffers are caller-owned. For `*_len` parameters the caller passes the buffer + capacity in bytes and the function writes the number of bytes used. If the buffer is too small + the call returns `ZEVM_ERR_BUFFER_TOO_SMALL` and `*out_len` is set to the required size. +- **Error strings.** The pointer from `zevm_light_last_error` is owned by the handle and is valid + only until the next call on that handle. Copy it if you need to keep it. +- **Blocking I/O.** `zevm_light_sync_step` performs synchronous HTTP requests. Never call it on a + UI thread. + +## Versioning + +```c +#define ZEVM_ABI_VERSION 1 +uint32_t zevm_abi_version(void); +const char* zevm_version(void); +``` + +Check `zevm_abi_version() == ZEVM_ABI_VERSION` at startup. The macro is what your build compiled +against; the function is what the loaded library implements. A mismatch means a breaking ABI +change and you should refuse to proceed. + +## Constants + +Networks: + +| Macro | Value | +| --- | --- | +| `ZEVM_NETWORK_MAINNET` | 0 | +| `ZEVM_NETWORK_SEPOLIA` | 1 | +| `ZEVM_NETWORK_HOLESKY` | 2 | + +Return codes: + +| Macro | Value | Meaning | +| --- | --- | --- | +| `ZEVM_OK` | 0 | Success. | +| `ZEVM_ERR_INVALID_ARG` | 1 | Malformed address, slot, network, or NULL handle. | +| `ZEVM_ERR_NOT_SYNCED` | 2 | No verified header yet; keep calling `zevm_light_sync_step`. | +| `ZEVM_ERR_BUFFER_TOO_SMALL` | 3 | `*out_len` now holds the required capacity. | +| `ZEVM_ERR_NETWORK` | 4 | Beacon or execution RPC transport failure. | +| `ZEVM_ERR_PROOF` | 5 | Proof did not verify against the verified state root. | +| `ZEVM_ERR_BLOCK_UNAVAILABLE` | 6 | Requested block is not the verified optimistic/finalized header. | +| `ZEVM_ERR_INTERNAL` | 7 | Unexpected internal failure. | + +Sync status (returned by `zevm_light_status`, which never errors): + +| Macro | Value | +| --- | --- | +| `ZEVM_STATUS_NOT_SYNCED` | 0 | +| `ZEVM_STATUS_SYNCING` | 1 | +| `ZEVM_STATUS_SYNCED` | 2 | + +## Functions + +```c +const char* zevm_error_message(int code); +const char* zevm_light_network_name(int network); /* NULL for unknown */ +``` + +### Lifecycle + +```c +ZevmHandle* zevm_light_init( + int network, + const char* beacon_rpc_url, + const char* execution_rpc_url); + +void zevm_light_shutdown(ZevmHandle* handle); /* NULL-safe */ +``` + +`zevm_light_init` returns `NULL` on allocation failure or an invalid network selector. + +### Sync + +```c +int zevm_light_sync_step(ZevmHandle* handle); +int zevm_light_status(ZevmHandle* handle); +const char* zevm_light_last_error(ZevmHandle* handle); +``` + +The first `zevm_light_sync_step` performs the bootstrap from the network's default checkpoint plus +an initial finality/optimistic update. Subsequent calls run the engine's `advance` step. + +### Verified reads + +```c +int zevm_light_get_balance(ZevmHandle* handle, const char* address_hex, + uint64_t block_number, char* out_hex, size_t* out_len); + +int zevm_light_get_transaction_count(ZevmHandle* handle, const char* address_hex, + uint64_t block_number, uint64_t* out_count); + +int zevm_light_get_code(ZevmHandle* handle, const char* address_hex, + uint64_t block_number, uint8_t* out_buf, size_t* out_len); + +int zevm_light_get_storage(ZevmHandle* handle, const char* address_hex, + const char* slot_hex, uint64_t block_number, + char* out_hex, size_t* out_len); +``` + +Shared parameter semantics: + +- `address_hex` — NUL-terminated, `0x`-prefixed, 20-byte address. +- `slot_hex` — NUL-terminated, `0x`-prefixed slot key of any width. +- `block_number` — pass `0` for the latest verified head. Any other value must match the currently + verified optimistic or finalized header; otherwise the call returns + `ZEVM_ERR_BLOCK_UNAVAILABLE`. This is deliberate: the client will not serve a block it has not + verified. +- Balance output is a `0x`-prefixed lowercase hex string with no leading zero padding; **80 bytes + is always sufficient**. +- Storage output is a `0x`-prefixed 64-hex-digit string zero-padded to 32 bytes; **67 bytes is + always sufficient**. +- `out_len` is in/out for every buffer parameter, and the written length **includes the NUL + terminator** for string outputs. + +A complete compiling and linking example is in +[Embedding The C ABI](/guides/embedding-c-abi). diff --git a/site/src/pages/reference/canonical-specs.mdx b/site/src/pages/reference/canonical-specs.mdx new file mode 100644 index 0000000..81de2b9 --- /dev/null +++ b/site/src/pages/reference/canonical-specs.mdx @@ -0,0 +1,21 @@ +--- +title: Canonical Specs +description: Contract-source index for the authoritative ZEVM public spec files. +--- + +# Canonical Specs + +Use this page as the short index of ZEVM public contract sources. + +## Canonical Contract Sources + +- product and startup/runtime contract: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) +- exact JSON-RPC tuples and error mapping: [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md) + +If wording differs across public docs, treat `docs/specs/json-rpc-contract.md` as authoritative for API-level behavior. + +## Process And Policy + +- docs-first process source: [`docs/specs/docs-first-process.md`](https://github.com/evmts/zevm/blob/main/docs/specs/docs-first-process.md) +- process rules, release-metadata policy, and qualification intent: [Specs And Process](/reference/specs-and-process) +- release-specific metadata records and operator reproducibility flow: [Release Metadata Runbook](/reference/release-metadata-runbook) diff --git a/site/src/pages/reference/ci-and-release-gates.mdx b/site/src/pages/reference/ci-and-release-gates.mdx new file mode 100644 index 0000000..1d30ccd --- /dev/null +++ b/site/src/pages/reference/ci-and-release-gates.mdx @@ -0,0 +1,109 @@ +--- +title: CI And Release Gates +description: Maintainer map from local verification commands to GitHub Actions release gates. +--- + +# CI And Release Gates + +This page maps the local release-readiness commands to the root GitHub Actions workflow. + +## Local Gate Commands + +Run these from the `zevm/` checkout: + +```bash +zig build --fetch +zig build +zig build dependency-preflight -- --zig-version 0.15.2 +zig build verify-fast +zig build c-smoke +zig build npm-smoke +zig build release-binaries -Doptimize=ReleaseSafe +zig build npm-platform-artifacts -Doptimize=ReleaseSafe +npm --prefix npm/zevm install --ignore-scripts +npm --prefix npm/zevm run typecheck +npm --prefix npm/zevm run build +zig build qualification-check +zig build qualification-check -- --require-covered +zig build verify +``` + +`zig build dependency-preflight` validates that `build.zig.zon` uses immutable URL/hash pins for `voltaire` and `guillotine-mini`, rejects legacy sibling path dependencies, reports the pinned revisions, and can validate expected dependency revisions with `--voltaire-revision` and `--guillotine-mini-revision`. `zig build test` also runs the test-graph checker, which fails if any `src/**/*_test.zig` file is not reachable from `src/root.zig`. `zig build verify-fast` runs that default unit/integration test graph. `zig build c-smoke` validates the public C ABI header/library contract. `zig build npm-smoke` validates the local N-API addon through Node. `zig build release-binaries` and `zig build npm-platform-artifacts` build artifacts for the selected target; multi-platform release jobs run them in an OS/architecture matrix. `zig build qualification-check` validates the release qualification map schema and covered-row evidence references, but it does not execute the referenced behavioral tests by itself. `zig build verify` runs `verify-fast` and the active official external suite slices encoded in `tools/external_verify.zig`. + +## Smithers Workflow Tooling + +The local Smithers workflow workspace is managed separately from the Zig release gates: + +```bash +cd workflow +bun install --frozen-lockfile +bun run start +``` + +The workflow runner uses the package-managed Smithers CLI from `workflow/node_modules/.bin/smithers`, stores its local database under `workflow/`, and resumes the latest run when `workflow/zevm-build.db` exists. Run `bun run start` only when a maintainer wants the agent workflow to execute; it is not part of the Zig release gate. + +## Pull Request And Main Branch Gates + +The root `CI` workflow runs these checks for pull requests and pushes to `main`: + +- check out `zevm` +- install Zig `0.15.2` +- install Rust/Cargo, Node, and Perl for Voltaire's Rust crypto archive and npm checks +- run `zig build --fetch` +- run `zig build dependency-preflight -- --zig-version "$ZIG_VERSION"` +- run `zig build` +- run `zig build verify-fast` +- run `zig build c-smoke` +- run `zig build npm-smoke` +- run `zig build release-binaries -Doptimize=ReleaseSafe` +- run `zig build npm-platform-artifacts -Doptimize=ReleaseSafe` +- run `npm --prefix npm/zevm run typecheck` +- run `npm --prefix npm/zevm run build` +- run `zig build qualification-check` +- generate release metadata smoke artifacts with a commit-based release identifier +- fail if tracked files are dirtied by the gate + +## Release And Scheduled Gates + +Tag pushes, manual dispatches, and the weekly scheduled workflow run the official external verification job: + +```bash +zig build qualification-check -- --require-covered +zig build verify +``` + +This is the required CI path for release-candidate confidence. It currently verifies the active official suite coverage encoded in `tools/external_verify.zig`; it is not a claim that every Hive simulator or every Ethereum fixture directory is already fully active. + +Those same tag, manual, and scheduled workflows also run the Hive RPC compat smoke job described below. + +## Hive RPC Compat Smoke + +For the CI-friendly Hive lifecycle smoke, run: + +```bash +bun tools/hive_rpc_compat_smoke.ts +``` + +The script builds a local `zevm/hive-client:local` image from this checkout, lets Zig fetch package-manager dependencies inside that build, builds the Hive runner, and runs ZEVM through the full `ethereum/rpc-compat` transcript set by default. Set `ZEVM_HIVE_RPC_COMPAT_PATTERN` only when intentionally narrowing a local debug run. The client wrapper provides the Hive-required HTTP JSON-RPC port `8545`, translates Hive fork-schedule environment variables into ZEVM trusted-mode config, forwards mounted Hive `genesis.json` and `chain.rlp` into ZEVM startup when present, and exposes ZEVM's native Engine API listener on `8551`. + +CI runs this same command in the `Hive RPC Compat Smoke` job for tag pushes, manual dispatches, and the weekly scheduled workflow. + +The RPC compatibility run exercises every `ethereum/rpc-compat` transcript selected by the pinned execution-apis revision. This is narrower than full Hive release readiness: GraphQL, Engine API conformance, sync, devp2p discovery edge cases, and the larger execution-spec consensus fixtures are separate simulators and must be reported independently. Phase-1 `chain.rlp` handling remains query-oriented for imported history, while the Engine listener covers local payload build jobs, strict `newPayload` import for known local parents, `getPayload` by payload id, payload-body lookup, and null blob sidecar lookup for unavailable blobs. + +## Published Release Asset Gate + +When a GitHub release is published, CI validates the release metadata publication contract: + +- exactly one `release-tuple.json` asset exists +- exactly one `light-default-checkpoints.json` asset exists +- both assets have the expected schema version and field set +- both assets use the published release tag as `releaseIdentifier` +- `release-tuple.json.zevmGitRevision` equals the checked-out release tag commit +- tuple dependency revisions are 40-hex commit identifiers +- `build.zig.zon` pins Voltaire and Guillotine Mini archive URLs at the exact tuple revisions +- Zig is installed at the exact tuple `zigVersion` +- `zig build verify` and `zig build qualification-check -- --require-covered` pass against the materialized tuple +- `bun tools/hive_rpc_compat_smoke.ts` passes against the materialized tuple +- default light-mode checkpoints are 32-byte `0x` hashes for `mainnet`, `sepolia`, and `holesky` + +If any item fails, the release metadata is invalid for canonical reproducibility claims. diff --git a/site/src/pages/reference/cli.mdx b/site/src/pages/reference/cli.mdx new file mode 100644 index 0000000..9480f2a --- /dev/null +++ b/site/src/pages/reference/cli.mdx @@ -0,0 +1,155 @@ +--- +title: CLI Reference +description: Every zevm command-line flag, its type, its default, and which mode accepts it. +--- + +# CLI Reference + +```bash +zevm [flags] +``` + +Flags are parsed by `src/cli.zig` and resolved into an `AppConfig` by `src/config.zig`. Resolution +order is **CLI flag → config file value → built-in default**. An unknown flag, a flag missing its +value, or an unparseable value is a startup error, logged as `config_load_failed` with +`failureClass=cli` and a non-zero exit — ZEVM never silently ignores a flag. + +Running with a trusted-only flag while `--mode light` is selected (or vice versa) is also a +startup error rather than a warning. + +## Global + +| Flag | Type | Default | Notes | +| --- | --- | --- | --- | +| `--config ` | path | none | JSON config file. See [Configuration Overview](/reference/configuration/overview). | +| `--mode ` | enum | `trusted` | Runtime mode. See [Runtime Modes](/concepts/runtime-modes). | +| `--host ` | string | `127.0.0.1` | JSON-RPC listen host. | +| `--port ` | integer | `8545` | JSON-RPC listen port. | +| `--engine-host ` | string | same as `--host` | Engine API listen host. Only set if you pass an engine flag. | +| `--engine-port ` | integer | `8551` | Engine API listen port. | + +Binding `--host` to anything other than `127.0.0.1` exposes an unauthenticated, plaintext JSON-RPC +endpoint. Phase 1 ships no TLS and no auth. + +## Trusted mode + +Accepted only when the resolved mode is `trusted`. + +| Flag | Type | Default | Notes | +| --- | --- | --- | --- | +| `--chain-id ` | integer | `31337` | Reported by `eth_chainId`. | +| `--coinbase-index ` | integer | `0` | Index into the 10 dev accounts used as block coinbase. Must be `< 10`. | +| `--initial-balance ` | integer (wei) | `10000000000000000000000` (10,000 ETH) | Genesis balance for each dev account. | +| `--gas-price ` | integer (wei) | `2000000000` (2 gwei) | Reported by `eth_gasPrice`. | +| `--base-fee ` | integer (wei) | `1000000000` (1 gwei) | Genesis base fee. | +| `--blob-base-fee ` | integer (wei) | `1` | Reported by `eth_blobBaseFee`. | +| `--max-priority-fee-per-gas ` | integer (wei) | `1000000000` (1 gwei) | Reported by `eth_maxPriorityFeePerGas`. | +| `--block-gas-limit ` | integer | `30000000` | Per-block gas limit. | +| `--mining ` | enum | `auto` | `auto` mines one block per transaction; `manual` mines only on `zevm_mine`/`evm_mine`; `interval` mines on a timer. | +| `--block-time ` | integer | none | Required with `--mining interval`; rejected as an incomplete unit on its own. | +| `--fork-url ` | string | none | Upstream JSON-RPC to fork from. Turns the dev node into a forked node. | +| `--fork-block-number ` | integer | latest | Fork pin. Requires `--fork-url`. | +| `--genesis ` | path | none | Genesis allocation JSON to seed accounts. | +| `--chain-rlp ` | path | none | RLP chain file to import at startup. | + +`--mining`/`--block-time` and `--fork-url`/`--fork-block-number` are each validated as a unit: a +partial pairing is a config error, not a best-effort guess. + +## Light mode + +Accepted only when the resolved mode is `light`. + +| Flag | Type | Default | Notes | +| --- | --- | --- | --- | +| `--network ` | enum | `mainnet` | Selects the consensus network preset. | +| `--consensus-rpc-url ` | string | **required** | Beacon-chain HTTP API. Startup fails without it. | +| `--execution-rpc-url ` | string | none | Execution JSON-RPC used as the untrusted proof source. | +| `--checkpoint <0x…32 bytes>` | hex | from checkpoint store / release defaults | Trusted beacon checkpoint root to bootstrap from. | +| `--checkpoint-dir ` | path | `.zevm/checkpoints/` | Where synced checkpoints are cached. `` is substituted. | +| `--max-checkpoint-age-seconds ` | integer | `1209600` (14 days) | Age at which a checkpoint is considered stale. | +| `--strict-checkpoint-age[=true\|false]` | bool | `false` | When true, a stale checkpoint is fatal instead of a warning. | + +The execution-layer answer is only trusted after its `eth_getProof` result verifies against the +state root of a beacon-verified header. See +[Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads). + +## Examples + +Default dev node: + +```bash +zevm --mode trusted +``` + +Manual mining, custom chain id, one dev account as coinbase: + +```bash +zevm --mode trusted \ + --chain-id 1337 \ + --mining manual \ + --coinbase-index 1 \ + --block-gas-limit 60000000 +``` + +Two-second blocks: + +```bash +zevm --mode trusted --mining interval --block-time 2 +``` + +Forked mainnet pinned to a block: + +```bash +zevm --mode trusted \ + --fork-url https://eth-mainnet.example/v2/KEY \ + --fork-block-number 21000000 +``` + +Verifying light client on Sepolia: + +```bash +zevm --mode light \ + --network sepolia \ + --consensus-rpc-url https://beacon-sepolia.example \ + --execution-rpc-url https://eth-sepolia.example/v2/KEY \ + --checkpoint-dir ./.zevm/checkpoints/sepolia \ + --strict-checkpoint-age +``` + +Running from a source checkout without installing, passing flags through `zig build run`: + +```bash +zig build run -- --mode trusted --host 127.0.0.1 --port 8545 +``` + +## Dev accounts + +Trusted mode funds ten deterministic accounts with `--initial-balance` each. They are the +well-known Hardhat/Anvil test accounts, so existing test fixtures keep working: + +| Index | Address | +| --- | --- | +| 0 | `0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266` | +| 1 | `0x70997970c51812dc3a010c7d01b50e0d17dc79c8` | +| 2 | `0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc` | +| 3 | `0x90f79bf6eb2c4f870365e785982e1f101e93b906` | +| 4 | `0x15d34aaf54267db7d7c367839aaf71a00a2c6a65` | +| 5 | `0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc` | +| 6 | `0x976ea74026e726554db657fa54763abd0c3a0aa9` | +| 7 | `0x14dc79964da2c08b23698b3d3cc7ca32193d9955` | +| 8 | `0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f` | +| 9 | `0xa0ee7a142d267c1f36714e4a8f75612f20a79720` | + +These keys are public. Never fund them on a real network. Details: +[Managed Dev Wallet](/reference/json-rpc/managed-dev-wallet). + +## Exit behaviour + +Startup failures are emitted as a single JSON log line on stderr before exit, for example: + +```json +{"timestamp":1785372071,"level":"error","scope":"startup","message":"config load failed failureClass=cli error=InvalidConfig","event":"config_load_failed","failureClass":"cli","error":"InvalidConfig"} +``` + +`failureClass` distinguishes `cli` (bad flag), `io` (unreadable config file), and `validation` +(structurally valid but semantically rejected config). diff --git a/site/src/pages/reference/configuration/light-mode.mdx b/site/src/pages/reference/configuration/light-mode.mdx new file mode 100644 index 0000000..c2e32f8 --- /dev/null +++ b/site/src/pages/reference/configuration/light-mode.mdx @@ -0,0 +1,317 @@ +--- +title: Light-Mode Configuration +description: Light-mode fields, chain/network mapping, checkpoint selection, and validation. +--- + +# Light-Mode Configuration + +Light mode is read-only, proof-backed, and consensus-anchored. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For product-contract disputes, follow those normative sources. + +Phase-1 operator-facing startup inputs are `network`, `consensusRpcUrl`, and `executionRpcUrl`, plus optional checkpoint controls (`checkpoint`, `checkpointDir`, `maxCheckpointAgeSeconds`, `strictCheckpointAge`). +`executionRpcUrl` supplies the execution JSON-RPC source used for proof-backed reads. + +## Networks And Chain IDs + +Supported light networks are a closed phase-1 set: `mainnet`, `sepolia`, and `holesky`. +Adding or removing a supported light network is a normative public-contract change and requires coordinated updates to both [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +Canonical constants for `eth_chainId` and startup genesis-root validation are defined in [Canonical Chain ID And Genesis Root Mapping](#canonical-chain-id-and-genesis-root-mapping). + +## Canonical Chain ID And Genesis Root Mapping + +Use this mapping for both light-mode `eth_chainId` and startup handshake root validation. + +| Network | `eth_chainId` | `genesis_validators_root` | +| --- | --- | --- | +| `mainnet` | `0x1` | `0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95` | +| `sepolia` | `0xaa36a7` | `0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078` | +| `holesky` | `0x4268` | `0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1` | + +## CLI And Config Field Map + +| CLI flag | Config field | Type | Default | +| --- | --- | --- | --- | +| `--network` | `mode.light.network` | `mainnet`, `sepolia`, `holesky` | `mainnet` | +| `--consensus-rpc-url` | `mode.light.consensusRpcUrl` | Beacon API URL | required | +| `--execution-rpc-url` | `mode.light.executionRpcUrl` | Execution JSON-RPC URL with `eth_getProof`/`eth_getCode` | `consensusRpcUrl` | +| `--checkpoint` | `mode.light.checkpoint` | `0x`-prefixed 32-byte hash | none | +| `--checkpoint-dir` | `mode.light.checkpointDir` | directory path | `.zevm/checkpoints/` | +| `--max-checkpoint-age-seconds` | `mode.light.maxCheckpointAgeSeconds` | `u64` | `1209600` | +| `--strict-checkpoint-age` | `mode.light.strictCheckpointAge` | presence flag | `false` | + +Only explicitly supplied CLI flags override config values. CLI defaults are applied after CLI/config merge. +`checkpointDir` resolution contract for persisted startup input: + +1. resolve final `checkpointDir` after CLI/config merge (or default to `.zevm/checkpoints/` when not explicitly provided) +2. expand `` using the resolved light network +3. if `checkpointDir` is relative, resolve it against process current working directory to produce `resolvedCheckpointDir` +4. read persisted startup checkpoint input from `${resolvedCheckpointDir}/checkpoint` + +`checkpointDir`, `maxCheckpointAgeSeconds`, and `strictCheckpointAge` follow normal startup precedence (explicit CLI flag > config value > default). +Those three controls are not additional checkpoint-source steps; they parameterize persisted-input lookup and stale-policy evaluation. + +## RPC Exposure And Hardening + +ZEVM phase 1 serves JSON-RPC over plain HTTP only. ZEVM does not provide built-in TLS or JSON-RPC authentication. +`--host 127.0.0.1` keeps RPC local. +Binding `--host` to a non-loopback interface (for example, `0.0.0.0`) exposes RPC to reachable networks. + +Light-mode operator baseline for phase 1: + +1. keep ZEVM bound to loopback (`--host 127.0.0.1`) and expose only the proxy listener +2. terminate TLS and enforce authentication in the reverse proxy/gateway layer +3. allow only trusted source CIDRs at ingress, then enforce the same policy at host firewall +4. block direct access to ZEVM RPC (`8545`) from non-proxy sources + +Example ingress allowlist policy (proxy host with UFW): + +```bash +# Default deny for inbound traffic +ufw default deny incoming + +# Allow HTTPS only from trusted operator CIDRs +ufw allow from 203.0.113.10 to any port 443 proto tcp +ufw allow from 198.51.100.0/24 to any port 443 proto tcp + +# If ZEVM must bind non-loopback, only allow proxy/private source IPs to 8545 +ufw allow from 10.0.10.5 to any port 8545 proto tcp + +# Deny all other direct ZEVM RPC access +ufw deny 8545/tcp +``` + +Use source CIDRs that match your real operator network boundaries (VPN, bastion, private subnets). Keep ZEVM plain HTTP behind the proxy in phase 1. +For a concrete reverse-proxy config example, see [Configuration Overview -> RPC Exposure And Hardening](/reference/configuration/overview#rpc-exposure-and-hardening). + +## Checkpoint Selection Precedence + +1. user-supplied CLI checkpoint (`--checkpoint`), when provided +2. config checkpoint (`mode.light.checkpoint`), when set to a non-null value +3. persisted startup checkpoint input (`checkpointDir/checkpoint`) +4. baked network default checkpoint + +When either explicit checkpoint input is present (`--checkpoint` or non-null `mode.light.checkpoint`), persisted `checkpointDir/checkpoint` is not used for startup selection. A config value of `mode.light.checkpoint: null` is treated as absent. To use persisted startup source (`checkpointSource = "persisted"`), remove explicit checkpoint inputs. + +Checkpoint input format by source: + +| Source | Accepted startup input format | +| --- | --- | +| `--checkpoint` | `0x`-prefixed `Hash32` (32-byte hash) | +| `mode.light.checkpoint` | `0x`-prefixed `Hash32` (32-byte hash) | +| `checkpointDir/checkpoint` | 64 hex characters, no `0x` prefix | + +When step 1 or step 2 wins, `zevm_lightSyncStatus.checkpointSource` is `explicit` for both CLI-supplied and config-supplied checkpoints. +`checkpointSource` is startup-source metadata and does not change when `lastCheckpoint` advances. +`checkpointSource` interpretation: + +- `explicit`: selected from user-provided checkpoint input (`--checkpoint` or `mode.light.checkpoint`; CLI wins when both are set) +- `persisted`: selected from operator-managed `checkpointDir/checkpoint` +- `default`: selected baked network default after no explicit or persisted startup checkpoint input is present + +Operator runbook cross-link: [Run Light Mode -> Choose Startup Checkpoint Input](/quickstart/run-light-mode#2-choose-startup-checkpoint-input) and [Run Light Mode -> Check Readiness With `zevm_lightSyncStatus`](/quickstart/run-light-mode#3-check-readiness-with-zevm_lightsyncstatus). +This precedence is strict: CLI checkpoint > config checkpoint > persisted checkpoint file > baked default. +Selected-source validation is terminal: once precedence selects a checkpoint source, any validation/read/network failure for that selected source is a startup failure before listener bind (no fallback to lower-precedence sources). +If `resolvedCheckpointDir` is missing at startup (including after `` expansion), step 3 is treated as absent input and selection falls through by precedence. +If `${resolvedCheckpointDir}/checkpoint` is missing, step 3 is treated as absent input and selection falls through by precedence. +When CLI checkpoint, config checkpoint, and persisted `checkpointDir/checkpoint` are all absent, ZEVM selects the baked network default and `zevm_lightSyncStatus.checkpointSource` reports `default`. +The baked default checkpoint is a startup precedence input, not a frozen public compatibility constant. +Baked default values are bundled per ZEVM release/build and may rotate across releases. +For published release identifiers, release-specific baked defaults are published in `light-default-checkpoints.json`; see [Canonical Specs And Docs-First Process](/reference/specs-and-process#release-metadata-records), [Release Metadata Runbook](/reference/release-metadata-runbook), and [ZEVM release metadata](https://github.com/evmts/zevm/releases). +If a build has no published `light-default-checkpoints.json`, treat it as an unpublished source-build boundary and provide an explicit checkpoint when deterministic startup selection is required. +Phase-1 persisted checkpoint contract: `checkpointDir/checkpoint` is startup input only. ZEVM does not create, update, or delete it during runtime, and runtime `lastCheckpoint` progression is not persisted there. +Operators who want persisted-source startup behavior (`checkpointSource = "persisted"`) must provision and manage `checkpointDir/checkpoint` themselves; ZEVM does not auto-populate it. +ZEVM does not auto-create `checkpointDir` during startup. + +Operator audit procedure for baked defaults on a running binary: + +1. start light mode with no explicit checkpoint (`--checkpoint` omitted and `mode.light.checkpoint` unset) +2. ensure `checkpointDir/checkpoint` is absent for the selected network +3. call `zevm_lightSyncStatus` +4. confirm `checkpointSource = "default"` and compare `lastCheckpoint` to the selected release/build's `light-default-checkpoints.json` value for that network + +Quick audit snippet (requires `jq` and local release metadata files prepared per [Release Metadata Runbook](/reference/release-metadata-runbook)): + +```bash +NETWORK=sepolia +RELEASE_IDENTIFIER='' +ARTIFACT_DIR=.ops/release-metadata/"$RELEASE_IDENTIFIER" + +STATUS_JSON="$(curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"zevm_lightSyncStatus","params":[]}')" + +SOURCE="$(printf '%s' "$STATUS_JSON" | jq -r '.result.checkpointSource')" +ACTUAL="$(printf '%s' "$STATUS_JSON" | jq -r '.result.lastCheckpoint')" +EXPECTED="$(jq -r --arg network "$NETWORK" '.defaults[$network] // empty' "$ARTIFACT_DIR/light-default-checkpoints.json")" + +test -n "$EXPECTED" +test "$SOURCE" = "default" +test "$ACTUAL" = "$EXPECTED" +``` + +Checkpoint age policy for the selected startup checkpoint: + +- `age` is how old the selected startup checkpoint is when ZEVM starts +- `age` is evaluated once during startup, after checkpoint selection and before stale-policy decision +- `age` is measured in whole seconds: `age = max(0, startupTimeSeconds - checkpointTimeSeconds)` +- `startupTimeSeconds` is sampled at age-check time +- `checkpointTimeSeconds` is derived deterministically from the selected startup checkpoint hash on the selected network +- derivation steps: call `GET /eth/v1/beacon/genesis` and parse `data.genesis_time`; call `GET /eth/v1/beacon/headers/{selectedCheckpointHash}` and parse `data.root` and `data.header.message.slot` (with `data.root` required to equal `selectedCheckpointHash`) +- compute summary: `checkpointTimeSeconds = genesisTimeSeconds + (checkpointSlot * 12)` (integer Unix seconds, with phase-1 `SECONDS_PER_SLOT = 12`) +- this derivation is anchored to the selected startup checkpoint input; filesystem metadata like `checkpointDir/checkpoint` mtime is not used +- `age == maxCheckpointAgeSeconds` is valid +- only `age > maxCheckpointAgeSeconds` is stale +- stale + `strictCheckpointAge = false`: emit one startup/operator warning and continue startup (listener still opens) +- non-strict stale warning channel is operator startup logging surfaces (captured process `stderr` via shell redirection or service manager); it is not a JSON-RPC response +- phase 1 provides no dedicated ZEVM startup log-level or log-path knobs in CLI/config +- non-strict stale warning payload must include: selected checkpoint hash, `checkpointSource`, `checkpointTimeSeconds`, `startupTimeSeconds`, computed `age`, `maxCheckpointAgeSeconds`, and `strictCheckpointAge = false` +- stale + `strictCheckpointAge = true`: startup failure before opening the HTTP listener +- stale + `strictCheckpointAge = true` maps to startup-reserved code `-32012` (startup/pre-listener surface, not a runtime method error) +- inability to resolve `checkpointTimeSeconds` for the selected startup checkpoint: startup failure before opening the HTTP listener +- stale-checkpoint warnings are one-time startup/operator surfaces (not runtime JSON-RPC method errors) + +Precedence interaction summary: + +- checkpoint selection precedence decides only the selected startup checkpoint hash +- resolved `checkpointDir` (after merge, `` expansion, and CWD-relative resolution) sets the step-3 persisted input path (`${resolvedCheckpointDir}/checkpoint`) +- resolved `maxCheckpointAgeSeconds` and `strictCheckpointAge` are applied after selection when evaluating startup checkpoint staleness + +## Validation Rules + +- `--consensus-rpc-url` is required in light mode +- `consensusRpcUrl` must serve the same network selected by `network` +- selected startup checkpoint must match `network`; mismatch is startup failure before opening the HTTP listener +- light-only flags are invalid in trusted mode +- `network` must be one of `mainnet`, `sepolia`, or `holesky` +- `--strict-checkpoint-age` is a presence flag: present means `true`, omitted means `false`, and assignment forms like `--strict-checkpoint-age=false` are invalid +- `mode.light.checkpoint` may be omitted or set to `null`; in either case it is treated as absent for checkpoint precedence +- `checkpoint`, when present as a non-null startup input, must be a `0x`-prefixed 32-byte hash +- if the selected startup checkpoint input fails validation, startup fails before listener bind and ZEVM does not fall through to lower-precedence sources + +Startup network-validation handshake behavior: + +1. call `GET /eth/v1/beacon/genesis` +2. require HTTP `200` and parse `data.genesis_validators_root` as `Hash32` +3. require root match for selected `network` using the [canonical chain-id/root mapping](#canonical-chain-id-and-genesis-root-mapping) +4. if handshake fails (request failure, non-`200`, malformed payload, missing/invalid `data.genesis_validators_root`, or root mismatch), startup exits before opening the listener + +Troubleshooting playbook for these failures is in [Quickstart Troubleshooting -> Light-Mode Startup Handshake Checks](/quickstart/troubleshooting#light-mode-startup-handshake-checks). + +Checkpoint format bridge: + +- CLI/config fields and RPC payloads use `0x`-prefixed checkpoint hashes +- persisted `checkpointDir/checkpoint` stores 64 hex characters without `0x` + +### Persisted Checkpoint Startup-Input Contract + +- resolved path: `${resolvedCheckpointDir}/checkpoint` +- `resolvedCheckpointDir` is computed after CLI/config merge and `` expansion; relative `checkpointDir` values resolve against process current working directory +- contents: 64 hex characters (no `0x` prefix) +- surrounding whitespace is ignored +- missing `resolvedCheckpointDir` is treated as absent startup input and checkpoint selection falls through by precedence +- missing file is treated as absent startup input and checkpoint selection falls through by precedence +- unreadable file is a startup failure before opening the HTTP listener +- malformed content is a startup failure before opening the HTTP listener +- malformed/corrupt explicit checkpoint input or persisted checkpoint content maps to startup-reserved code `-32013` (startup/pre-listener surface, not a runtime method error) +- file lifecycle is operator-managed; ZEVM does not auto-create or rotate this file + +Operator procedure to seed and rotate `checkpointDir/checkpoint`: + +1. seed the file with a 64-hex checkpoint hash (no `0x`) + +```bash +CHECKPOINT_DIR=.zevm/checkpoints/sepolia +CHECKPOINT_HEX=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + +mkdir -p "$CHECKPOINT_DIR" +printf '%s\n' "$CHECKPOINT_HEX" > "$CHECKPOINT_DIR/checkpoint" +``` + +2. verify on-disk format before restart + +```bash +trimmed="$(tr -d '[:space:]' < "$CHECKPOINT_DIR/checkpoint")" +printf '%s\n' "$trimmed" | grep -Eq '^[0-9a-fA-F]{64}$' +``` + +3. restart ZEVM, then verify persisted-source startup in `zevm_lightSyncStatus` + +```bash +curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"zevm_lightSyncStatus","params":[]}' +``` + +Expect `checkpointSource` to be `persisted` and `lastCheckpoint` to equal `0x` plus your file value (case-insensitive hex). + +4. rotate by writing a new value and replacing the file, then restart and re-check `zevm_lightSyncStatus` + +```bash +NEW_CHECKPOINT_HEX=fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210 +printf '%s\n' "$NEW_CHECKPOINT_HEX" > "$CHECKPOINT_DIR/checkpoint.next" +mv "$CHECKPOINT_DIR/checkpoint.next" "$CHECKPOINT_DIR/checkpoint" +``` + +## Readiness Contract + +- `eth_chainId` is always callable in light mode +- readiness is non-monotonic: `ready` may transition from `true` back to `false` +- `ready = true` can be reached only after `status` transitions to `synced` and ZEVM has accepted verified optimistic (`latest`), safe (`safe`), and finalized (`finalized`) heads +- while `ready = true`, verified-head ordering must hold: `finalized <= safe <= latest` +- if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`), ZEVM sets `ready = false` in the same transition before serving the next readiness-gated RPC call +- when `ready = false`, `eth_blockNumber` fails with `-32011` +- when `ready = false`, proof-backed reads fail with `-32011` +- when `ready = true`, light reads apply the exact selector and proof rules from the JSON-RPC contract +- slot observability follows the same invariant while ready: `finalizedSlot <= safeSlot <= optimisticSlot` + +`zevm_lightSyncStatus` state guidance: + +- `syncing`: startup validation passed and listener is live, but readiness gate is closed +- `synced`: readiness gate is open and readiness-gated reads are serviceable while verified-head ordering holds (`finalized <= safe <= latest`) and slot ordering holds (`finalizedSlot <= safeSlot <= optimisticSlot`) +- `error`: readiness gate is closed; while this state holds, `eth_blockNumber` and proof-backed reads fail with `-32011` +- do not assume operator-free recovery from a persistent `error`; if it persists, verify `network`, `consensusRpcUrl`, `executionRpcUrl`, and checkpoint inputs, then restart ZEVM + +Readiness semantics and selector contracts are defined in [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads#readiness-and-proof-rules). + +## Example: Light-Mode Config + +```json +{ + "rpc": { "host": "127.0.0.1", "port": 8545 }, + "mode": { + "light": { + "network": "sepolia", + "consensusRpcUrl": "https://beacon.example", + "executionRpcUrl": "https://execution.example", + "checkpoint": null, + "checkpointDir": ".zevm/checkpoints/sepolia", + "maxCheckpointAgeSeconds": 1209600, + "strictCheckpointAge": false + } + } +} +``` + +## Example: CLI Startup + +```bash +zevm \ + --mode light \ + --network sepolia \ + --consensus-rpc-url https://beacon.example \ + --execution-rpc-url https://execution.example \ + --checkpoint-dir .zevm/checkpoints/sepolia +``` + +## Related Pages + +- [Configuration Overview](/reference/configuration/overview) +- [Canonical Specs And Docs-First Process](/reference/specs-and-process) +- [Release Metadata Runbook](/reference/release-metadata-runbook) +- [Run Light Mode](/quickstart/run-light-mode) +- [Troubleshooting](/quickstart/troubleshooting) +- [Light Mode](/concepts/light-mode) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) diff --git a/site/src/pages/reference/configuration/overview.mdx b/site/src/pages/reference/configuration/overview.mdx new file mode 100644 index 0000000..b6ce593 --- /dev/null +++ b/site/src/pages/reference/configuration/overview.mdx @@ -0,0 +1,303 @@ +--- +title: Configuration Overview +description: Runtime mode selection, shared startup flags, config schema, and precedence. +--- + +# Configuration Overview + +ZEVM supports two runtime modes: + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For product-contract disputes, follow those normative sources. + +- trusted mode: writable local Ethereum dev node +- light mode: read-only proof-backed, consensus-anchored client + +Forking is a trusted-mode configuration, not a third mode. + +## Current Public Contract + +Use canonical scope sources instead of repeating the full checklist: + +- product/runtime and transport boundaries: [Canonical Specs](/reference/canonical-specs) +- startup/config behavior and precedence: this page and mode pages in this section +- release/build pins and baked defaults: [Release Metadata Runbook](/reference/release-metadata-runbook) +- deferred-surface promotion and boundary/graduation criteria: [Specs And Process](/reference/specs-and-process#deferred-surface-promotion-and-phase-1-boundary-and-graduation-criteria) + +The current contract remains source-first; release artifact jobs may publish CLI/C ABI/npm artifacts, while installer UX, signing/notarization, and byte-identical binary reproducibility guarantees are out of scope. + +## Shared CLI Flags + +| Flag | Type | Default | +| --- | --- | --- | +| `--config` | JSON file path | none (when provided, config must include exactly one `mode` branch) | +| `--mode` | `trusted` or `light` | `trusted` (effective only when neither `--config` nor explicit `--mode` is supplied) | +| `--host` | bind host | `127.0.0.1` | +| `--port` | TCP port | `8545` | +| `--engine-host` | Engine API bind host | disabled unless `--engine-host`, `--engine-port`, or top-level `engineRpc` is supplied | +| `--engine-port` | Engine API TCP port | `8551` when Engine API is enabled | + +## RPC Exposure And Hardening + +ZEVM phase 1 serves JSON-RPC over plain HTTP only. ZEVM does not provide built-in TLS, JWT, or JSON-RPC authentication. +`--host 127.0.0.1` keeps the listener local to the machine. +Binding `--host` to a non-loopback interface (for example, `0.0.0.0`) exposes RPC to any network path that can reach that interface. + +The optional Engine API listener is trusted-mode only and is disabled by default. Enable it with CLI `--engine-host` / `--engine-port` or a top-level config `engineRpc` object. Exposing the Engine API on a reachable interface is unsafe without an external authenticated proxy or isolated network. + +Recommended phase-1 operator pattern: + +1. keep ZEVM bound to loopback (`--host 127.0.0.1`) +2. place a reverse proxy or gateway in front of ZEVM for TLS termination and authentication +3. enforce source-IP allowlists at ingress and host firewall layers +4. deny direct external access to the ZEVM RPC port + +Ingress/IP allowlist recommendations: + +- allow HTTPS ingress only from known operator/bastion CIDRs (for example, office/VPN egress ranges) +- if ZEVM is not on loopback, allow ZEVM RPC port ingress only from the proxy host/private subnet +- apply explicit deny-all defaults for all non-allowlisted sources +- do not expose ZEVM RPC directly to the public Internet + +Example reverse-proxy configuration (NGINX, TLS + basic auth + source-IP allowlist): + +```nginx +server { + listen 443 ssl; + server_name zevm-rpc.example.com; + + ssl_certificate /etc/letsencrypt/live/zevm-rpc.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/zevm-rpc.example.com/privkey.pem; + + auth_basic "ZEVM RPC"; + auth_basic_user_file /etc/nginx/.htpasswd; + + allow 203.0.113.10; # operator bastion/VPN egress IP + allow 198.51.100.0/24; # trusted corporate CIDR + deny all; + + location / { + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://127.0.0.1:8545; + } +} +``` + +This pattern keeps TLS/auth/IP filtering in the proxy layer while ZEVM remains plain HTTP on local/private transport in phase 1. +For a light-mode operator checklist, see [Light-Mode Configuration -> RPC Exposure And Hardening](/reference/configuration/light-mode#rpc-exposure-and-hardening). + +Phase-1 transport limits are fixed, not configurable: `64` active TCP connections, `15,000` ms read/write socket timeouts, `8,192` byte HTTP header buffer, and `8,388,608` byte request body limit. Larger request bodies return HTTP `413` without a JSON-RPC body. + +## Startup Logging Surfaces (Phase 1) + +Phase 1 has no dedicated ZEVM startup log-level or log-path knobs in the CLI/config contract. +Operator startup diagnostics come from process `stderr` capture in shell redirection or service-manager logging. +Explicit `--config` load failures emit one startup error record before exit. The record names the config path and includes a `failureClass` such as `missing-file`, `unreadable-file`, `malformed-json`, `schema`, or `validation`. +For concrete capture examples and failure triage flow, see [Troubleshooting -> Capture Startup Logs (Phase 1)](/quickstart/troubleshooting#capture-startup-logs-phase-1). + +## Config File Schema + +`--config` loads one JSON file with shared RPC settings and exactly one mode branch. + +### Trusted-mode config shape + +```json +{ + "rpc": { "host": "127.0.0.1", "port": 8545 }, + "engineRpc": { "host": "127.0.0.1", "port": 8551 }, + "mode": { + "trusted": { + "chainId": 31337, + "coinbaseIndex": 0, + "initialBalance": "10000000000000000000000", + "gasPrice": "2000000000", + "baseFee": "1000000000", + "blobBaseFee": "1", + "maxPriorityFeePerGas": "1000000000", + "blockGasLimit": 30000000, + "mining": { "type": "auto" }, + "hardfork": { + "cancunTimestamp": 0, + "pragueTimestamp": 9223372036854775807, + "osakaTimestamp": 9223372036854775807 + }, + "fork": null, + "genesis": null, + "chainRlp": null + } + } +} +``` + +Trusted hardfork policy is explicit and owned by the runtime. `chainId = 1` defaults to the mainnet activation schedule; any other trusted chain defaults to a dev schedule with Cancun active from genesis and Prague/Osaka inactive. `mode.trusted.hardfork` can override any activation field with decimal `u64` values: `homesteadBlock`, `daoBlock`, `tangerineWhistleBlock`, `spuriousDragonBlock`, `byzantiumBlock`, `petersburgBlock`, `istanbulBlock`, `muirGlacierBlock`, `berlinBlock`, `londonBlock`, `arrowGlacierBlock`, `grayGlacierBlock`, `mergeBlock`, `shanghaiTimestamp`, `cancunTimestamp`, `pragueTimestamp`, `osakaTimestamp`, and `secondsPerSlot`. + +`mode.trusted.genesis` or CLI `--genesis` points at a genesis JSON file and imports its `alloc` object at startup. Alloc entries may use `balance` or legacy `wei`, plus optional `nonce`, `code`, and `storage`. When a genesis file is supplied, ZEVM seeds state from that allocation instead of pre-funding the deterministic dev accounts; the managed signing accounts remain available through `eth_accounts`. + +`mode.trusted.chainRlp` or CLI `--chain-rlp` points at a concatenated RLP block stream. ZEVM imports those blocks after genesis as query-only block history, makes the imported head canonical, and keeps decoded transaction bodies available for block and transaction-by-position reads. It does not execute imported transactions or materialize imported state, receipts, or logs in phase 1. + +### Light-mode config shape + +```json +{ + "rpc": { "host": "127.0.0.1", "port": 8545 }, + "mode": { + "light": { + "network": "mainnet", + "consensusRpcUrl": "https://beacon.example", + "executionRpcUrl": "https://execution.example", + "checkpoint": null, + "checkpointDir": ".zevm/checkpoints/mainnet", + "maxCheckpointAgeSeconds": 1209600, + "strictCheckpointAge": false + } + } +} +``` + +## Mode-branch Rules + +- `mode` must contain exactly one of `trusted` or `light` +- config containing both branches is invalid +- config containing neither branch is invalid +- without explicit `--mode`, runtime mode is selected by the config branch when `--config` is provided +- explicit `--mode` with no `--config` selects runtime mode directly +- when both explicit `--mode` and `--config` are provided, explicit `--mode` must match the single config mode branch or startup fails before opening the HTTP listener +- trusted default applies only when no explicit `--mode` is supplied and no `--config` file is loaded + +## Config Key Validation + +- allowed top-level keys are `rpc`, `engineRpc`, and `mode`; unknown top-level keys are invalid +- unknown keys inside `rpc`, `engineRpc`, `mode`, `mode.trusted`, `mode.light`, and trusted structured objects (`mining`, `hardfork`, `fork`) are invalid +- `rpc` is optional; when omitted, shared defaults apply (`host = 127.0.0.1`, `port = 8545`) +- when `rpc` is present, `host` and `port` default independently if omitted +- `engineRpc` is optional and trusted-mode only; when present, omitted `host` defaults to the main RPC host and omitted `port` defaults to `8551` + +## Startup Precedence + +For non-checkpoint startup options across modes: + +1. explicitly supplied CLI flags +2. config file values +3. defaults for any field still unresolved after CLI/config merge + +CLI defaults are not treated as explicit overrides over config values. +Parser-provided defaults are applied only after explicit CLI/config merge and do not count as explicit inputs. +Because of that ordering, parser defaults cannot create a mode-branch conflict with `--config`; only explicitly supplied `--mode` can conflict with the config mode branch. + +Structured trusted-setting resolution: + +- `mining` resolves as one unit from CLI `--mining` and `--block-time`; if either flag is explicitly supplied, ZEVM builds `mining` from CLI and ignores `mode.trusted.mining` +- `hardfork` has no phase-1 CLI flags; ZEVM starts from the default schedule for the resolved `chainId`, then applies any `mode.trusted.hardfork` field overrides +- `fork` resolves as one unit from CLI `--fork-url` and `--fork-block-number`; if either flag is explicitly supplied, ZEVM builds `fork` from CLI and ignores `mode.trusted.fork` +- `genesis` resolves by normal field precedence from CLI `--genesis`, then `mode.trusted.genesis`, then absent +- `chainRlp` resolves by normal field precedence from CLI `--chain-rlp`, then `mode.trusted.chainRlp`, then absent +- when no related CLI flags are present for that unit, ZEVM uses config value for that unit, then mode default + +## Light-Mode Checkpoint Resolution + +Checkpoint resolution applies only to selecting the initial light checkpoint: + +1. user-supplied CLI checkpoint (`--checkpoint`), when provided +2. config checkpoint (`mode.light.checkpoint`), when set to a non-null value +3. persisted startup checkpoint input (`checkpointDir/checkpoint`) +4. baked network default checkpoint + +`checkpointDir`, `maxCheckpointAgeSeconds`, and `strictCheckpointAge` are non-checkpoint controls. +They resolve by normal startup precedence (explicit CLI flag > config value > default) and are not part of the four-step checkpoint selection order above. +`mode.light.checkpoint` may be omitted or set to `null`; both are treated as absent for checkpoint precedence. +`--strict-checkpoint-age` is a presence flag: present means `true`, omitted means `false`, and assignment forms like `--strict-checkpoint-age=false` are invalid. + +When step 1 or step 2 wins, `zevm_lightSyncStatus.checkpointSource` is `explicit` for both CLI-supplied and config-supplied checkpoints. +`checkpointSource` is startup-source metadata and does not change when `lastCheckpoint` advances. +This precedence is strict: CLI checkpoint > config checkpoint > persisted checkpoint file > baked default. +If `checkpointDir` is missing at startup (including missing network-expanded directory), step 3 is treated as absent input and selection falls through by precedence. +If `checkpointDir/checkpoint` is missing, step 3 is treated as absent input and selection falls through by precedence. +If `checkpointDir/checkpoint` exists but is unreadable, startup fails before opening the HTTP listener. +When CLI checkpoint, config checkpoint, and persisted `checkpointDir/checkpoint` are all absent, ZEVM selects the baked network default and `zevm_lightSyncStatus.checkpointSource` reports `default`. +The baked default checkpoint is a startup precedence input, not a frozen public compatibility constant. +Baked default values are bundled per ZEVM release/build and may rotate across releases. +This docs page specifies selection behavior and precedence, not immutable checkpoint constants. +For published release identifiers, release-specific baked defaults are published in `light-default-checkpoints.json`; use [Release Metadata Runbook](/reference/release-metadata-runbook) and [ZEVM release metadata](https://github.com/evmts/zevm/releases) for exact release/build boundaries, provenance, and default-checkpoint audit flow. +If a build has no published `light-default-checkpoints.json`, treat it as an unpublished source-build boundary and provide an explicit checkpoint when deterministic startup selection is required. +Phase-1 persisted checkpoint contract: `checkpointDir/checkpoint` is startup input only. ZEVM does not create, update, or delete it during runtime, and runtime `lastCheckpoint` progression is not persisted there. +Operators who want persisted-source startup behavior (`checkpointSource = "persisted"`) must provision and manage `checkpointDir/checkpoint` themselves; ZEVM does not auto-populate it. +ZEVM does not auto-create `checkpointDir` during startup. +Selected startup checkpoint input must match the selected light network; mismatch is startup failure before opening the HTTP listener. + +Checkpoint age policy for the selected startup checkpoint: + +- `age` is how old the selected startup checkpoint is when ZEVM starts +- `age` is evaluated once during startup, after checkpoint selection and before stale-policy decision +- `age` is measured in whole seconds: `age = max(0, startupTimeSeconds - checkpointTimeSeconds)` +- `startupTimeSeconds` is sampled at age-check time +- `checkpointTimeSeconds` is derived deterministically from the selected startup checkpoint hash on the selected network +- derivation steps: call `GET /eth/v1/beacon/genesis` and parse `data.genesis_time`; call `GET /eth/v1/beacon/headers/{selectedCheckpointHash}` and parse `data.root` and `data.header.message.slot` (with `data.root` required to equal `selectedCheckpointHash`) +- compute summary: `checkpointTimeSeconds = genesisTimeSeconds + (checkpointSlot * 12)` (integer Unix seconds, with phase-1 `SECONDS_PER_SLOT = 12`) +- this derivation is anchored to the selected startup checkpoint input; filesystem metadata like `checkpointDir/checkpoint` mtime is not used +- `age == maxCheckpointAgeSeconds` is valid +- only `age > maxCheckpointAgeSeconds` is stale +- stale + `strictCheckpointAge = false`: emit one startup/operator warning and continue startup (listener still opens) +- non-strict stale warning channel is operator startup logging surfaces (captured process `stderr` via shell redirection or service manager); it is not a JSON-RPC response +- phase 1 provides no dedicated ZEVM startup log-level or log-path knobs in CLI/config +- non-strict stale warning payload must include: selected checkpoint hash, `checkpointSource`, `checkpointTimeSeconds`, `startupTimeSeconds`, computed `age`, `maxCheckpointAgeSeconds`, and `strictCheckpointAge = false` +- stale + `strictCheckpointAge = true`: startup failure before opening the HTTP listener +- inability to resolve `checkpointTimeSeconds` for the selected startup checkpoint: startup failure before opening the HTTP listener +- stale-checkpoint warnings are startup/operator surfaces (not runtime JSON-RPC method errors) + +Precedence interaction summary: + +- checkpoint selection precedence decides only which startup checkpoint hash is selected (`explicit`/`persisted`/`default`) +- resolved `checkpointDir` value determines the filesystem path used for step 3 (`checkpointDir/checkpoint`) +- resolved `maxCheckpointAgeSeconds` and `strictCheckpointAge` values are applied after checkpoint selection during startup stale-policy evaluation + +## Light-Mode Readiness Contract + +In light mode: + +- `eth_chainId` is always callable, including while `ready = false` +- while `ready = false`, `eth_blockNumber` fails with `-32011` +- while `ready = false`, proof-backed account/code/storage/nonce reads fail with `-32011` +- phase-1 operator-facing startup inputs are `network`, `consensusRpcUrl`, and `executionRpcUrl`, with optional checkpoint controls (`checkpoint`, `checkpointDir`, `maxCheckpointAgeSeconds`, `strictCheckpointAge`) +- `status = "syncing"` means startup validation passed and listener is live, but readiness gate remains closed +- `status = "synced"` is the only state where `ready = true`; readiness transitions to `true` only after synced state with verified optimistic, safe, and finalized heads +- while `ready = true`, verified heads maintain `finalized <= safe <= latest` +- on any sync-state degradation from ready conditions (including slot coherence no longer holding: `finalizedSlot <= safeSlot <= optimisticSlot`), ZEVM sets `ready = false` immediately before serving readiness-gated calls +- `status = "error"` keeps `ready = false`; if persistent, operators should verify `network`, `consensusRpcUrl`, `executionRpcUrl`, and checkpoint inputs, then restart + +## Startup Failures + +ZEVM fails before opening the HTTP listener for invalid startup input, including: + +- unknown flags +- missing flag values +- invalid integer or wei values +- invalid mode combinations +- invalid trusted/light flag mixing +- missing required light-mode consensus URL +- light-mode consensus endpoint/network mismatch +- light-mode startup consensus-network handshake failure (`GET /eth/v1/beacon/genesis` request failure, non-`200`, malformed payload, missing/invalid `data.genesis_validators_root`, or root mismatch with selected network) +- selected startup checkpoint/network mismatch +- invalid mining option combinations +- invalid fork option combinations +- invalid `coinbaseIndex` +- stale selected checkpoint when `strictCheckpointAge = true` +- inability to resolve `checkpointTimeSeconds` for the selected startup checkpoint +- malformed checkpoint input or malformed checkpoint file +- `--config` load failure (missing file, unreadable file, or malformed JSON): startup fails before opening the HTTP listener, exits non-zero, reports an operator-facing error naming the config path and failure class, and does not fall back to defaults + +Light-mode startup includes a network-validation handshake before listener bind: + +1. call `GET /eth/v1/beacon/genesis` +2. require HTTP `200` and parse `data.genesis_validators_root` as `Hash32` +3. require root match for selected light `network` using the [canonical chain-id/root mapping](/reference/configuration/light-mode#canonical-chain-id-and-genesis-root-mapping) +4. if handshake fails (request failure, non-`200`, malformed payload, missing/invalid `data.genesis_validators_root`, or root mismatch), startup fails before opening the HTTP listener + +## Related Pages + +- [Trusted-Mode Configuration](/reference/configuration/trusted-mode) +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [Core Reads](/reference/json-rpc/core-reads) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) diff --git a/site/src/pages/reference/configuration/trusted-mode.mdx b/site/src/pages/reference/configuration/trusted-mode.mdx new file mode 100644 index 0000000..b47bd0b --- /dev/null +++ b/site/src/pages/reference/configuration/trusted-mode.mdx @@ -0,0 +1,184 @@ +--- +title: Trusted-Mode Configuration +description: Trusted-mode defaults, CLI/config fields, mining and fork options, and validation. +--- + +# Trusted-Mode Configuration + +Trusted mode is the default runtime. It provides local execution and local mutation with optional fork backing. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For product-contract disputes, follow those normative sources. + +## Runtime Defaults + +| Field | Default | +| --- | --- | +| `chainId` | `31337` (`0x7a69`) | +| managed accounts | 10 deterministic dev accounts | +| `coinbaseIndex` | `0` | +| `initialBalance` | `10000000000000000000000` wei | +| `gasPrice` | `2000000000` | +| `baseFee` | `1000000000` | +| `blobBaseFee` | `1` | +| `maxPriorityFeePerGas` | `1000000000` | +| `blockGasLimit` | `30000000` | +| mining mode | `auto` | + +## CLI And Config Field Map + +| CLI flag | Config field | Type | Default | +| --- | --- | --- | --- | +| `--chain-id` | `mode.trusted.chainId` | `u64` | `31337` | +| `--coinbase-index` | `mode.trusted.coinbaseIndex` | integer `0..9` | `0` | +| `--initial-balance` | `mode.trusted.initialBalance` | decimal wei string | `10000000000000000000000` | +| `--gas-price` | `mode.trusted.gasPrice` | decimal wei string | `2000000000` | +| `--base-fee` | `mode.trusted.baseFee` | decimal wei string | `1000000000` | +| `--blob-base-fee` | `mode.trusted.blobBaseFee` | decimal wei string | `1` | +| `--max-priority-fee-per-gas` | `mode.trusted.maxPriorityFeePerGas` | decimal wei string | `1000000000` | +| `--block-gas-limit` | `mode.trusted.blockGasLimit` | `u64` | `30000000` | +| `--mining` | `mode.trusted.mining.type` | `auto`, `manual`, `interval` | `auto` | +| `--block-time` | `mode.trusted.mining.blockTime` | seconds (`u64`) | none | +| `--fork-url` | `mode.trusted.fork.url` | execution RPC URL | none | +| `--fork-block-number` | `mode.trusted.fork.blockNumber` | `u64` | none (when omitted with `--fork-url`, follow upstream head) | +| `--genesis` | `mode.trusted.genesis` | genesis JSON path | none | +| `--chain-rlp` | `mode.trusted.chainRlp` | concatenated RLP block stream path | none | + +Fork block-number representation bridge: startup CLI/config values are decimal `u64`, while JSON-RPC `zevm_reset` uses `QuantityHex` for `forkConfig.blockNumber` (example: `22000000` -> `"0x14fb180"`). + +## Mining Shapes + +`mode.trusted.mining` accepts: + +```json +{ "type": "auto" } +``` + +```json +{ "type": "manual" } +``` + +```json +{ "type": "interval", "blockTime": 12 } +``` + +## Fork Shapes + +`mode.trusted.fork` accepts: + +```json +null +``` + +```json +{ "url": "https://rpc.example" } +``` + +```json +{ "url": "https://rpc.example", "blockNumber": 22000000 } +``` + +When `fork.url` is set and `fork.blockNumber` is omitted, ZEVM follows the upstream head by default. + +## Genesis Allocation + +`mode.trusted.genesis` accepts a path to a genesis JSON file: + +```json +{ "genesis": "/path/to/genesis.json" } +``` + +ZEVM reads the file at startup and imports the top-level `alloc` object. Account entries support `balance` or legacy `wei`, and optional `nonce`, `code`, and `storage` fields. Supplying a genesis file replaces default dev-account pre-funding; the deterministic managed accounts still exist for signing and `eth_accounts`. + +## Chain RLP Import + +`mode.trusted.chainRlp` accepts a path to a concatenated RLP block stream: + +```json +{ "chainRlp": "/path/to/chain.rlp" } +``` + +ZEVM imports the stream after genesis initialization as query-only block history and advances the canonical head to the last imported block. Imported block bodies retain raw transaction envelopes for block transaction arrays and transaction-by-block/index lookups. + +`chainRlp` does not execute imported transactions, validate post-state roots, materialize account/storage state, or populate receipt/log indexes in phase 1. State-backed reads, simulation/testing methods, receipts, and logs continue to use the local runtime state created from genesis plus subsequent local transactions. The startup log emits `chain_rlp_query_only_imported` with `state_materialized=false`, `receipts_indexed=false`, and `logs_indexed=false` whenever this path is used. + +## Engine API Listener + +Trusted mode can expose a second plain-HTTP Engine API listener with top-level `engineRpc` or CLI `--engine-host` / `--engine-port`: + +```json +{ "engineRpc": { "host": "127.0.0.1", "port": 8551 } } +``` + +The implemented Engine surface covers capability exchange, transition configuration exchange, forkchoice updates that validate referenced hashes against ZEVM's local block history, payload attribute build jobs, strict local payload import for known canonical parents, getPayload lookup for known payload ids, payload body lookup against local blocks, and blob lookup nulls for unavailable sidecars. It does not make ZEVM a full consensus-client-facing execution engine yet; remote P2P sync and blob sidecar retention remain out of scope. + +Implemented Engine listener methods: + +| Method | Params | Result | +| --- | --- | --- | +| `engine_exchangeCapabilities` | `[capabilities]` where `capabilities` is an array of strings | array of implemented Engine method names | +| `engine_exchangeTransitionConfigurationV1` | `[config]` where `config` is an object | echo of the supplied transition config | +| `engine_getClientVersionV1` | `[clientVersion]` | single-element ZEVM client version array | +| `engine_forkchoiceUpdatedV1` / `engine_forkchoiceUpdatedV2` / `engine_forkchoiceUpdatedV3` / `engine_forkchoiceUpdatedV4` | `[forkchoiceState]`, `[forkchoiceState, null]`, or `[forkchoiceState, payloadAttributes]` | `{ payloadStatus, payloadId }`; `payloadId` is non-null when payload attributes are accepted | +| `engine_newPayloadV1` / `engine_newPayloadV2` / `engine_newPayloadV3` / `engine_newPayloadV4` / `engine_newPayloadV5` | version-specific payload validation params | `PayloadStatusV1`; locally valid payloads with known canonical parents import as `VALID`, unknown parents return `SYNCING`, invalid payloads return `INVALID` or `INVALID_BLOCK_HASH` | +| `engine_getPayloadV1` / `engine_getPayloadV2` / `engine_getPayloadV3` / `engine_getPayloadV4` / `engine_getPayloadV5` / `engine_getPayloadV6` | `[payloadId]` | payload envelope when known; `-38001` for unknown payload id | +| `engine_getPayloadBodiesByHashV1` / `engine_getPayloadBodiesByHashV2` / `engine_getPayloadBodiesByRangeV1` / `engine_getPayloadBodiesByRangeV2` | hash/range body lookup params | payload body array with `null` for unknown local blocks; V2 includes `blockAccessList: null` | +| `engine_getBlobsV1` / `engine_getBlobsV2` / `engine_getBlobsV3` | `[versionedHashes]` | blob array with `null` for unknown hashes | + +`forkchoiceState` must include `headBlockHash`, `safeBlockHash`, and `finalizedBlockHash` as `Hash32` strings. `safeBlockHash` and `finalizedBlockHash` may be zero hashes. + +## Validation Rules + +- `--block-time` is required when `--mining interval` +- `--block-time` is invalid for `auto` and `manual` +- `--fork-block-number` is invalid without `--fork-url` +- `--fork-url` without `--fork-block-number` is valid and follows upstream head +- `--genesis` is trusted-mode only and must point to a readable genesis file +- `--chain-rlp` is trusted-mode only, query-only in phase 1, and the stream must link to the configured genesis/imported parent chain +- `--engine-host`, `--engine-port`, and top-level `engineRpc` are trusted-mode only +- trusted-only flags are invalid in light mode +- `coinbaseIndex` must be within `0..9` + +## Example: Trusted Mode With Interval Mining And Fork + +```json +{ + "rpc": { "host": "127.0.0.1", "port": 8545 }, + "mode": { + "trusted": { + "chainId": 31337, + "coinbaseIndex": 0, + "initialBalance": "10000000000000000000000", + "gasPrice": "2000000000", + "baseFee": "1000000000", + "blobBaseFee": "1", + "maxPriorityFeePerGas": "1000000000", + "blockGasLimit": 30000000, + "mining": { "type": "interval", "blockTime": 12 }, + "fork": { "url": "https://rpc.example", "blockNumber": 22000000 }, + "genesis": "./genesis.json", + "chainRlp": "./chain.rlp" + } + } +} +``` + +## Example: CLI Startup + +```bash +zevm \ + --mode trusted \ + --chain-id 31337 \ + --mining interval \ + --block-time 12 \ + --fork-url https://rpc.example \ + --fork-block-number 22000000 \ + --genesis ./genesis.json \ + --chain-rlp ./chain.rlp +``` + +## Related Pages + +- [Configuration Overview](/reference/configuration/overview) +- [Light-Mode Configuration](/reference/configuration/light-mode) diff --git a/site/src/pages/reference/json-rpc/blocks-receipts-and-logs.mdx b/site/src/pages/reference/json-rpc/blocks-receipts-and-logs.mdx new file mode 100644 index 0000000..30e3f48 --- /dev/null +++ b/site/src/pages/reference/json-rpc/blocks-receipts-and-logs.mdx @@ -0,0 +1,350 @@ +--- +title: Blocks, Receipts, And Logs +description: Trusted-mode block, transaction, receipt, and log query contract. +--- + +# Blocks, Receipts, And Logs + +This page covers trusted-mode query methods for blocks, transactions, receipts, and logs. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +- trusted mode: supported +- light mode: unsupported (`-32010`) for every method on this page + +Malformed hashes, selectors, indexes, quantities, tuple lengths, booleans, and filters return `-32602`. + +`BlockTag` on this page means: `latest`, `earliest`, `pending`, `safe`, `finalized`, or numeric quantity. + +## Trusted Block Selectors + +| Selector | Meaning | +| --- | --- | +| `latest` | current canonical local head | +| `pending` | alias of `latest` | +| `safe` | alias of `latest` | +| `finalized` | alias of `latest` | +| `earliest` | block `0` | +| numeric quantity | exact local block number | + +`ReceiptSelector` for `eth_getBlockReceipts` is one `BlockTag` or one block `Hash32`. + +Selector alias scope on this page: + +- `pending` is an alias of `latest` for selector-based block queries (`eth_getBlockByNumber`, `eth_getBlockTransactionCountByNumber`, `eth_getTransactionByBlockNumberAndIndex`, `eth_getBlockReceipts`) and `eth_getLogs` bounds (`fromBlock` / `toBlock`) + +## Methods + +| Method | Exact params | Exact result | Null and error behavior | +| --- | --- | --- | --- | +| `eth_getBlockByNumber` | `[block, fullTransactions]` | block object or `null` | unknown block -> `null`; malformed selector/boolean -> `-32602` | +| `eth_getBlockByHash` | `[blockHash, fullTransactions]` | block object or `null` | unknown block -> `null`; malformed hash/boolean -> `-32602` | +| `eth_getBlockTransactionCountByNumber` | `[block]` | `QuantityHex` or `null` | unknown block -> `null`; malformed selector -> `-32602` | +| `eth_getBlockTransactionCountByHash` | `[blockHash]` | `QuantityHex` or `null` | unknown block -> `null`; malformed hash -> `-32602` | +| `eth_getUncleCountByBlockNumber` | `[block]` | `QuantityHex` | unknown block -> `0x0`; malformed selector -> `-32602` | +| `eth_getUncleCountByBlockHash` | `[blockHash]` | `QuantityHex` | unknown block -> `0x0`; malformed hash -> `-32602` | +| `eth_getTransactionByHash` | `[transactionHash]` | transaction object or `null` | unknown tx -> `null`; malformed hash -> `-32602` | +| `eth_getTransactionByBlockNumberAndIndex` | `[block, index]` | transaction object or `null` | unknown block or out-of-range index -> `null`; malformed selector/index -> `-32602` | +| `eth_getTransactionByBlockHashAndIndex` | `[blockHash, index]` | transaction object or `null` | unknown block or out-of-range index -> `null`; malformed hash/index -> `-32602` | +| `eth_getTransactionReceipt` | `[transactionHash]` | receipt object or `null` | unknown tx -> `null`; malformed hash -> `-32602` | +| `eth_getBlockReceipts` | `[block]` (`ReceiptSelector`) | receipt array or `null` | unknown block -> `null`; malformed selector -> `-32602` | +| `eth_getBlockAccessList` | `[block]` (`BlockNumberOrTagOrHash`) | block access list or `null` | unknown block or retained block without access-list data -> `null`; malformed selector -> `-32602` | +| `eth_getLogs` | `[filter]` | log array | no matches -> `[]`; malformed filter or invalid selector combinations -> `-32602` | +| `eth_newBlockFilter` | `[]` or omitted | filter id `QuantityHex` | non-empty params -> `-32602` | +| `eth_newPendingTransactionFilter` | `[]` or omitted | filter id `QuantityHex` | non-empty params -> `-32602` | +| `eth_newFilter` | `[filter]` | filter id `QuantityHex` | malformed filter -> `-32602` | +| `eth_getFilterChanges` | `[filterId]` | array; current trusted mode returns `[]` | malformed filter id -> `-32602` | +| `eth_getFilterLogs` | `[filterId]` | log array; current trusted mode returns `[]` | malformed filter id -> `-32602` | +| `eth_uninstallFilter` | `[filterId]` | `true` for well-formed ids | malformed filter id -> `-32602` | + +Lookup behavior: + +- `eth_getBlockTransactionCountByNumber` and `eth_getBlockTransactionCountByHash` return `null` when the target block is unknown +- `eth_getUncleCountByBlockNumber` and `eth_getUncleCountByBlockHash` return `0x0` for unknown blocks and for ZEVM-produced post-Merge blocks +- `eth_getTransactionByBlockNumberAndIndex` and `eth_getTransactionByBlockHashAndIndex` return `null` when the target block is unknown or the zero-based `index` is out of range for that block +- index params for `eth_getTransactionByBlockNumberAndIndex` and `eth_getTransactionByBlockHashAndIndex` must be `QuantityHex` and are interpreted as zero-based transaction positions within the resolved canonical block +- `eth_getTransactionByHash` does not surface txpool-only pending entries; it returns `null` until a transaction is canonical in a mined block +- `eth_getTransactionReceipt` is mined-only; it returns `null` before inclusion +- `eth_getBlockAccessList` accepts block number/tag/hash selectors and returns `null` for unknown blocks or retained-history blocks without Amsterdam block access-list data +- filter ids are process-local `QuantityHex` values; phase-1 trusted mode validates lifecycle calls but does not retain historical filter deltas + +## Object Shapes + +Extension-field contract on this page: + +- ZEVM currently omits `blockTimestamp` extension fields from block, transaction, receipt, and log objects +- block objects use `timestamp`; transaction/receipt/log objects include `blockHash` and `blockNumber` but no separate `blockTimestamp` field + +### Transaction object + +```json +{ + "type": "0x0", + "hash": "0x...", + "nonce": "0x0", + "blockHash": "0x...", + "blockNumber": "0x0", + "transactionIndex": "0x0", + "from": "0x...", + "to": "0x...", + "value": "0x0", + "gas": "0x5208", + "input": "0x" +} +``` + +Rules: + +- `type` is always `0x0` in the current ZEVM contract +- `to` may be `null` for create +- for current phase-1 query methods on this page, `blockHash`, `blockNumber`, and `transactionIndex` are non-null because txpool-only pending entries are not surfaced + +### Block object + +```json +{ + "hash": "0x...", + "parentHash": "0x...", + "sha3Uncles": "0x...", + "miner": "0x...", + "stateRoot": "0x...", + "transactionsRoot": "0x...", + "receiptsRoot": "0x...", + "logsBloom": "0x...", + "number": "0x0", + "gasLimit": "0x0", + "gasUsed": "0x0", + "timestamp": "0x0", + "extraData": "0x", + "mixHash": "0x...", + "nonce": "0x0000000000000000", + "size": "0x0", + "transactions": [], + "uncles": [], + "difficulty": "0x0", + "totalDifficulty": "0x0", + "baseFeePerGas": "0x0", + "withdrawalsRoot": "0x...", + "blobGasUsed": "0x0", + "excessBlobGas": "0x0", + "parentBeaconBlockRoot": "0x..." +} +``` + +Rules: + +- `transactions` is array of hashes when `fullTransactions=false` +- `transactions` is array of transaction objects when `fullTransactions=true` +- `hash` and `number` are non-null on returned canonical block objects +- `nonce` is `HexData` encoding exactly 8 bytes (`0x` + 16 hex chars) +- fork-era fields may be omitted when not applicable + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `hash` | yes | `Hash32` | non-null for returned block objects | +| `parentHash` | yes | `Hash32` | non-null | +| `sha3Uncles` | yes | `Hash32` | non-null | +| `miner` | yes | `Address` | non-null | +| `stateRoot` | yes | `Hash32` | non-null | +| `transactionsRoot` | yes | `Hash32` | non-null | +| `receiptsRoot` | yes | `Hash32` | non-null | +| `logsBloom` | yes | `HexData` | non-null bloom bytes | +| `number` | yes | `QuantityHex` | non-null for returned block objects | +| `gasLimit` | yes | `QuantityHex` | non-null | +| `gasUsed` | yes | `QuantityHex` | non-null | +| `timestamp` | yes | `QuantityHex` | non-null | +| `extraData` | yes | `HexData` | non-null | +| `mixHash` | yes | `Hash32` | non-null | +| `nonce` | yes | `HexData` | exactly 8-byte value | +| `size` | yes | `QuantityHex` | non-null | +| `transactions` | yes | array | hashes when `fullTransactions=false`; transaction objects when `fullTransactions=true` | +| `uncles` | yes | array of `Hash32` | non-null (empty array allowed) | +| `difficulty` | yes | `QuantityHex` | non-null | +| `totalDifficulty` | yes | `QuantityHex` | non-null | +| `baseFeePerGas` | conditional | `QuantityHex` | omitted when not applicable | +| `withdrawalsRoot` | conditional | `Hash32` | omitted when not applicable | +| `blobGasUsed` | conditional | `QuantityHex` | omitted when not applicable | +| `excessBlobGas` | conditional | `QuantityHex` | omitted when not applicable | +| `parentBeaconBlockRoot` | conditional | `Hash32` | omitted when not applicable | + +### Receipt object + +```json +{ + "transactionHash": "0x...", + "transactionIndex": "0x0", + "blockHash": "0x...", + "blockNumber": "0x0", + "from": "0x...", + "to": "0x...", + "cumulativeGasUsed": "0x0", + "gasUsed": "0x0", + "contractAddress": null, + "logs": [], + "logsBloom": "0x...", + "status": "0x1", + "root": null, + "effectiveGasPrice": "0x0", + "type": "0x0", + "blobGasUsed": null, + "blobGasPrice": null +} +``` + +Rules: + +- `to` is `null` only for create transactions +- `contractAddress` is non-null only for create transactions +- `status` is always `0x0` or `0x1` +- `root` is always `null` in the current ZEVM contract +- `type` is always `0x0` in the current ZEVM contract +- `blobGasUsed` and `blobGasPrice` are always `null` in the current ZEVM contract + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `transactionHash` | yes | `Hash32` | non-null | +| `transactionIndex` | yes | `QuantityHex` | non-null | +| `blockHash` | yes | `Hash32` | non-null | +| `blockNumber` | yes | `QuantityHex` | non-null | +| `from` | yes | `Address` | non-null | +| `to` | yes | `Address` or `null` | `null` only for create transactions | +| `cumulativeGasUsed` | yes | `QuantityHex` | non-null | +| `gasUsed` | yes | `QuantityHex` | non-null | +| `contractAddress` | yes | `Address` or `null` | non-null only for create transactions | +| `logs` | yes | array of log objects | non-null (empty array allowed) | +| `logsBloom` | yes | `HexData` | non-null bloom bytes | +| `status` | yes | `QuantityHex` | must be `0x0` or `0x1` | +| `root` | yes | `Hash32` or `null` | always `null` in the current ZEVM contract | +| `effectiveGasPrice` | yes | `QuantityHex` | non-null | +| `type` | yes | `QuantityHex` | always `0x0` in the current ZEVM contract | +| `blobGasUsed` | yes | `QuantityHex` or `null` | always `null` in the current ZEVM contract | +| `blobGasPrice` | yes | `QuantityHex` or `null` | always `null` in the current ZEVM contract | + +### Log object + +```json +{ + "removed": false, + "logIndex": "0x0", + "transactionIndex": "0x0", + "transactionHash": "0x...", + "blockHash": "0x...", + "blockNumber": "0x0", + "address": "0x...", + "data": "0x", + "topics": [] +} +``` + +Rules: + +- `removed` is always `false` for canonical ZEVM responses + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `removed` | yes | boolean | always `false` for canonical ZEVM responses | +| `logIndex` | yes | `QuantityHex` | non-null | +| `transactionIndex` | yes | `QuantityHex` | non-null | +| `transactionHash` | yes | `Hash32` | non-null | +| `blockHash` | yes | `Hash32` | non-null | +| `blockNumber` | yes | `QuantityHex` | non-null | +| `address` | yes | `Address` | non-null | +| `data` | yes | `HexData` | non-null | +| `topics` | yes | array of `Hash32` | non-null (empty array allowed) | + +## `eth_getLogs` Filter + +Allowed fields: + +| Field | Type | +| --- | --- | +| `fromBlock` | `TrustedBlockSelector` | +| `toBlock` | `TrustedBlockSelector` | +| `blockHash` | `Hash32` | +| `address` | `Address` or array of `Address` | +| `topics` | array of `null`, `Hash32`, or array of `Hash32` | + +Rules: + +- `blockHash` is mutually exclusive with `fromBlock` and `toBlock` +- when both bounds are present, resolved `fromBlock <= toBlock` is required + +Matching, defaults, and ordering: + +- default bounds when omitted: `fromBlock = latest`, `toBlock = latest` (with `pending` resolving as `latest`) +- `blockHash` targets exactly that canonical block and ignores range defaults +- address matching: single address is exact match; address array is OR +- topic matching is positional AND across indices; each topic position accepts `null` wildcard, one `Hash32`, or OR-array of `Hash32` +- results include canonical mined logs only (no txpool/pending logs) +- result order is canonical ascending order: block number, then transaction index, then log index + +## Example: `eth_getBlockByNumber` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "eth_getBlockByNumber", + "params": ["latest", false] +} +``` + +Response shape: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "number": "0x1", + "hash": "0x...", + "transactions": ["0x..."] + } +} +``` + +## Example: `eth_getLogs` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "0x1", + "toBlock": "latest", + "address": "0x0000000000000000000000000000000000000001" + } + ] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": [] +} +``` + +## Related Pages + +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) +- [Core Reads](/reference/json-rpc/core-reads) +- [Simulation](/reference/json-rpc/simulation) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) diff --git a/site/src/pages/reference/json-rpc/core-reads.mdx b/site/src/pages/reference/json-rpc/core-reads.mdx new file mode 100644 index 0000000..72403c1 --- /dev/null +++ b/site/src/pages/reference/json-rpc/core-reads.mdx @@ -0,0 +1,204 @@ +--- +title: Core Reads +description: Core read methods with trusted-mode selector rules and exact eth_feeHistory behavior. +--- + +# Core Reads + +This page defines trusted-mode core reads and marks the subset that is also available in light mode. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +## Shared Types + +| Type | Contract | +| --- | --- | +| `BlockTag` | `latest`, `earliest`, `pending`, `safe`, `finalized`, or numeric quantity | +| `TrustedBlockSelector` | any `BlockTag` | +| `StorageRequest` | object keyed by `Address`; each value is an array of `Bytes32` storage slots | +| `FeeHistoryResult` | object with `oldestBlock`, `baseFeePerGas`, `gasUsedRatio`, and optional `reward` | + +## Trusted-Mode Block Selectors + +| Selector | Meaning | +| --- | --- | +| `latest` | current canonical local head | +| `pending` | alias of `latest` | +| `safe` | alias of `latest` | +| `finalized` | alias of `latest` | +| `earliest` | block `0` | +| numeric quantity | exact local block number | + +Malformed selectors return `-32602`. + +For trusted-mode state-backed reads (`eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getStorageValues`, `eth_getProof`, and `eth_getTransactionCount`), selectors must resolve to the current local head. `latest`, `pending`, `safe`, and `finalized` are accepted because they alias the head; `earliest` is accepted only while the current head is genesis; numeric selectors are accepted only when equal to the current head. Other resolved non-head selectors return `-32602`. + +## Shared Read Methods (Trusted + Light) + +These methods exist in both modes. + +For this table, the `Errors` column is trusted-mode scoped. In light mode, these same methods follow the separate light-mode contract, including readiness and proof-verification errors (`-32011`, `-32014`, `-32015` where applicable), in [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads). + +| Method | Exact params | Exact result | Errors | +| --- | --- | --- | --- | +| `eth_chainId` | `[]` or omitted | `QuantityHex` | trusted mode: `-32602` for non-empty params; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| `eth_blockNumber` | `[]` or omitted | `QuantityHex` | trusted mode: `-32602` for non-empty params; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| `eth_getBalance` | `[address, block]` | `QuantityHex` | trusted mode: `-32602` malformed address or selector; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| `eth_getCode` | `[address, block]` | `HexData` | trusted mode: `-32602` malformed address or selector; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| `eth_getStorageAt` | `[address, slot, block]` | `Bytes32` | trusted mode: `-32602` malformed address, slot, or selector; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | +| `eth_getTransactionCount` | `[address, block]` | `QuantityHex` | trusted mode: `-32602` malformed address or selector; light mode: see [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) | + +Trusted-mode state-backed read selectors follow the current-head-only constraint above. + +## Trusted-Only Read Extensions + +These methods are trusted-mode only and return `-32010` in light mode. + +| Method | Exact params | Exact result | Errors | +| --- | --- | --- | --- | +| `eth_accounts` | `[]` or omitted | array of 10 managed dev-account addresses in ascending index order | `-32602` for non-empty params | +| `eth_coinbase` | `[]` or omitted | `Address` | `-32602` for non-empty params | +| `eth_gasPrice` | `[]` or omitted | `QuantityHex` | `-32602` for non-empty params | +| `eth_maxPriorityFeePerGas` | `[]` or omitted | `QuantityHex` | `-32602` for non-empty params | +| `eth_blobBaseFee` | `[]` or omitted | `QuantityHex` | `-32602` for non-empty params | +| `eth_feeHistory` | `[blockCount, newestBlock]` or `[blockCount, newestBlock, rewardPercentiles]` | `FeeHistoryResult` | `-32602` malformed block count, selector, or percentiles | +| `eth_getStorageValues` | `[storageRequest, block]` | object keyed by `Address`, each value an array of `Bytes32` in requested slot order | `-32602` malformed or empty request, malformed address, slot, or selector | +| `eth_getProof` | `[address, storageKeys, block]` | account proof object with live account fields and requested storage values | `-32602` malformed address, storage key, or selector | + +`eth_getStorageValues` is a trusted-mode batch storage extension. `storageRequest` must be a non-empty object whose keys are addresses and whose values are arrays of storage slots: + +```json +{ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] +} +``` + +The `block` selector follows the same current-head-only rule as other trusted-mode state-backed reads. + +## Managed Accounts (Summary) + +- `eth_accounts` returns the 10 deterministic managed dev-account addresses in ascending index order. +- `eth_coinbase` returns the current trusted-mode coinbase (default managed account index `0`). +- For mnemonic, derivation root, full address/private-key table, and signing behavior, see [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet). + +## `FeeHistoryResult` + +Shape: + +```json +{ + "oldestBlock": "0x0", + "baseFeePerGas": ["0x3b9aca00", "0x3b9aca00"], + "gasUsedRatio": [0.0], + "reward": [["0x0"]] +} +``` + +Rules: + +- `oldestBlock`: `QuantityHex` +- `baseFeePerGas`: length `N + 1` +- `gasUsedRatio`: length `N` +- `reward`: optional; when present, length `N`, each inner array length equals requested percentile count +- when `reward` is present, each reward entry for an empty block is `0x0` +- `N` is the number of returned blocks after truncation + +## `eth_feeHistory` Exact Behavior + +Supported params: + +- `[blockCount, newestBlock]` +- `[blockCount, newestBlock, rewardPercentiles]` + +Validation: + +- tuple length must be 2 or 3 +- `blockCount` must decode as `QuantityHex` and be `>= 1` +- `newestBlock` must resolve as a trusted selector +- if `rewardPercentiles` is present, it must be an array with length `<= 100` +- each percentile value must be finite and within `0 <= p <= 100` +- percentile values must be non-decreasing + +Bounds and truncation: + +- max effective `blockCount` is `1024` +- range is truncated at genesis when needed +- truncation does not produce an error + +Result rules: + +- `oldestBlock` is `QuantityHex` +- `baseFeePerGas` length is `N + 1` +- `gasUsedRatio` length is `N` +- `reward` is omitted when percentiles are omitted +- when `reward` is present, outer length is `N`; each inner array length equals requested percentile count +- when `reward` is present, each reward entry for an empty block is `0x0` + +`N` is the number of returned blocks after truncation. + +## Mode Gating + +- `eth_accounts`, `eth_coinbase`, `eth_gasPrice`, `eth_maxPriorityFeePerGas`, `eth_blobBaseFee`, `eth_feeHistory`, `eth_getStorageValues`, and `eth_getProof` are trusted-mode only and return `-32010` in light mode. +- `eth_chainId`, `eth_blockNumber`, `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, and `eth_getTransactionCount` are also available in light mode with a separate contract and distinct error surface: [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads). + +## Example: `eth_getBalance` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "eth_getBalance", + "params": ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "latest"] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x21e19e0c9bab2400000" +} +``` + +## Example: `eth_feeHistory` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "eth_feeHistory", + "params": ["0x2", "latest", [25, 75]] +} +``` + +Response shape: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "oldestBlock": "0x0", + "baseFeePerGas": ["0x3b9aca00", "0x3b9aca00", "0x3b9aca00"], + "gasUsedRatio": [0.0, 0.0], + "reward": [["0x0", "0x0"], ["0x0", "0x0"]] + } +} +``` + +## Related Pages + +- [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [Simulation](/reference/json-rpc/simulation) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) diff --git a/site/src/pages/reference/json-rpc/dev-controls.mdx b/site/src/pages/reference/json-rpc/dev-controls.mdx new file mode 100644 index 0000000..87960cd --- /dev/null +++ b/site/src/pages/reference/json-rpc/dev-controls.mdx @@ -0,0 +1,276 @@ +--- +title: ZEVM Controls +description: Trusted-mode zevm_* state controls, snapshots, impersonation, funding helpers, and metadata methods. +--- + +# ZEVM Controls + +This page covers trusted-mode `zevm_*` state and control methods. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +- trusted mode: supported +- light mode: unsupported (`-32010`) for every method and alias on this page + +Malformed params return `-32602` unless noted otherwise. + +## Shared Types + +| Type | Contract | +| --- | --- | +| `QuantityHex` | `0x`-prefixed unsigned integer, minimal hex encoding except `0x0` | +| `Address` | `0x`-prefixed 20-byte hex | +| `Hash32` | `0x`-prefixed 32-byte hex | +| `Bytes32` | `0x`-prefixed 32-byte hex | +| `HexData` | `0x`-prefixed byte-string hex; `0x` means empty | +| `BlockTag` | `latest`, `earliest`, `pending`, `safe`, `finalized`, or numeric quantity | +| `TrustedBlockSelector` | any `BlockTag` (`latest`, `earliest`, `pending`, `safe`, `finalized`, or numeric quantity) | + +Trusted selector meanings: + +- `latest`: current local head +- `pending`, `safe`, `finalized`: aliases of `latest` +- `earliest`: block `0` +- numeric: exact local block number + +## Shared Objects + +### `AccountState` + +```json +{ + "balance": "0x0", + "nonce": "0x0", + "code": "0x", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `balance` | yes | `QuantityHex` | non-null | +| `nonce` | yes | `QuantityHex` | non-null | +| `code` | yes | `HexData` | non-null | +| `storage` | yes | object mapping `Bytes32` -> `Bytes32` | non-null (empty object allowed) | + +### `StateBlob` + +`zevm_dumpState` returns `HexData` whose bytes are UTF-8 JSON: + +```json +{ + "version": 1, + "accounts": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x0", + "nonce": "0x0", + "code": "0x", + "storage": {} + } + } +} +``` + +Rules: + +- `version` must be integer `1` +- `accounts` maps `Address` to `AccountState` +- dump output is sorted by address for stable blobs +- load replaces the local account/code/storage state-manager caches; it does not change fork config, chain metadata, mining config, pending txs, snapshots, receipts, logs, or canonical blocks + +### `NodeMetadata` + +```json +{ + "mode": "trusted", + "chainId": "0x7a69", + "forking": false, + "forkUrl": null, + "forkBlockNumber": null +} +``` + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `mode` | yes | string literal | always `"trusted"` | +| `chainId` | yes | `QuantityHex` | non-null | +| `forking` | yes | boolean | non-null | +| `forkUrl` | yes | string or `null` | must be `null` when `forking=false` | +| `forkBlockNumber` | yes | `QuantityHex` or `null` | must be `null` when `forking=false` | + +### `NodeInfo` + +```json +{ + "chainId": "0x7a69", + "coinbase": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "blockNumber": "0x0", + "managedAccounts": [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ], + "mining": { + "type": "auto", + "blockTime": null + }, + "fork": { + "enabled": false, + "url": null, + "blockNumber": null + } +} +``` + +`managedAccounts` in the example above is truncated for brevity. Actual `zevm_nodeInfo` returns all 10 managed dev addresses in ascending index order, matching `eth_accounts`. + +Field contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `chainId` | yes | `QuantityHex` | non-null | +| `coinbase` | yes | `Address` | non-null | +| `blockNumber` | yes | `QuantityHex` | non-null | +| `managedAccounts` | yes | array of `Address` | non-null; exact 10 managed addresses in ascending index order | +| `mining` | yes | object | non-null; see nested contract below | +| `fork` | yes | object | non-null; see nested contract below | + +`NodeInfo.mining` nested contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `type` | yes | string enum | `auto`, `manual`, or `interval` | +| `blockTime` | yes | `QuantityHex` or `null` | non-null only when `type = "interval"` | + +`NodeInfo.fork` nested contract: + +| Field | Required | Type | Nullability / rule | +| --- | --- | --- | --- | +| `enabled` | yes | boolean | non-null | +| `url` | yes | string or `null` | non-null only when `enabled = true` | +| `blockNumber` | yes | `QuantityHex` or `null` | `null` means fork head; may be non-null only when `enabled = true` | + +## Methods + +| Canonical method | Exact params | Exact result | Accepted aliases | +| --- | --- | --- | --- | +| `zevm_getAccount` | `[address]` or `[address, block]` | `AccountState` | none | +| `zevm_setAccount` | `[address, accountState]` | `true` | none | +| `zevm_dumpState` | `[]` or omitted | `HexData` state blob | `anvil_dumpState` | +| `zevm_loadState` | `[stateBlob]` | `true` | `anvil_loadState` | +| `zevm_setBalance` | `[address, balance]` | `true` | `anvil_setBalance`, `hardhat_setBalance` | +| `zevm_addBalance` | `[address, delta]` | `true` | `anvil_addBalance` | +| `zevm_setCode` | `[address, code]` | `true` | `anvil_setCode`, `hardhat_setCode` | +| `zevm_setNonce` | `[address, nonce]` | `true` | `anvil_setNonce`, `hardhat_setNonce` | +| `zevm_setStorageAt` | `[address, slot, value]` | `true` | `anvil_setStorageAt`, `hardhat_setStorageAt` | +| `zevm_setChainId` | `[chainId]` | `true` | `anvil_setChainId` | +| `zevm_snapshot` | `[]` or omitted | `QuantityHex` snapshot id | `anvil_snapshot`, `evm_snapshot` | +| `zevm_revert` | `[snapshotId]` | boolean | `anvil_revert`, `evm_revert` | +| `zevm_impersonateAccount` | `[address]` | `true` | `anvil_impersonateAccount`, `hardhat_impersonateAccount` | +| `zevm_stopImpersonatingAccount` | `[address]` | `true` | `anvil_stopImpersonatingAccount`, `hardhat_stopImpersonatingAccount` | +| `zevm_autoImpersonateAccount` | `[enabled]` | `true` | `anvil_autoImpersonateAccount` | +| `zevm_deal` | `[address, value]` | `true` | `anvil_deal` | +| `zevm_dealErc20` | `[token, address, value]` | `true` | `anvil_dealErc20` | +| `zevm_setErc20Allowance` | `[token, owner, spender, value]` | `true` | `anvil_setErc20Allowance` | +| `zevm_metadata` | `[]` or omitted | `NodeMetadata` | `anvil_metadata`, `hardhat_metadata` | +| `zevm_nodeInfo` | `[]` or omitted | `NodeInfo` | `anvil_nodeInfo` | + +## Method Rules + +- malformed addresses, quantities, bytes, selectors, tuple lengths, or object fields return `-32602` +- `zevm_revert` returns `false` for unknown snapshot id +- all methods and aliases above return `-32010` in light mode +- `zevm_snapshot`/`zevm_revert` capture and restore trusted local runtime state: local chain, state/journal, receipt/log indexes, pending tx pool, mining and block-environment overrides, impersonation, and time controls +- `zevm_snapshot`/`zevm_revert` do not capture light-mode consensus/checkpoint-sync state and do not mutate remote fork-source state + +## Impersonation Semantics + +- `eth_sendTransaction` signer scope is the union of managed trusted accounts, the manual impersonation set (`zevm_impersonateAccount` adds, `zevm_stopImpersonatingAccount` removes), and all addresses while auto impersonation is enabled +- `zevm_autoImpersonateAccount([true])` enables automatic impersonation for any `from` address +- `zevm_autoImpersonateAccount([false])` disables automatic impersonation; signer scope then falls back to managed trusted accounts plus the current manual impersonation set +- toggling `zevm_autoImpersonateAccount` does not clear or mutate manual impersonation entries +- `zevm_stopImpersonatingAccount` affects only the manual impersonation set; while auto impersonation is enabled, sends from that address remain allowed +- unmanaged impersonated `eth_sendTransaction` is accepted as an unsigned legacy envelope whose explicit sender metadata is preserved in txpool, mined transaction, block hydration, and receipt results + +## Example: `zevm_setBalance` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "zevm_setBalance", + "params": [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x21e19e0c9bab2400000" + ] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +## Example: `anvil_snapshot` Alias + `zevm_revert` + +Snapshot request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "anvil_snapshot", + "params": [] +} +``` + +Snapshot response: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": "0x1" +} +``` + +Revert request: + +```json +{ + "jsonrpc": "2.0", + "id": 3, + "method": "zevm_revert", + "params": ["0x1"] +} +``` + +Revert response: + +```json +{ + "jsonrpc": "2.0", + "id": 3, + "result": true +} +``` + +## Related Pages + +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) +- [Core Reads](/reference/json-rpc/core-reads) +- [Managed Dev Wallet (Trusted Mode)](/reference/json-rpc/managed-dev-wallet) +- [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) diff --git a/site/src/pages/reference/json-rpc/managed-dev-wallet.mdx b/site/src/pages/reference/json-rpc/managed-dev-wallet.mdx new file mode 100644 index 0000000..962137f --- /dev/null +++ b/site/src/pages/reference/json-rpc/managed-dev-wallet.mdx @@ -0,0 +1,50 @@ +--- +title: Managed Dev Wallet (Trusted Mode) +description: "Exact trusted-mode managed dev-wallet contract: mnemonic, derivation root, addresses, private keys, and signing behavior." +--- + +# Managed Dev Wallet (Trusted Mode) + +This page defines ZEVM trusted mode's exact deterministic managed dev-wallet contract. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +## Exact Wallet Contract + +- mode scope: trusted mode only +- mnemonic: `test test test test test test test test test test test junk` +- derivation path root: `m/44'/60'/0'/0/` +- initial index: `0` +- account count: `10` +- `eth_accounts` returns the managed addresses below in ascending index order +- `eth_sendTransaction` signs only for these managed accounts; unmanaged impersonated sends use explicit sender metadata with an unsigned legacy envelope + +## Managed Accounts (Exact) + +| Index | Address | Private key | +| --- | --- | --- | +| `0` | `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266` | `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` | +| `1` | `0x70997970C51812dc3A010C7d01b50e0d17dc79C8` | `0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d` | +| `2` | `0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC` | `0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a` | +| `3` | `0x90F79bf6EB2c4f870365E785982E1f101E93b906` | `0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6` | +| `4` | `0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65` | `0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a` | +| `5` | `0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc` | `0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba` | +| `6` | `0x976EA74026E726554dB657fA54763abd0C3a0aa9` | `0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e` | +| `7` | `0x14dC79964da2C08b23698B3D3cc7Ca32193d9955` | `0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356` | +| `8` | `0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f` | `0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97` | +| `9` | `0xa0Ee7A142d267C1f36714E4a8F75612F20a79720` | `0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6` | + +## Trusted Runtime Defaults (Not Wallet-Contract Fields) + +- default chain ID: `31337` (`0x7a69`) +- initial balance per managed account at startup: `10000000000000000000000` wei (`10000 ETH`) +- `eth_coinbase` returns the managed account at `coinbaseIndex` (default `0`) +- `coinbaseIndex` must be in `0..9`. + +## Behavioral Notes + +- In light mode, wallet-dependent trusted methods are unavailable and fail with `-32010`. + +These keys are public development-only keys and are never safe for public networks. diff --git a/site/src/pages/reference/json-rpc/overview.mdx b/site/src/pages/reference/json-rpc/overview.mdx new file mode 100644 index 0000000..770bd3a --- /dev/null +++ b/site/src/pages/reference/json-rpc/overview.mdx @@ -0,0 +1,207 @@ +--- +title: JSON-RPC Overview +description: Transport, envelope rules, error codes, selector semantics, and method surface by mode. +--- + +# JSON-RPC Overview + +This page defines the ZEVM HTTP JSON-RPC 2.0 contract shared across trusted mode and light mode. + +## Current Public Contract + +In JSON-RPC docs, the current public ZEVM RPC contract is: + +- HTTP JSON-RPC transport only on `/` +- mode-gated method surface (`trusted` vs `light`) with explicit unsupported behavior +- light-mode readiness gating for proof-backed reads +- source-build installation as the current installation/distribution guarantee +- installer UX, signing/notarization, and byte-identical binary reproducibility guarantees remain out of scope + +## Transport + +- HTTP only +- JSON-RPC endpoint path is `/` only +- request path other than `/` returns HTTP `404` with no JSON-RPC body +- `POST` only on `/` +- non-`POST` request to `/` returns HTTP `405` with no JSON-RPC body +- `POST /` request content type must be `application/json` (media-type parameters allowed) +- unsupported or missing request content type returns HTTP `415` with no JSON-RPC body +- JSON-RPC success and error envelopes return HTTP `200` +- notification-only request or notification-only batch returns HTTP `204` with empty body +- JSON-RPC responses use content type `application/json` +- request bodies larger than `8,388,608` bytes return HTTP `413` with no JSON-RPC body +- HTTP headers are capped by an `8,192` byte read buffer; oversized or malformed headers close the connection without a JSON-RPC body +- listener concurrency is bounded at `64` active TCP connections; each connection has `15,000` ms read and write socket timeouts +- slow clients do not block unrelated accepted clients; JSON-RPC handler dispatch is serialized within one ZEVM process to protect runtime state +- WebSocket transport is unsupported; transport absence is handled at HTTP transport level, not as JSON-RPC `-32010` +- For transport-level debugging/remediation of `404`/`405`/`413`/`415`/`204`, see [Troubleshooting -> HTTP Transport Statuses (JSON-RPC)](/quickstart/troubleshooting#http-transport-statuses-json-rpc) + +Canonical ZEVM-owned transport/parser shipping-path requirement: + +- ZEVM phase-1 shipping path uses one canonical ZEVM-owned HTTP transport/parser stack for request framing, JSON parsing, and envelope dispatch +- shipped behavior for notification-only single requests and notification-only batches must be produced by that same canonical stack and must return HTTP `204` with empty body +- alternate transport/parser stacks are out of contract for shipped phase-1 behavior claims + +## Normative Sources + +- Product requirements: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) +- JSON-RPC contract source: [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md) +- Contract ownership and docs-first change flow: [Canonical Specs And Docs-First Process](/reference/specs-and-process) + +## JSON-RPC Envelope Rules + +- protocol version is always `"2.0"` +- single requests are supported +- batches are supported +- notification: request object with no `id` +- ZEVM sends no JSON-RPC response for notifications +- mixed batches include responses only for items that had `id`, preserving input order for those items +- `"id": null` is not a notification and receives a response + +Empty batch `[]` returns HTTP `200` with exactly: + +```json +{ + "jsonrpc": "2.0", + "id": null, + "error": { + "code": -32600, + "message": "Invalid Request" + } +} +``` + +## Error Codes + +### Standard JSON-RPC codes + +| Condition | Code | +| --- | --- | +| parse error | `-32700` | +| invalid request | `-32600` | +| method not found | `-32601` | +| invalid params | `-32602` | +| internal error | `-32603` | + +### ZEVM runtime RPC codes + +| Condition | Code | +| --- | --- | +| method unsupported in active mode | `-32010` | +| light mode not ready for proof-backed reads | `-32011` | +| proof verification failed | `-32014` | +| malformed data from upstream proof source | `-32015` | + +### ZEVM startup-reserved codes (pre-listener) + +These codes are reserved for startup validation failures and are not emitted as runtime HTTP JSON-RPC responses. + +| Condition | Code | +| --- | --- | +| selected checkpoint too old under strict startup policy | `-32012` | +| checkpoint input or persisted checkpoint is malformed/corrupt | `-32013` | + +Startup policy context: + +- selected checkpoint staleness is only when `age > maxCheckpointAgeSeconds` (`age == maxCheckpointAgeSeconds` is valid) +- `age` is how old the selected startup checkpoint is when ZEVM starts +- `age` is evaluated once during startup, after checkpoint selection and before stale-policy decision +- `age` is measured in whole seconds: `age = max(0, startupTimeSeconds - checkpointTimeSeconds)` +- `startupTimeSeconds` is sampled at age-check time +- `checkpointTimeSeconds` is derived deterministically from the selected startup checkpoint hash on the selected network +- derivation steps: call `GET /eth/v1/beacon/genesis` and parse `data.genesis_time`; call `GET /eth/v1/beacon/headers/{selectedCheckpointHash}` and parse `data.root` and `data.header.message.slot` (with `data.root` required to equal `selectedCheckpointHash`) +- compute summary: `checkpointTimeSeconds = genesisTimeSeconds + (checkpointSlot * 12)` (integer Unix seconds, with phase-1 `SECONDS_PER_SLOT = 12`) +- `checkpointTimeSeconds` is anchored to the selected startup checkpoint input and must not be derived from filesystem metadata (for example, `checkpointDir/checkpoint` mtime) +- stale checkpoint with `strictCheckpointAge = false`: startup emits one operator-facing warning before listening, then continues +- stale checkpoint with `strictCheckpointAge = true`: startup fails before the HTTP listener starts +- inability to resolve `checkpointTimeSeconds` for the selected startup checkpoint is startup failure before the HTTP listener starts +- missing persisted `checkpointDir/checkpoint` is treated as absent startup input and checkpoint selection falls through by precedence +- unreadable persisted `checkpointDir/checkpoint` is a startup failure before the HTTP listener starts +- malformed startup checkpoint input or malformed persisted checkpoint file fails startup before the HTTP listener starts +- baked default checkpoint values are release/build-specific startup data; this page defines runtime/startup error semantics, while startup knobs and precedence are specified in [Light-Mode Configuration](/reference/configuration/light-mode) and [Configuration Overview](/reference/configuration/overview) + +### Shared error rules + +- malformed addresses, quantities, hex bytes, selectors, indexes, filters, tuple lengths, and invalid object field combinations return `-32602` +- well-formed requests for supported methods unavailable in active mode return `-32010` +- `-32012` and `-32013` remain startup-reserved and are not emitted after the HTTP listener is active +- trusted block/tx/receipt lookup miss returns `null` +- `eth_getLogs` with no matches returns `[]` + +## Block Selector Semantics + +### Trusted selectors + +| Selector | Meaning | +| --- | --- | +| `latest` | current canonical local head | +| `pending` | alias of `latest` | +| `safe` | alias of `latest` | +| `finalized` | alias of `latest` | +| `earliest` | block `0` | +| numeric quantity | exact local block number | + +### Light selectors + +| Selector | Meaning | +| --- | --- | +| `latest` | latest verified optimistic execution head | +| `safe` | consensus-backed safe execution head | +| `finalized` | consensus-finalized execution head | +| `earliest` | block `0` | +| numeric quantity | block `0` or a retained numeric block in the verified-history window | +| `pending` | unsupported (`-32010`) | + +## Method Surface By Mode + +### Trusted mode + +- Core reads: `eth_chainId`, `eth_blockNumber`, `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getStorageValues`, `eth_getProof`, `eth_getTransactionCount`, `eth_accounts`, `eth_coinbase`, `eth_gasPrice`, `eth_maxPriorityFeePerGas`, `eth_blobBaseFee`, `eth_feeHistory` +- Simulation and execution testing: `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, `testing_buildBlockV1` +- Submission: `eth_sendTransaction`, `eth_sendRawTransaction` +- Compatibility utilities: `rpc_modules`, `web3_clientVersion`, `web3_sha3`, `net_version`, `net_listening`, `net_peerCount`, `eth_mining`, `eth_hashrate`, `eth_getWork`, `eth_submitWork`, `eth_submitHashrate`, `eth_syncing`, `eth_protocolVersion` +- Mining/txpool controls: trusted `zevm_*` mining and txpool controls (plus accepted aliases) +- Txpool introspection: `txpool_content`, `txpool_contentFrom`, `txpool_status`, `txpool_inspect` +- Block-environment/time/reset/fork-source controls: trusted `zevm_*` block-environment/time/reset/fork-source controls (plus accepted aliases) +- Queries: `eth_getBlockByNumber`, `eth_getBlockByHash`, `eth_getBlockTransactionCountByNumber`, `eth_getBlockTransactionCountByHash`, `eth_getUncleCountByBlockNumber`, `eth_getUncleCountByBlockHash`, `eth_getUncleByBlockNumberAndIndex`, `eth_getUncleByBlockHashAndIndex`, `eth_getTransactionByHash`, `eth_getTransactionByBlockNumberAndIndex`, `eth_getTransactionByBlockHashAndIndex`, `eth_getTransactionReceipt`, `eth_getBlockReceipts`, `eth_getBlockAccessList`, `eth_getLogs`, and filter lifecycle methods +- Debug/raw inspection: `debug_getBadBlocks`, `debug_getRawBlock`, `debug_getRawHeader`, `debug_getRawReceipts`, `debug_getRawTransaction` +- Account/state/chain-id/snapshot/impersonation/funding/metadata controls: trusted `zevm_*` account/state/chain-id/snapshot/impersonation/funding/metadata controls (plus accepted aliases) +- Optional Engine API listener: `engine_*` methods from the generated execution API surface when trusted startup enables `engineRpc` or `--engine-host` / `--engine-port`; supports local payload build jobs, strict `newPayload` import for known local parents, `getPayload` by payload id, payload-body lookup, and null blob sidecar lookup for unavailable blobs + +Snapshot/revert boundary in trusted mode: `zevm_snapshot`/`zevm_revert` affect trusted local runtime state only, do not capture light-mode sync/checkpoint state, and do not mutate remote fork-source state. + +### Light mode + +- Always callable: `zevm_lightSyncStatus`, `eth_chainId` +- Readiness-gated: `eth_blockNumber`, `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getTransactionCount` +- simulation and execution-testing methods are trusted-only in phase 1; light-mode `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, and `testing_buildBlockV1` return `-32010`, and `eth_call` remains a deferred light-mode proof-backed target + +> Readiness gate: while light mode is not ready, readiness-gated calls return `-32011`. See [Verified Light-Mode Reads Methods](/reference/json-rpc/verified-light-mode-reads#methods) and [Readiness And Proof Rules](/reference/json-rpc/verified-light-mode-reads#readiness-and-proof-rules). + +## Example: Notification Request + +Request (no `id`): + +```json +{ + "jsonrpc": "2.0", + "method": "eth_chainId", + "params": [] +} +``` + +Response: no JSON-RPC body, HTTP `204`. + +## Reference Pages + +- [Configuration Overview](/reference/configuration/overview) +- [Trusted-Mode Configuration](/reference/configuration/trusted-mode) +- [Light-Mode Configuration](/reference/configuration/light-mode) +- [Canonical Specs And Docs-First Process](/reference/specs-and-process) +- [Core Reads](/reference/json-rpc/core-reads) +- [Simulation](/reference/json-rpc/simulation) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) +- [Blocks, Receipts, And Logs](/reference/json-rpc/blocks-receipts-and-logs) +- [ZEVM Controls](/reference/json-rpc/dev-controls) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) diff --git a/site/src/pages/reference/json-rpc/simulation.mdx b/site/src/pages/reference/json-rpc/simulation.mdx new file mode 100644 index 0000000..0a3f033 --- /dev/null +++ b/site/src/pages/reference/json-rpc/simulation.mdx @@ -0,0 +1,191 @@ +--- +title: Simulation +description: Trusted-mode execution simulation contract, including TransactionRequest and override sets. +--- + +# Simulation + +`eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, and `testing_buildBlockV1` are trusted-mode execution simulation methods. + +- trusted mode: supported +- light mode: unsupported (`-32010`) + +These methods execute on a checkpoint-and-revert path and do not mutate canonical state. + +## Methods + +| Method | Exact params | Exact result | Errors | +| --- | --- | --- | --- | +| `eth_call` | `[tx, block]` or `[tx, block, stateOverrides]` | `HexData` | `-32602` malformed tx, selector, or overrides; `-32603` runtime execution failure; `-32010` in light mode | +| `eth_estimateGas` | `[tx]`, `[tx, block]`, or `[tx, block, stateOverrides]` | `QuantityHex` | `-32602` malformed tx, selector, or overrides; `-32603` runtime execution failure; `-32010` in light mode | +| `eth_createAccessList` | `[tx]` or `[tx, block]` | object with `accessList` and `gasUsed` | `-32602` malformed tx or selector; `-32603` unrecoverable execution failure; `-32010` in light mode | +| `eth_simulateV1` | `[payload]` or `[payload, block]` | array of simulated block result objects | `-32602` malformed payload or selector; per-call execution failures are returned inside call results; `-32010` in light mode | +| `testing_buildBlockV1` | `[parentHash, payloadAttributes, transactions|null, extraData]` | engine API builder payload envelope | `-32602` malformed params; `-32000` when supplied transactions cannot be applied; `-32010` in light mode | + +Any tuple length not listed above returns `-32602`. + +Execution outcome semantics: + +- success path: + - `eth_call` returns `HexData` + - `eth_estimateGas` returns `QuantityHex` + - `eth_createAccessList` returns a generated access-list envelope; the current implementation returns an empty access list when no tracer-derived entries are available + - `eth_simulateV1` returns block-scoped call result objects and reverts all canonical state changes before responding + - `testing_buildBlockV1` builds a payload envelope without changing the canonical chain or head +- runtime execution failure path (for example revert, out-of-gas, invalid execution in simulation context): JSON-RPC `-32603` with message `Internal error`, no `result`, and no revert-data result payload +- omitted transaction field defaults: + - `from`: trusted runtime coinbase + - `gas`: selected simulation block gas limit + - `gasPrice`: trusted runtime gas price + - `value`: `0x0` + - `nonce`: no nonce check + - `data`/`input`: empty bytes +- create semantics: + - omitted `to` or `to: null` executes the request as contract creation + - create simulations use the sender's current nonce for CREATE address and collision semantics + - created code and the temporary sender nonce increment are reverted before the response +- gas estimation: + - computes intrinsic gas for the runtime-owned active hardfork and whether the request is create or call + - uses the explicit `gas` value as the upper bound when present; otherwise uses the selected simulation block gas limit + - rejects upper bounds below intrinsic gas or above the selected block gas limit with `-32603` + - requires the upper bound to execute successfully, then binary-searches for the lowest successful gas limit in `[intrinsic, upperBound]` +- block environment: + - current-head simulations use the trusted runtime chain ID, coinbase, head block number, head timestamp, gas limit, base fee, blob base fee, and active one-shot block-environment overrides + - state-backed simulation is current-head only; selectors that resolve to a non-head block return `-32602` + - omitted `gas` defaults to the selected simulation block gas limit + +## `TransactionRequest` + +Allowed fields only: + +| Field | Type | Rule | +| --- | --- | --- | +| `from` | `Address` | optional | +| `to` | `Address` or `null` | omitted or `null` for create | +| `gas` | `QuantityHex` | optional | +| `gasPrice` | `QuantityHex` | optional | +| `maxFeePerGas` | `QuantityHex` | optional dynamic-fee field | +| `maxPriorityFeePerGas` | `QuantityHex` | optional dynamic-fee field | +| `maxFeePerBlobGas` | `QuantityHex` | optional blob-fee field | +| `value` | `QuantityHex` | optional | +| `nonce` | `QuantityHex` | optional | +| `chainId` | `QuantityHex` | optional | +| `type` | `QuantityHex` | optional transaction type | +| `accessList` | access-list array | optional | +| `blobVersionedHashes` | array of `Hash32` | optional | +| `blobs`, `commitments`, `proofs` | arrays | accepted and shape-validated for blob-style requests | +| `authorizationList` | array | accepted and shape-validated for EIP-7702-style requests | +| `data` | `HexData` | optional | +| `input` | `HexData` | optional alias of `data` | + +Rules: + +- `data` and `input` may both be omitted +- if both are present, they must be byte-identical +- any field not listed above returns `-32602` +- transaction types `0x0` through `0x4` are accepted by the simulation parser; unsupported type values return an RPC error + +## `StateOverrideSet` + +`stateOverrides` is an object keyed by address. Each value may include: + +| Field | Type | +| --- | --- | +| `balance` | `QuantityHex` | +| `nonce` | `QuantityHex` | +| `code` | `HexData` | +| `storage` | object mapping `Bytes32` slot -> `Bytes32` value | +| `state` | object mapping `Bytes32` slot -> `Bytes32` value, replacing existing storage | +| `stateDiff` | object mapping `Bytes32` slot -> `Bytes32` value | +| `movePrecompileToAddress` | `Address`, for `eth_simulateV1` precompile move tests | + +Example: + +```json +{ + "0x0000000000000000000000000000000000000001": { + "balance": "0xde0b6b3a7640000", + "nonce": "0x1", + "code": "0x60006000", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } +} +``` + +## Trusted Selector Rules + +Simulation selectors use trusted-mode selector semantics: + +- `latest`: current local head +- `pending`, `safe`, `finalized`: aliases of `latest` +- `earliest`: block `0`, accepted only while the current head is genesis +- numeric quantity: accepted only when equal to the current local head + +Malformed selectors and selectors that resolve to a non-head block return `-32602`. + +## Example: `eth_call` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "eth_call", + "params": [ + { + "to": "0x0000000000000000000000000000000000000001", + "data": "0x70a08231000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + }, + "latest" + ] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +## Example: `eth_estimateGas` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "eth_estimateGas", + "params": [ + { + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x0000000000000000000000000000000000000001", + "data": "0x" + } + ] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": "0x5208" +} +``` + +## Related Pages + +- [Core Reads](/reference/json-rpc/core-reads) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) +- [ZEVM Controls](/reference/json-rpc/dev-controls) +- [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) diff --git a/site/src/pages/reference/json-rpc/transactions-and-mining.mdx b/site/src/pages/reference/json-rpc/transactions-and-mining.mdx new file mode 100644 index 0000000..d60b7b3 --- /dev/null +++ b/site/src/pages/reference/json-rpc/transactions-and-mining.mdx @@ -0,0 +1,248 @@ +--- +title: Transactions And Mining +description: Trusted-mode transaction submission plus mining, txpool, block-environment, time, and fork-source controls. +--- + +# Transactions And Mining + +This page covers trusted-mode transaction submission plus mining, txpool, block-environment, time, and fork-source controls. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +- trusted mode: supported +- light mode: unsupported (`-32010`) for every method and alias on this page + +Malformed params return `-32602` unless a method-specific rule below says otherwise. + +## `TransactionRequest` For `eth_sendTransaction` + +Allowed fields only: + +| Field | Type | Rule | +| --- | --- | --- | +| `from` | `Address` | required | +| `to` | `Address` or `null` | omitted or `null` for create | +| `gas` | `QuantityHex` | optional | +| `gasPrice` | `QuantityHex` | optional | +| `value` | `QuantityHex` | optional | +| `nonce` | `QuantityHex` | optional | +| `data` | `HexData` | optional | +| `input` | `HexData` | optional alias of `data` | + +Rules: + +- `data` and `input` may both be omitted +- if both are present, they must be byte-identical +- any unsupported field returns `-32602` +- unsupported and return `-32602`: `maxFeePerGas`, `maxPriorityFeePerGas`, `maxFeePerBlobGas`, `blobVersionedHashes`, `accessList`, `authorizationList`, `type`, `chainId` +- if `gasPrice` is omitted, ZEVM uses trusted-mode node gas price (`eth_gasPrice`) at submission time + +## Transaction Envelope Support + +- only legacy type `0x0` is supported in the current ZEVM contract +- `eth_sendTransaction` produces legacy type `0x0` +- `eth_sendRawTransaction` accepts only legacy raw transactions +- typed EIP-2718 envelopes (`0x1`, `0x2`, `0x3`, or unknown type byte) return `-32602` +- intrinsic gas and EIP-3860 initcode limits are evaluated against the trusted runtime's configured hardfork policy + +## Submission Methods + +| Canonical method | Exact params | Exact result | Accepted aliases | Errors | +| --- | --- | --- | --- | --- | +| `eth_sendTransaction` | `[tx]` (`TransactionRequest`) | `Hash32` | none | `-32602` malformed request/unsupported fields; `-32603` runtime rejection | +| `eth_sendRawTransaction` | `[rawTx]` | `Hash32` | none | `-32602` malformed hex/decode/unsupported tx type; `-32603` runtime rejection | + +Submission signing and routing rules: + +- `eth_sendTransaction` signer scope is the union of managed trusted accounts, the manual impersonation set (`zevm_impersonateAccount` adds, `zevm_stopImpersonatingAccount` removes), and all addresses while auto impersonation is enabled +- with auto impersonation disabled, `eth_sendTransaction` for an unmanaged `from` not in the manual impersonation set fails at runtime with `-32603` +- unmanaged impersonated `eth_sendTransaction` uses an unsigned legacy envelope plus explicit sender metadata; txpool output, mined transaction queries, full block transaction hydration, and receipts report that metadata sender +- `eth_sendRawTransaction` is for externally signed legacy raw transactions (`0x0`) and does not use managed-account signing + +## Mining And Txpool Methods + +| Canonical method | Exact params | Exact result | Accepted aliases | +| --- | --- | --- | --- | +| `zevm_getAutomine` | `[]` or omitted | boolean | `anvil_getAutomine`, `hardhat_getAutomine` | +| `zevm_setAutomine` | `[enabled]` | `true` | `anvil_setAutomine`, `evm_setAutomine` | +| `zevm_getIntervalMining` | `[]` or omitted | `QuantityHex` seconds (`0x0` when disabled) | `anvil_getIntervalMining` | +| `zevm_setIntervalMining` | `[seconds]` | `true` | `anvil_setIntervalMining`, `evm_setIntervalMining` | +| `zevm_mine` | `[]`, `[count]`, or `[count, intervalSeconds]` | `true` | `anvil_mine`, `hardhat_mine`, `evm_mine` | +| `zevm_mineDetailed` | `[]`, `[count]`, or `[count, intervalSeconds]` | array of `MinedBlockSummary` | `anvil_mineDetailed` | +| `zevm_dropTransaction` | `[transactionHash]` | boolean | `anvil_dropTransaction`, `hardhat_dropTransaction` | +| `zevm_dropAllTransactions` | `[]` or omitted | `QuantityHex` removed count | `anvil_dropAllTransactions` | +| `zevm_removePoolTransactions` | `[transactionHashes]` | `QuantityHex` removed count | `anvil_removePoolTransactions` | + +Rules: + +- `zevm_dropTransaction` returns `false` when tx is absent +- `zevm_setIntervalMining(["0x0"])` disables interval mining + +Trusted txpool introspection compatibility methods: + +| Method | Exact params | Exact result | +| --- | --- | --- | +| `txpool_content` | `[]` or omitted | geth-style pending/queued txpool content object | +| `txpool_contentFrom` | `[address]` | geth-style pending/queued txpool content object filtered to one sender | +| `txpool_status` | `[]` or omitted | object with `pending` and `queued` `QuantityHex` counts | +| `txpool_inspect` | `[]` or omitted | geth-style pending/queued summary object | + +`MinedBlockSummary`: + +```json +{ + "number": "0x1", + "hash": "0x...", + "timestamp": "0x1" +} +``` + +## Time And Block-Environment Methods + +| Canonical method | Exact params | Exact result | Accepted aliases | +| --- | --- | --- | --- | +| `zevm_setCoinbase` | `[address]` | `true` | `anvil_setCoinbase`, `hardhat_setCoinbase` | +| `zevm_setBlockGasLimit` | `[gasLimit]` | `true` | `anvil_setBlockGasLimit`, `evm_setBlockGasLimit` | +| `zevm_setNextBlockBaseFeePerGas` | `[baseFee]` | `true` | `anvil_setNextBlockBaseFeePerGas`, `hardhat_setNextBlockBaseFeePerGas` | +| `zevm_setMinGasPrice` | `[gasPrice]` | `true` | `anvil_setMinGasPrice`, `hardhat_setMinGasPrice` | +| `zevm_increaseTime` | `[seconds]` | `QuantityHex` accumulated offset | `anvil_increaseTime`, `evm_increaseTime` | +| `zevm_setNextBlockTimestamp` | `[timestamp]` | `true` | `anvil_setNextBlockTimestamp`, `evm_setNextBlockTimestamp` | +| `zevm_setTime` | `[timestamp]` | `QuantityHex` effective current timestamp | `anvil_setTime` | +| `zevm_setBlockTimestampInterval` | `[seconds]` | `true` | `anvil_setBlockTimestampInterval` | +| `zevm_removeBlockTimestampInterval` | `[]` or omitted | `true` | `anvil_removeBlockTimestampInterval` | + +## Fork-Source Methods + +| Canonical method | Exact params | Exact result | Accepted aliases | +| --- | --- | --- | --- | +| `zevm_reset` | `[]` or omitted, or `[forkConfig]` | `true` | `anvil_reset`, `hardhat_reset` | +| `zevm_setRpcUrl` | `[url]` | `true` | `anvil_setRpcUrl` | + +`forkConfig` accepts only: + +- `null` +- `{ "url": "https://..." }` +- `{ "url": "https://...", "blockNumber": "0x..." }` + +`zevm_reset` uses JSON-RPC `QuantityHex` for `forkConfig.blockNumber`; startup CLI/config uses decimal `u64` for fork block number (example: startup/config `22000000` corresponds to JSON-RPC `"blockNumber": "0x14fb180"`). + +### Fork-Source Control Semantics + +- `zevm_reset` is a trusted runtime reset control with optional fork-source replacement +- `zevm_reset([])` or omitted params resets trusted runtime state using the currently configured fork-source setting +- `zevm_reset([null])` resets trusted runtime state and clears fork source (local trusted state only) +- `zevm_reset([{ "url": "https://..." }])` resets trusted runtime state and sets a fork source at upstream latest +- `zevm_reset([{ "url": "https://...", "blockNumber": "0x..." }])` resets trusted runtime state and pins fork source to that block +- successful `zevm_reset` always resets local canonical chain to trusted genesis (`0x0`), clears pending tx pool, invalidates snapshot IDs, clears impersonation state and one-shot time/timestamp overrides, and keeps configured `chainId` unchanged +- if fork initialization fails during `zevm_reset` (for example unreachable upstream or invalid fork block), the call fails with `-32603` +- `zevm_setRpcUrl([url])` requires non-empty `http://` or `https://` URL +- precondition for `zevm_setRpcUrl`: fork backing is already enabled; otherwise the call fails with `-32603` +- `zevm_setRpcUrl` updates fork upstream URL in place and does not reset local chain state, clear pending pool, or invalidate snapshots +- `zevm_setRpcUrl` does not redefine snapshot/revert boundaries +- snapshot/revert boundary (`zevm_snapshot` / `zevm_revert`): captures and restores trusted local runtime state only (local chain/state/journal, receipt/log indexes, pending tx pool, mining/block-environment overrides, impersonation, and time controls) +- snapshot/revert does not capture light-mode sync/checkpoint state and does not mutate remote fork-source state +- pinned fork-block preservation: when current fork config is pinned (`blockNumber` non-null), the same pinned block remains active after URL update +- fork URL changes do not infer `chainId` or hardfork policy; `chainId` remains under trusted-mode chain-id controls (for example `zevm_setChainId`), and hardfork policy remains the startup/configured trusted policy + +## Mining Semantics + +### Pending Pool And Inclusion + +- pending ordering is nonce-aware per sender +- when a block is mined, ZEVM includes executable pending transactions in canonical order up to block gas limit +- non-executable queued transactions remain pending + +### Mining modes + +- `auto`: accepted executable tx triggers immediate sealing of one block; no timer-based empty blocks +- `manual`: transactions queue; blocks seal only through explicit mine RPC +- `interval`: one block every configured `blockTime` seconds, including empty blocks + +Interval mining starts when trusted mode starts with interval config or when `zevm_setIntervalMining` enables it. Setting automine/manual mode or `zevm_setIntervalMining(["0x0"])` stops the interval timer before the control call returns. + +Explicit mine calls are valid in all mining modes and mine immediately. + +### Explicit mine call behavior + +- `[]`: mine exactly 1 block +- `[count]`: mine exactly `count` blocks +- `[count, intervalSeconds]`: mine exactly `count` blocks and increment timestamp by `intervalSeconds` between consecutive mined blocks +- if pending txs run out before `count`, remaining blocks are empty + +### Timestamp rules + +Every new block must satisfy `timestamp > parent.timestamp`. + +Timestamp precedence for the next mined block: + +1. one-shot `zevm_setNextBlockTimestamp` override +2. explicit `intervalSeconds` argument for current `zevm_mine`/`zevm_mineDetailed` call +3. `zevm_setBlockTimestampInterval` override, when enabled +4. interval-mining `blockTime` when block is produced by interval tick +5. otherwise `max(parent.timestamp + 1, effective_current_time)` + +`effective_current_time` includes active time offsets from `zevm_increaseTime` and `zevm_setTime`. + +## Example: `eth_sendTransaction` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "eth_sendTransaction", + "params": [ + { + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x0000000000000000000000000000000000000001", + "value": "0xde0b6b3a7640000" + } + ] +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x..." +} +``` + +## Example: `anvil_mineDetailed` Alias + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "anvil_mineDetailed", + "params": ["0x2", "0xc"] +} +``` + +Response shape: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": [ + { "number": "0x1", "hash": "0x...", "timestamp": "0x..." }, + { "number": "0x2", "hash": "0x...", "timestamp": "0x..." } + ] +} +``` + +## Related Pages + +- [Simulation](/reference/json-rpc/simulation) +- [ZEVM Controls](/reference/json-rpc/dev-controls) +- [Blocks, Receipts, And Logs](/reference/json-rpc/blocks-receipts-and-logs) +- [Core Reads](/reference/json-rpc/core-reads) diff --git a/site/src/pages/reference/json-rpc/unsupported-and-deferred.mdx b/site/src/pages/reference/json-rpc/unsupported-and-deferred.mdx new file mode 100644 index 0000000..034a804 --- /dev/null +++ b/site/src/pages/reference/json-rpc/unsupported-and-deferred.mdx @@ -0,0 +1,89 @@ +--- +title: Unsupported And Deferred +description: Public JSON-RPC and transport surfaces intentionally outside the current ZEVM contract. +--- + +# Unsupported And Deferred + +This page lists surfaces intentionally outside the current public ZEVM contract. + +## Unsupported Public Surface + +Not part of the current contract: + +- debug tracing methods +- subscriptions +- WebSocket transport (`ws://` / `wss://`) is outside the current public contract scope (ZEVM JSON-RPC is HTTP-only) + +### Integrator Error Boundaries + +- out-of-contract/deferred method names: well-formed JSON-RPC requests to names not in the current ZEVM method contract return `-32601` (`Method not found`) +- mode-unsupported for supported families: when a method family is part of the ZEVM contract but unavailable in the active mode, well-formed requests return `-32010` +- transport-level unsupported WebSocket behavior: ZEVM exposes HTTP JSON-RPC only, so WebSocket absence is handled at the transport layer (no JSON-RPC `-32010` envelope) + +### Deferred tracing/subscription inventory + +- `debug_traceCall` +- `debug_traceTransaction` +- `eth_subscribe` +- `eth_unsubscribe` + +### Transport-level unsupported inventory + +- WebSocket transport (`ws://` / `wss://`) is transport-level unsupported and outside JSON-RPC method dispatch + +### Deferred light-mode simulation target + +- `eth_call` (deferred light-mode proof-backed target; trusted-only in phase 1) + +### Current mode-gated simulation behavior + +- `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, and `testing_buildBlockV1` are trusted-only methods in phase 1 +- in light mode, well-formed requests to those methods return JSON-RPC `-32010` (unsupported in active mode) + +### Mode-gated trusted-only read extensions + +- `eth_accounts`, `eth_coinbase`, `eth_gasPrice`, `eth_maxPriorityFeePerGas`, `eth_blobBaseFee`, `eth_feeHistory`, `eth_getProof`, and `eth_getStorageValues` are trusted-only +- in light mode, well-formed requests to those methods return JSON-RPC `-32010` (unsupported in active mode) + +### Mode-gated trusted-only compatibility utilities + +- `rpc_modules`, `web3_clientVersion`, `web3_sha3`, `net_version`, `net_listening`, `net_peerCount`, `eth_mining`, `eth_hashrate`, `eth_getWork`, `eth_submitWork`, `eth_submitHashrate`, `eth_syncing`, `eth_protocolVersion`, `txpool_content`, `txpool_contentFrom`, `txpool_status`, and `txpool_inspect` are trusted-only compatibility methods +- `debug_getBadBlocks`, `debug_getRawBlock`, `debug_getRawHeader`, `debug_getRawReceipts`, and `debug_getRawTransaction` are trusted-only debug/raw inspection methods +- in light mode, well-formed requests to those methods return JSON-RPC `-32010` (unsupported in active mode) + +### Optional Engine API listener + +- Engine API methods are trusted-only and are available only on the optional trusted-mode Engine API listener +- get-payload methods report unknown payload ids with `-38001`; new-payload methods validate request shape, import locally valid payloads, and return spec payload status values + +### Error-mapping summary + +- deferred/out-of-contract method inventories on this page map to JSON-RPC `-32601` +- mode-gated method families listed on this page map to JSON-RPC `-32010` when called in an unsupported active mode +- transport absence (for example, WebSocket) is outside JSON-RPC method dispatch and does not map to JSON-RPC `-32010` + +## Deferred Trusted Helpers + +No trusted helper methods are deferred in the current trusted-mode contract. Debug tracing methods remain outside the public surface above. + +## Notes For Integrators + +- The methods on this page have no published request/response contract in ZEVM docs. +- Clients should treat them as unavailable unless canonical spec sources are updated through the docs-first process to promote them into supported surface. +- Normative source ownership lives in [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +- Canonical promotion/boundary criteria: [Specs And Process](/reference/specs-and-process#deferred-surface-promotion-and-phase-1-boundary-and-graduation-criteria). + +## Docs-First Tracking + +- Canonical deferred-surface promotion criteria and phase-1 boundary/graduation criteria: [Specs And Process](/reference/specs-and-process#deferred-surface-promotion-and-phase-1-boundary-and-graduation-criteria) +- Process gate for promotions/contract changes: [`docs/specs/docs-first-process.md` (Change Rules, Review Gate)](https://github.com/evmts/zevm/blob/main/docs/specs/docs-first-process.md#change-rules) +- Canonical promotion targets (normative contract docs): [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md), [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md) +- Deferred-promotion rationale/history is recorded in [`docs/specs/maintainer-decisions.md`](https://github.com/evmts/zevm/blob/main/docs/specs/maintainer-decisions.md), while page-level source/anchor tracking for this surface is maintained in [`docs/specs/page-ownership.md`](https://github.com/evmts/zevm/blob/main/docs/specs/page-ownership.md#active-page-map) + +## Related Pages + +- [JSON-RPC Overview](/reference/json-rpc/overview) +- [Verified Light-Mode Reads](/reference/json-rpc/verified-light-mode-reads) +- [Simulation](/reference/json-rpc/simulation) +- [Transactions And Mining](/reference/json-rpc/transactions-and-mining) diff --git a/site/src/pages/reference/json-rpc/verified-light-mode-reads.mdx b/site/src/pages/reference/json-rpc/verified-light-mode-reads.mdx new file mode 100644 index 0000000..9ef77f7 --- /dev/null +++ b/site/src/pages/reference/json-rpc/verified-light-mode-reads.mdx @@ -0,0 +1,211 @@ +--- +title: Verified Light-Mode Reads +description: Light-mode sync status, readiness gating, selector rules, and proof-backed read methods. +--- + +# Verified Light-Mode Reads + +This page defines the exact light-mode JSON-RPC contract. + +> Normative sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md). +> +> This page is an operational summary. For API-contract disputes, follow those normative sources. + +## Methods + +| Method | Exact params | Exact result | Errors | +| --- | --- | --- | --- | +| `zevm_lightSyncStatus` | `[]` or omitted | light sync status object | `-32010` in trusted mode; `-32602` for non-empty params | +| `eth_chainId` | `[]` or omitted | `QuantityHex` from network mapping | `-32602` for non-empty params | +| `eth_blockNumber` | `[]` or omitted | `QuantityHex` | `-32602` for non-empty params; `-32011` while not ready | +| `eth_getBalance` | `[address, block]` where `block` is `LightBlockSelector` | `QuantityHex` | `-32602`, `-32010`, `-32011`, `-32015`, `-32014` | +| `eth_getCode` | `[address, block]` where `block` is `LightBlockSelector` | `HexData` | `-32602`, `-32010`, `-32011`, `-32015`, `-32014` | +| `eth_getStorageAt` | `[address, slot, block]` where `block` is `LightBlockSelector` | `Bytes32` | `-32602`, `-32010`, `-32011`, `-32015`, `-32014` | +| `eth_getTransactionCount` | `[address, block]` where `block` is `LightBlockSelector` | `QuantityHex` | `-32602`, `-32010`, `-32011`, `-32015`, `-32014` | + +## Chain ID Mapping + +| Network | `eth_chainId` result | +| --- | --- | +| `mainnet` | `0x1` | +| `sepolia` | `0xaa36a7` | +| `holesky` | `0x4268` | + +## `LightBlockSelector` + +| Selector | Meaning | +| --- | --- | +| `latest` | latest verified optimistic execution head | +| `safe` | consensus-backed safe execution head | +| `finalized` | consensus-finalized execution head | +| `earliest` | block `0` | +| numeric quantity | block `0` or retained numeric block in verified history | +| `pending` | unsupported selector token (`-32010`); it never aliases `latest` | + +### Retained-history numeric selector contract + +- retained window size is `8191` verified execution blocks +- let `H` be current `latest` block number when `ready = true` +- retained non-genesis numeric range is `[max(1, H - 8190), H]` +- accepted numeric selector set while ready is `{0}` union `[max(1, H - 8190), H]` +- numeric selector outside that set returns `-32602` +- this accepted-set check is strict + +## Canonical Light-Mode Read Errors + +- `-32011`: light mode is not ready for readiness-gated reads (`eth_blockNumber` and proof-backed reads). +- `-32014`: proof verification failed at a supported selector while ready. +- `-32015`: malformed data from upstream proof source during a proof-backed read. +- `-32010`: selector `pending` is unsupported for light proof-backed reads. + +## Readiness And Proof Rules + +- `ready = true` can be reached only after `status` transitions to `synced` and ZEVM has accepted verified optimistic (`latest`), safe (`safe`), and finalized (`finalized`) heads +- while `ready = true`, verified-head ordering must hold: `finalized <= safe <= latest` +- while `ready = true`, slot ordering must hold: `finalizedSlot <= safeSlot <= optimisticSlot` +- if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`), ZEVM sets `ready = false` in the same transition before serving the next readiness-gated RPC call +- proof-backed reads are allowed only when `ready = true` +- while `ready = false`, readiness-gated reads (`eth_blockNumber` and all proof-backed reads) return `-32011` +- when ready, `eth_blockNumber` returns the light-mode `latest` head number +- while ready, proof-backed read failures use canonical mapping: `-32014` for verification failure and `-32015` for malformed upstream proof data +- proof-backed read evaluation order is exact: + 1. malformed tuple/field/encoding input (including malformed selector token) -> `-32602` + 2. selector `pending` -> `-32010` + 3. `ready = false` -> `-32011` for all remaining selectors, including numeric selectors that would be outside retained history + 4. when `ready = true`, numeric selector outside retained set `{0}` union `[max(1, H - 8190), H]` -> `-32602` + 5. when `ready = true`, malformed upstream proof payload -> `-32015` + 6. when `ready = true`, well-formed proof payload that fails verification against resolved state root -> `-32014` +- `status = "error"` is an operator-recovery state: remediate the underlying startup/sync input issue, then restart the ZEVM process before expecting readiness-gated reads to recover +- phase-1 operator-facing startup inputs are `network`, `consensusRpcUrl`, and `executionRpcUrl`, with optional checkpoint controls (`checkpoint`, `checkpointDir`, `maxCheckpointAgeSeconds`, `strictCheckpointAge`); for startup consensus-network handshake details, see [Light-Mode Configuration](/reference/configuration/light-mode#validation-rules) and [Run Light Mode](/quickstart/run-light-mode#1-start-light-mode) + +## `zevm_lightSyncStatus` Result + +```json +{ + "ready": true, + "status": "synced", + "network": "mainnet", + "checkpointSource": "explicit", + "lastCheckpoint": "0x...", + "optimisticSlot": "0x1234", + "safeSlot": "0x1232", + "finalizedSlot": "0x1230" +} +``` + +`checkpointSource: "explicit"` can come from either user-provided checkpoint path: CLI `--checkpoint` or config `mode.light.checkpoint` (CLI value wins if both are supplied). + +Field rules: + +- `ready`: boolean read-availability gate +- `status`: `syncing`, `synced`, or `error` +- `ready = true` can be reached only after `status` transitions to `synced` and ZEVM has accepted verified optimistic (`latest`), safe (`safe`), and finalized (`finalized`) heads +- `status = "syncing"` and `status = "error"` imply `ready = false` +- `status = "error"` requires operator remediation and process restart before expecting `ready = true` again +- while `ready = true`, verified-head ordering must hold: `finalized <= safe <= latest` +- while `ready = true`, slot ordering must hold: `finalizedSlot <= safeSlot <= optimisticSlot` +- if `status` leaves `synced` or slot coherence no longer holds (`finalizedSlot <= safeSlot <= optimisticSlot`), ZEVM sets `ready = false` in the same transition before serving the next readiness-gated RPC call +- `network`: `mainnet`, `sepolia`, or `holesky` +- `checkpointSource`: startup checkpoint-source winner +- `checkpointSource = "explicit"`: startup used user-provided checkpoint input (`--checkpoint` or `mode.light.checkpoint`; CLI wins if both are supplied) +- `checkpointSource = "persisted"`: startup used operator-managed `checkpointDir/checkpoint` +- `checkpointSource = "default"`: startup used baked network default after no explicit or persisted startup checkpoint input was present +- operators get `checkpointSource = "persisted"` only when they provide/manage `checkpointDir/checkpoint` themselves; ZEVM does not auto-populate that file +- `checkpointSource` is startup-source metadata only: it remains stable for the process lifetime and does not change when `lastCheckpoint` advances during sync +- `lastCheckpoint`: `Hash32` (non-null in runtime responses after startup) +- `optimisticSlot`: `QuantityHex` +- `safeSlot`: `QuantityHex` +- `finalizedSlot`: `QuantityHex` +- `finalizedSlot <= safeSlot <= optimisticSlot` + +Operator runbook cross-link: [Run Light Mode -> Choose Startup Checkpoint Input](/quickstart/run-light-mode#2-choose-startup-checkpoint-input), [Run Light Mode -> Check Readiness With `zevm_lightSyncStatus`](/quickstart/run-light-mode#3-check-readiness-with-zevm_lightsyncstatus), and [Checkpoint Selection Precedence](/reference/configuration/light-mode#checkpoint-selection-precedence). + +`lastCheckpoint` lifecycle: + +- `lastCheckpoint` is the most recently accepted checkpoint root in local light-sync state +- after successful startup checkpoint selection and validation, it equals the selected startup checkpoint and is non-null +- it updates whenever ZEVM accepts a newer checkpoint during sync progression +- it is not pinned to the configured checkpoint once sync has advanced +- format bridge: RPC checkpoint hashes are `0x`-prefixed `Hash32`, while persisted `checkpointDir/checkpoint` uses 64 hex characters without `0x` + +## Light-Mode Unsupported Surface + +In light mode, these supported trusted-mode method families are mode-gated and return `-32010`: + +- `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_simulateV1`, `testing_buildBlockV1` +- trusted-only read extensions such as `eth_feeHistory`, `eth_getProof`, and `eth_getStorageValues` +- transaction submission (`eth_sendTransaction`, `eth_sendRawTransaction`) +- mining, snapshots, mutation controls, impersonation controls +- canonical block/receipt/log queries and debug/raw inspection methods + +Out-of-contract note: + +- subscriptions and debug tracing methods are deferred/out of contract in ZEVM docs and are not transport-side `-32010` mappings + +Transport note: + +- ZEVM JSON-RPC is HTTP-only. WebSocket transport is unavailable and is not a `-32010` method error. + +## Example: `zevm_lightSyncStatus` + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "zevm_lightSyncStatus", + "params": [] +} +``` + +Response shape: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ready": true, + "status": "synced", + "network": "sepolia", + "checkpointSource": "persisted", + "lastCheckpoint": "0x...", + "optimisticSlot": "0x1234", + "safeSlot": "0x1232", + "finalizedSlot": "0x1230" + } +} +``` + +## Example: Not-ready Proof-backed Read + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "eth_getBalance", + "params": ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "latest"] +} +``` + +Error response: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "error": { + "code": -32011, + "message": "..." + } +} +``` + +## Related Pages + +- [Core Reads](/reference/json-rpc/core-reads) +- [JSON-RPC Overview](/reference/json-rpc/overview) +- [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred) diff --git a/site/src/pages/reference/node-api.mdx b/site/src/pages/reference/node-api.mdx new file mode 100644 index 0000000..155539a --- /dev/null +++ b/site/src/pages/reference/node-api.mdx @@ -0,0 +1,133 @@ +--- +title: Node.js API +description: The @evmts/zevm package - LightClient, native loading, and the utility subpath exports. +--- + +# Node.js API + +```bash +npm install @evmts/zevm@beta +``` + +The package is ESM-first (`"type": "module"`) and requires Node `>=22`. The root entry point is +ESM only; every utility subpath additionally ships a CommonJS build. + +## Native addon loading + +The root export loads a prebuilt N-API addon at import time. Resolution order, implemented in +`npm/zevm/src/index.ts`: + +1. `process.env.ZEVM_NATIVE_PATH`, if set — `require()`d directly. Use this to point at a locally + built `zig-out/npm/native/zevm.node`. +2. The optional platform package for the current `platform-arch` (on Linux, the libc flavour is + detected from `process.report.getReport().header.glibcVersionRuntime`; absent ⇒ `musl`). +3. `/native/zevm.node`, if present. + +If none resolve, import throws: + +```text +No ZEVM native addon found for . Supported prebuilds: darwin-arm64, darwin-x64, +linux-arm64-gnu, linux-arm64-musl, linux-x64-gnu, linux-x64-musl, win32-arm64-msvc, +win32-ia32-msvc, win32-x64-msvc +``` + +The platform packages are `optionalDependencies`, so an install on an unsupported platform +succeeds and only fails at import. See [Building From Source](/guides/building-from-source) for +producing your own addon. + +## Constants + +```ts +import { + ZEVM_NETWORK_MAINNET, // 0 + ZEVM_NETWORK_SEPOLIA, // 1 + ZEVM_NETWORK_HOLESKY, // 2 + ZEVM_STATUS_NOT_SYNCED, // 0 + ZEVM_STATUS_SYNCING, // 1 + ZEVM_STATUS_SYNCED, // 2 +} from "@evmts/zevm"; +``` + +`ZevmNetwork` and `ZevmStatus` are the corresponding union types. + +## Module functions + +```ts +import { abiVersion, version, errorMessage, networkName } from "@evmts/zevm"; + +abiVersion(); // number - C ABI version of the loaded library (currently 1) +version(); // string - ZEVM package version string +errorMessage(2); // string - human-readable name for a ZEVM_ERR_* code +networkName(0); // string | null - "mainnet" | "sepolia" | "holesky" | null +``` + +## `class LightClient` + +A handle onto the native light client. Every instance owns native resources; call `close()` when +you are finished. Calls on one instance are **not** internally synchronized — serialize them, or +use one instance per thread. + +```ts +new LightClient(network: ZevmNetwork, beaconRpcUrl: string, executionRpcUrl: string) +``` + +| Method | Returns | Description | +| --- | --- | --- | +| `syncStep()` | `number` | Advances consensus sync by one step; returns a `ZEVM_*` status/return code. Call in a loop until `status()` is `ZEVM_STATUS_SYNCED`. | +| `status()` | `ZevmStatus` | Current sync status. | +| `lastError()` | `string` | Last error message recorded on this handle. Valid until the next call on the handle. | +| `getBalance(address, blockNumber = 0)` | `string` | Proof-verified balance, as a decimal/hex string produced by the native layer. | +| `getTransactionCount(address, blockNumber = 0)` | `bigint` | Proof-verified nonce. | +| `getCode(address, blockNumber = 0)` | `Buffer` | Proof-verified account code. | +| `getStorage(address, slot, blockNumber = 0)` | `string` | Proof-verified storage value at `slot`. | +| `close()` | `void` | Shuts down the native handle. Idempotent. | + +`blockNumber` accepts `number | bigint`. Any read after `close()` throws +`Error: ZEVM light client is closed`. Reads before the client is synced surface as the +`ZEVM_ERR_NOT_SYNCED` condition rather than a stale answer. + +A complete runnable program is in +[Embedding The Light Client In Node.js](/guides/node-light-client). + +## Utility subpath exports + +These are pure TypeScript and do **not** touch the native addon — importing them on an +unsupported platform is fine. Each has both ESM and CJS builds. + +| Subpath | Contents | +| --- | --- | +| `@evmts/zevm/rlp` | Standalone RLP `encode` / `decode` (with a streaming overload), `RlpInput`, `RlpDecoded`. | +| `@evmts/zevm/util` | Bytes/hex/address/bigint helpers and the `PrefixedHexString`, `BytesLike`, `AddressLike` type family. | +| `@evmts/zevm/receipt` | `TxReceipt`, `StoredTxReceipt`, `Bloom`, `encodeReceipt`. | +| `@evmts/zevm/receipt-manager` | `MapDb` / `createMapDb` receipt-metadata storage. | +| `@evmts/zevm/txpool` | Transaction-pool types and implementation, including `ImpersonatedTx`. | +| `@evmts/zevm/statemanager` | Caching state-manager types (`CacheType`, `CachesStateManagerOpts`, …). | +| `@evmts/zevm/tx` | Re-exports `@ethereumjs/tx` plus `ImpersonatedTx`, `ImpersonatedTxData`, and ZEVM error classes. | +| `@evmts/zevm/evm` | Re-exports `@ethereumjs/evm`. | +| `@evmts/zevm/common` | Re-exports `@ethereumjs/common`. | +| `@evmts/zevm/trie` | Re-exports `@ethereumjs/trie`. | +| `@evmts/zevm/evm-error` | `EVMErrorMessage`, `EVMErrorType`, `EVMError`. | + +Example: + +```ts +import { encode, decode } from "@evmts/zevm/rlp"; + +const encoded = encode(["0x01", "0x02"]); +console.log(Buffer.from(encoded).toString("hex")); + +const decoded = decode(encoded); +console.log(decoded); +``` + +CommonJS works for the subpaths: + +```js +const { encode } = require("@evmts/zevm/rlp"); +``` + +## Talking to a running node instead + +The npm package embeds the *light client*. To drive a trusted dev node from Node.js, start the +`zevm` binary and speak JSON-RPC to it with any client (`viem`, `ethers`, plain `fetch`) — see +[Testing Contracts Against ZEVM](/guides/contract-testing). diff --git a/site/src/pages/reference/release-metadata-runbook.mdx b/site/src/pages/reference/release-metadata-runbook.mdx new file mode 100644 index 0000000..a4f7626 --- /dev/null +++ b/site/src/pages/reference/release-metadata-runbook.mdx @@ -0,0 +1,406 @@ +--- +title: Release Metadata Runbook +description: Reproducible operator workflow for release metadata selection, validation, provenance, and baked-default audits. +--- + +# Release Metadata Runbook + +Use this runbook to reproduce a ZEVM release/build boundary and audit light-mode baked defaults against published release metadata artifacts. + +Canonical release metadata location: [ZEVM release metadata](https://github.com/evmts/zevm/releases). +Canonical reproducibility boundary for this runbook: both release artifacts must be published for the selected `RELEASE_IDENTIFIER` (`release-tuple.json` and `light-default-checkpoints.json`). + +Publication-time validation gate for canonical claims: + +- before any canonical reproducibility claim, publication validation must pass for the selected `RELEASE_IDENTIFIER` +- publication validation requires exactly one published asset named `release-tuple.json` and exactly one published asset named `light-default-checkpoints.json` for that identifier +- zero matches or more than one match for either required filename fails the gate and marks the identifier metadata-invalid for canonical claims + +## Prerequisites + +- one artifact fetch tool: `gh` (recommended) or `curl` +- `jq` for schema checks and field extraction +- `shasum` for `sha256` provenance hashing +- `date` for UTC manifest timestamps + +## 1. Select A Release Identifier + +Select one GitHub release identifier and use it consistently for all metadata and checkouts. + +```bash +# List recent identifiers first. +gh release list --repo evmts/zevm --limit 20 + +# Set this to one real published identifier from the list. +RELEASE_IDENTIFIER='' +``` + +Before fetch/validation, preflight required assets for that identifier: + +```bash +ASSET_NAMES_JSON="$(gh api "repos/evmts/zevm/releases/tags/$RELEASE_IDENTIFIER" --jq '[.assets[].name]')" + +RELEASE_TUPLE_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "release-tuple.json")] | length')" +LIGHT_DEFAULTS_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "light-default-checkpoints.json")] | length')" + +test "$RELEASE_TUPLE_COUNT" -eq 1 +test "$LIGHT_DEFAULTS_COUNT" -eq 1 +``` + +If either `test` fails, do not use that identifier for canonical claims. +If you are using the `curl`-only path, choose `RELEASE_IDENTIFIER` from the GitHub releases page and run the `curl` duplicate-asset gate in step 2. + +Release identifier contract: + +- tag-based identifiers must match `^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$` +- commit-based identifiers must match `^commit-[0-9a-f]{40}$` +- for commit-based identifiers, the `40`-hex suffix must equal `zevmGitRevision` in the same release's `release-tuple.json` + +`RELEASE_IDENTIFIER` must exactly match the GitHub release entry that publishes both files. +Inside those files, `.releaseIdentifier` must exactly equal `RELEASE_IDENTIFIER`. +Do not mix tuple/checkpoint files from different release identifiers. +Run the checkout steps below from the parent workspace that contains the `zevm/` checkout. Voltaire and Guillotine Mini are materialized from `build.zig.zon` package URL pins. + +### Deterministic Publication And Supersession Policy + +Treat published release metadata as append-only by `releaseIdentifier`: + +- for one published `releaseIdentifier`, there is exactly one canonical artifact pair (`release-tuple.json` and `light-default-checkpoints.json`) for operator audit +- if a correction is required, publish a new `releaseIdentifier` with a complete replacement artifact pair (`release-tuple.json` and `light-default-checkpoints.json`) +- do not mutate or replace artifact files in place for an existing `releaseIdentifier` +- the correcting release entry must include one supersession note in the release notes body under `## ZEVM Supersession Note` using exactly: + +```text +schemaVersion: zevm-supersession-note.v1 +supersedesReleaseIdentifier: v0.6.1 +correctedArtifacts: both +reason: Corrected release-tuple and light-default-checkpoints metadata defects. +``` + +Supersession-note field constraints: + +- `schemaVersion` must be the literal `zevm-supersession-note.v1` +- `supersedesReleaseIdentifier` must name one valid previously published `releaseIdentifier` +- `correctedArtifacts` must be exactly one of `release-tuple.json`, `light-default-checkpoints.json`, or `both` +- `reason` must be non-empty single-line UTF-8 text describing the corrected defect + +## 2. Fetch `release-tuple.json` And `light-default-checkpoints.json` + +Use one operator workspace for fetched artifacts: + +```bash +ARTIFACT_DIR=.ops/release-metadata/"$RELEASE_IDENTIFIER" +mkdir -p "$ARTIFACT_DIR" +``` + +Fetch both required files from the selected release: + +```bash +gh release download "$RELEASE_IDENTIFIER" \ + --repo evmts/zevm \ + --pattern 'release-tuple.json' \ + --pattern 'light-default-checkpoints.json' \ + --dir "$ARTIFACT_DIR" +``` + +Before asserting canonical publication validity, validate required release-asset uniqueness (duplicate-asset gate): + +```bash +ASSET_NAMES_JSON="$(gh api "repos/evmts/zevm/releases/tags/$RELEASE_IDENTIFIER" --jq '[.assets[].name]')" + +RELEASE_TUPLE_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "release-tuple.json")] | length')" +LIGHT_DEFAULTS_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "light-default-checkpoints.json")] | length')" + +test "$RELEASE_TUPLE_COUNT" -eq 1 +test "$LIGHT_DEFAULTS_COUNT" -eq 1 +``` + +`test` failure means publication validation did not pass for canonical claims (`0` assets = missing; `>1` assets = duplicate filename publication). + +If `gh` is unavailable, use direct release-asset URLs: + +```bash +curl -fsSL -o "$ARTIFACT_DIR/release-tuple.json" \ + "https://github.com/evmts/zevm/releases/download/$RELEASE_IDENTIFIER/release-tuple.json" + +curl -fsSL -o "$ARTIFACT_DIR/light-default-checkpoints.json" \ + "https://github.com/evmts/zevm/releases/download/$RELEASE_IDENTIFIER/light-default-checkpoints.json" +``` + +`curl`-only publication-validation equivalent for duplicate-asset detection: + +```bash +ASSET_NAMES_JSON="$(curl -fsSL "https://api.github.com/repos/evmts/zevm/releases/tags/$RELEASE_IDENTIFIER" | jq '[.assets[].name]')" + +RELEASE_TUPLE_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "release-tuple.json")] | length')" +LIGHT_DEFAULTS_COUNT="$(printf '%s' "$ASSET_NAMES_JSON" | jq '[.[] | select(. == "light-default-checkpoints.json")] | length')" + +test "$RELEASE_TUPLE_COUNT" -eq 1 +test "$LIGHT_DEFAULTS_COUNT" -eq 1 +``` + +If either required artifact is unavailable for the selected identifier, stop this canonical runbook flow: + +1. either select a different `RELEASE_IDENTIFIER` that publishes both artifacts +2. or continue as an unpublished source build with internal provenance only (no canonical release-metadata reproducibility claim for that build boundary) + +## Publication-Validation Checklist For Canonical Claims + +Before asserting canonical release-metadata reproducibility for a selected `RELEASE_IDENTIFIER`, confirm: + +- publication-time validation gate passed: release asset listing shows exactly one `release-tuple.json` and one `light-default-checkpoints.json` for that identifier (no missing or duplicate required filenames) +- both required artifacts are published and fetched from that exact identifier: `release-tuple.json` and `light-default-checkpoints.json` +- both artifacts pass schema/version checks and `.releaseIdentifier` equality checks for that same identifier +- local checkouts/toolchain match tuple pins exactly (`zevmGitRevision`, `voltaireGitRevision`, `guillotineMiniGitRevision`, `zigVersion`) +- operator manifest records artifact paths and `sha256` hashes for both files +- runtime baked-default audit (when used) confirms `checkpointSource = "default"` and `lastCheckpoint == .defaults[NETWORK]` from the selected identifier's `light-default-checkpoints.json` + +If any item fails, do not make a canonical reproducibility claim for that build boundary. + +Metadata-invalid handling for canonical claims: + +- if required artifacts for a `RELEASE_IDENTIFIER` are missing, duplicate, unreadable, malformed, schema-mismatched, or value-mismatched, treat that identifier as metadata-invalid +- a metadata-invalid identifier cannot be used as canonical reproducibility evidence +- correction must be published as a new `releaseIdentifier` with a complete replacement artifact pair; do not repair artifacts in place for the invalid identifier + +## 3. Validate Metadata Files + +Validate `release-tuple.json` contract fields and values: + +```bash +jq -e --arg rid "$RELEASE_IDENTIFIER" ' + (type == "object") + and ((keys | sort) == [ + "guillotineMiniGitRevision", + "releaseIdentifier", + "schemaVersion", + "voltaireGitRevision", + "zevmGitRevision", + "zigVersion" + ]) + and (.schemaVersion == "zevm-release-tuple.v1") + and (.releaseIdentifier == $rid) + and (.zevmGitRevision | test("^[0-9a-fA-F]{40}$")) + and (.voltaireGitRevision | test("^[0-9a-fA-F]{40}$")) + and (.guillotineMiniGitRevision | test("^[0-9a-fA-F]{40}$")) + and (.zigVersion | type == "string" and length > 0) +' "$ARTIFACT_DIR/release-tuple.json" > /dev/null +``` + +Validate `light-default-checkpoints.json` contract fields and values: + +```bash +EXPECTED_MAINNET="0x$(sed -n 's/^pub const mainnet_hex = "\(.*\)";$/\1/p' src/light_default_checkpoints.zig)" +EXPECTED_SEPOLIA="0x$(sed -n 's/^pub const sepolia_hex = "\(.*\)";$/\1/p' src/light_default_checkpoints.zig)" +EXPECTED_HOLESKY="0x$(sed -n 's/^pub const holesky_hex = "\(.*\)";$/\1/p' src/light_default_checkpoints.zig)" + +jq -e \ + --arg rid "$RELEASE_IDENTIFIER" \ + --arg expected_mainnet "$EXPECTED_MAINNET" \ + --arg expected_sepolia "$EXPECTED_SEPOLIA" \ + --arg expected_holesky "$EXPECTED_HOLESKY" ' + (type == "object") + and ((keys | sort) == ["defaults", "releaseIdentifier", "schemaVersion"]) + and (.schemaVersion == "zevm-light-default-checkpoints.v1") + and (.releaseIdentifier == $rid) + and (.defaults | type == "object") + and ((.defaults | keys | sort) == ["holesky", "mainnet", "sepolia"]) + and (.defaults.mainnet | test("^0x[0-9a-fA-F]{64}$")) + and (.defaults.sepolia | test("^0x[0-9a-fA-F]{64}$")) + and (.defaults.holesky | test("^0x[0-9a-fA-F]{64}$")) + and (.defaults.mainnet == $expected_mainnet) + and (.defaults.sepolia == $expected_sepolia) + and (.defaults.holesky == $expected_holesky) +' "$ARTIFACT_DIR/light-default-checkpoints.json" > /dev/null +``` + +Quick schema reference for `light-default-checkpoints.json`: + +- `schemaVersion` (`string`): must be `zevm-light-default-checkpoints.v1` +- `releaseIdentifier` (`string`): must equal the selected `RELEASE_IDENTIFIER` +- `defaults` (`object`): required network map with exactly `mainnet`, `sepolia`, `holesky`; each value is a `0x`-prefixed 32-byte hex checkpoint (`^0x[0-9a-fA-F]{64}$`) + +Sample payload: + +```json +{ + "schemaVersion": "zevm-light-default-checkpoints.v1", + "releaseIdentifier": "vX.Y.Z", + "defaults": { + "mainnet": "0x9b41a80f58c52068a00e8535b8d6704769c7577a5fd506af5e0c018687991d55", + "sepolia": "0x4065c2509eaa15dbe60e1f80cff5205a532aa95aaa1d73c1c286f7f8535555d4", + "holesky": "0xe1f575f0b691404fe82cce68a09c2c98af197816de14ce53c0fe9f9bd02d2399" + } +} +``` + +The checkpoint hashes above are the baked defaults from `src/light_default_checkpoints.zig`; update this sample in the same change as runtime default checkpoint changes. + +Operator interpretation of `defaults` entries: + +- `defaults.mainnet`: release-specific baked default checkpoint for `mainnet`, used when checkpoint precedence falls to `default` +- `defaults.sepolia`: release-specific baked default checkpoint for `sepolia`, used when checkpoint precedence falls to `default` +- `defaults.holesky`: release-specific baked default checkpoint for `holesky`, used when checkpoint precedence falls to `default` + +## 4. Check Out Pinned Revisions And Zig Version + +Extract the pinned tuple: + +```bash +ZEVM_REVISION="$(jq -r '.zevmGitRevision' "$ARTIFACT_DIR/release-tuple.json")" +VOLTAIRE_REVISION="$(jq -r '.voltaireGitRevision' "$ARTIFACT_DIR/release-tuple.json")" +GUILLOTINE_MINI_REVISION="$(jq -r '.guillotineMiniGitRevision' "$ARTIFACT_DIR/release-tuple.json")" +PINNED_ZIG_VERSION="$(jq -r '.zigVersion' "$ARTIFACT_DIR/release-tuple.json")" +``` + +Materialize the ZEVM checkout and verify package pins: + +```bash +git -C zevm checkout "$ZEVM_REVISION" +``` + +Verify local state matches tuple pins: + +```bash +test "$(git -C zevm rev-parse HEAD)" = "$ZEVM_REVISION" +test "$(zig version)" = "$PINNED_ZIG_VERSION" +cd zevm +zig build --fetch +zig build dependency-preflight -- \ + --voltaire-revision "$VOLTAIRE_REVISION" \ + --guillotine-mini-revision "$GUILLOTINE_MINI_REVISION" \ + --zig-version "$PINNED_ZIG_VERSION" +``` + +Then run the release reproducibility gate from the materialized ZEVM checkout: + +```bash +zig build verify +zig build qualification-check -- --require-covered +bun tools/hive_rpc_compat_smoke.ts +``` + +If checkout, `zig version`, dependency preflight, build, qualification command, or Hive smoke fails, the tuple is not valid reproducibility evidence for canonical release claims. + +## 5. Record Provenance In An Operator Manifest + +Phase-1 reproducibility depends on preserved build provenance. +Record selected identifier, tuple pins, and metadata file hashes in an operator manifest: + +```bash +MANIFEST_PATH=.ops/manifests/zevm-release-manifest.json +mkdir -p "$(dirname "$MANIFEST_PATH")" + +RELEASE_TUPLE_SHA256="$(shasum -a 256 "$ARTIFACT_DIR/release-tuple.json" | awk '{print $1}')" +LIGHT_DEFAULTS_SHA256="$(shasum -a 256 "$ARTIFACT_DIR/light-default-checkpoints.json" | awk '{print $1}')" + +jq -n \ + --arg generatedAtUtc "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ + --arg releaseIdentifier "$RELEASE_IDENTIFIER" \ + --arg zevmGitRevision "$ZEVM_REVISION" \ + --arg voltaireGitRevision "$VOLTAIRE_REVISION" \ + --arg guillotineMiniGitRevision "$GUILLOTINE_MINI_REVISION" \ + --arg zigVersion "$PINNED_ZIG_VERSION" \ + --arg releaseTuplePath "$ARTIFACT_DIR/release-tuple.json" \ + --arg releaseTupleSha256 "$RELEASE_TUPLE_SHA256" \ + --arg lightDefaultsPath "$ARTIFACT_DIR/light-default-checkpoints.json" \ + --arg lightDefaultsSha256 "$LIGHT_DEFAULTS_SHA256" \ + '{ + schemaVersion: "zevm-operator-manifest.v1", + generatedAtUtc: $generatedAtUtc, + releaseIdentifier: $releaseIdentifier, + buildTuple: { + zevmGitRevision: $zevmGitRevision, + voltaireGitRevision: $voltaireGitRevision, + guillotineMiniGitRevision: $guillotineMiniGitRevision, + zigVersion: $zigVersion + }, + metadataArtifacts: { + releaseTuple: { path: $releaseTuplePath, sha256: $releaseTupleSha256 }, + lightDefaultCheckpoints: { path: $lightDefaultsPath, sha256: $lightDefaultsSha256 } + } + }' > "$MANIFEST_PATH" +``` + +## 6. Audit Baked Defaults Via `zevm_lightSyncStatus` + +Use runtime probing only as a verification step. +For selected network `NETWORK`, start light mode with no explicit or persisted checkpoint input: + +1. omit `--checkpoint` +2. keep `mode.light.checkpoint` unset +3. ensure `checkpointDir/checkpoint` is absent + +Then verify `checkpointSource = "default"` and compare `lastCheckpoint` with release metadata: + +```bash +NETWORK="${NETWORK:-mainnet}" +case "$NETWORK" in + mainnet|sepolia|holesky) ;; + *) + echo "NETWORK must be one of: mainnet|sepolia|holesky" >&2 + exit 1 + ;; +esac + +STATUS_JSON="$(curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"zevm_lightSyncStatus","params":[]}')" + +CHECKPOINT_SOURCE="$(printf '%s' "$STATUS_JSON" | jq -r '.result.checkpointSource')" +ACTUAL_CHECKPOINT="$(printf '%s' "$STATUS_JSON" | jq -r '.result.lastCheckpoint')" +EXPECTED_CHECKPOINT="$(jq -r --arg network "$NETWORK" '.defaults[$network] // empty' "$ARTIFACT_DIR/light-default-checkpoints.json")" + +test -n "$EXPECTED_CHECKPOINT" +test "$CHECKPOINT_SOURCE" = "default" +test "$ACTUAL_CHECKPOINT" = "$EXPECTED_CHECKPOINT" +``` + +## 7. Audit Restart/Resume Path With `checkpointSource = "persisted"` + +This audit verifies restart/resume semantics when startup source is operator-managed persisted input. + +Requirements: + +- do not pass `--checkpoint` +- keep `mode.light.checkpoint` unset or `null` +- provide `checkpointDir/checkpoint` with 64 hex chars (no `0x`) + +Prepare persisted checkpoint input from release defaults: + +```bash +NETWORK="${NETWORK:-sepolia}" +CHECKPOINT_DIR=".zevm/checkpoints/$NETWORK" +PERSISTED_CHECKPOINT_HEX="$(jq -r --arg network "$NETWORK" '.defaults[$network]' "$ARTIFACT_DIR/light-default-checkpoints.json" | sed 's/^0x//')" + +mkdir -p "$CHECKPOINT_DIR" +printf '%s\n' "$PERSISTED_CHECKPOINT_HEX" > "$CHECKPOINT_DIR/checkpoint" +printf '%s\n' "$PERSISTED_CHECKPOINT_HEX" | grep -Eq '^[0-9a-fA-F]{64}$' +``` + +Start ZEVM in light mode with that `checkpointDir`, then verify: + +```bash +STATUS_JSON="$(curl -s -X POST http://127.0.0.1:8545 \ + -H 'content-type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"zevm_lightSyncStatus","params":[]}')" + +test "$(printf '%s' "$STATUS_JSON" | jq -r '.result.checkpointSource')" = "persisted" +printf '%s' "$(printf '%s' "$STATUS_JSON" | jq -r '.result.lastCheckpoint')" | grep -Eq '^0x[0-9a-fA-F]{64}$' +``` + +Restart ZEVM with the same configuration and run the same status check again. +For the restart/resume audit to pass, each process start must report `checkpointSource = "persisted"` and a valid `Hash32` `lastCheckpoint`. + +## 8. Phase-1 Limitation: Release Identifier Is Not Runtime-Queryable + +Phase 1 has no runtime JSON-RPC or CLI contract to directly report the ZEVM `releaseIdentifier` from a running process. +Operators must rely on build provenance records (operator manifest, pinned revisions, and archived release metadata artifacts) to identify the release/build boundary. +If canonical release metadata artifacts were not published for the build, rely on internal provenance records only and treat that build boundary as non-canonical in this release-metadata workflow. + +## Related Pages + +- [Canonical Specs And Docs-First Process](/reference/specs-and-process) +- [Installation](/quickstart/installation) +- [Run Light Mode](/quickstart/run-light-mode) +- [Troubleshooting](/quickstart/troubleshooting) diff --git a/site/src/pages/reference/specs-and-process.mdx b/site/src/pages/reference/specs-and-process.mdx new file mode 100644 index 0000000..40f0a1f --- /dev/null +++ b/site/src/pages/reference/specs-and-process.mdx @@ -0,0 +1,112 @@ +--- +title: Canonical Specs And Docs-First Process +description: Docs-first update order, release metadata policy, and qualification intent. +--- + +# Canonical Specs And Docs-First Process + +Use this page for docs-first update order and process policy. +If you only need direct contract-source links, use [Canonical Specs](/reference/canonical-specs). + +## Canonical Contract Sources + +- product and startup/runtime contract: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) +- exact JSON-RPC tuples and errors: [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md) +- docs-first update process: [`docs/specs/docs-first-process.md`](https://github.com/evmts/zevm/blob/main/docs/specs/docs-first-process.md) + +If wording differs, `docs/specs/json-rpc-contract.md` is authoritative for API-level details. + +## Required Update Order + +For contract-affecting behavior changes: + +1. Update `docs/specs/prd.md` and `docs/specs/json-rpc-contract.md` first. +2. Update internal support docs under `docs/specs/internal/`. +3. Update public docs pages under `docs/`. + +## Deferred-Surface Promotion And Phase-1 Boundary And Graduation Criteria + +This section is the canonical public-doc criteria for: + +- promoting a deferred/out-of-contract surface into the ZEVM public contract +- changing phase-1 public boundary statements +- declaring phase-1 boundary graduation in this docs set + +Criteria: + +- deferred/out-of-contract status changes only through docs-first updates to canonical spec sources: [`docs/specs/prd.md`](https://github.com/evmts/zevm/blob/main/docs/specs/prd.md) and [`docs/specs/json-rpc-contract.md`](https://github.com/evmts/zevm/blob/main/docs/specs/json-rpc-contract.md) +- update order is mandatory: canonical spec sources first, then internal support docs, then public docs pages +- public pages that inventory deferred surfaces (for example [Unsupported And Deferred](/reference/json-rpc/unsupported-and-deferred)) are summaries and do not independently promote contract status +- phase-1 boundary or graduation claims are canonical only after matching updates land in the same docs-first path above +- when wording differs across public pages, canonical spec sources remain authoritative for runtime/RPC scope + +## Release Metadata Records + +Phase-1 release metadata is published per release identifier in [ZEVM release metadata](https://github.com/evmts/zevm/releases). +Each canonical record requires both files for one selected identifier: + +- `release-tuple.json` +- `light-default-checkpoints.json` + +Publication-time validation gate for canonical claims: + +- canonical claims are allowed only after publication validation passes for the selected `releaseIdentifier` +- publication validation requires exactly one published release asset named `release-tuple.json` and exactly one named `light-default-checkpoints.json` +- missing or duplicate required filenames fails the gate and marks that identifier metadata-invalid for canonical claims + +For canonical publication claims, both files must validate schema/version and `.releaseIdentifier` equality for the same selected identifier. +For end-to-end procedure (fetch, validation, pinned checkouts, manifest provenance, runtime baked-default audit), use [Release Metadata Runbook](/reference/release-metadata-runbook). + +### Metadata-Invalid `releaseIdentifier` Handling + +Treat a published identifier as metadata-invalid when publication validation fails (missing or duplicate required asset filenames) or when required release artifacts are unreadable, malformed, schema-mismatched, `releaseIdentifier`-mismatched, or value-mismatched against the contract. + +- metadata-invalid identifiers are outside canonical reproducibility claims +- metadata-invalid identifiers remain historical audit records only +- phase 1 does not require runtime JSON-RPC/CLI discovery, repair, or reporting of metadata-invalid artifacts; this remains operator provenance workflow + +### Append-Only Correction Policy + +Release metadata is append-only by `releaseIdentifier`: + +- do not mutate or replace artifact files in place for an existing identifier +- publish corrections under a new `releaseIdentifier` with a complete replacement artifact pair (`release-tuple.json` + `light-default-checkpoints.json`) +- keep superseded release assets unchanged for auditability + +Every correction release must include exactly one release-notes block with this exact template: + +```text +## ZEVM Supersession Note +schemaVersion: zevm-supersession-note.v1 +supersedesReleaseIdentifier: v0.6.1 +correctedArtifacts: release-tuple.json +reason: Fixed release-tuple.json zevmGitRevision value mismatch. +``` + +Field constraints: + +- `schemaVersion` must be the literal `zevm-supersession-note.v1` +- `supersedesReleaseIdentifier` must name one valid previously published `releaseIdentifier` +- `correctedArtifacts` must be exactly one of `release-tuple.json`, `light-default-checkpoints.json`, or `both` +- `reason` must be non-empty single-line UTF-8 text describing the corrected defect + +## Phase-1 Release Qualification Checklist + +Coverage intent for phase-1 qualification is explicit startup/configuration/runtime/transport/method coverage from docs, not ad hoc spot checks. +Before shipping, confirm all PRD criteria: + +- clean-checkout source build verification passes: `zig build --fetch`, `zig build`, and `zig build test` succeed on pinned package dependencies/toolchain without local patching +- CI runs the root release gates documented in [CI And Release Gates](/reference/ci-and-release-gates), including package dependency preflight, strict qualification coverage, generated-metadata smoke validation, dirty-worktree preflight, and scheduled/manual external verification +- default `zig build test` graph covers all shipped executable startup/configuration/runtime/transport/method/semantic behaviors from PRD sections `3.1` and `4` through `12` +- qualification evidence maps each shipped phase-1 surface in PRD sections `3.1`, `3.3`, `3.4`, and `4` through `12` to at least one qualification assertion +- for candidates claiming a published `releaseIdentifier`, qualification validates both required release artifacts and all PRD section `3.4` field/schema/value invariants +- qualification enforces the publication-time validation gate for canonical claims (exactly one required release asset filename per artifact; duplicates fail qualification) +- automated listener/socket smoke coverage validates startup/request flow for trusted mode and light-mode startup plus restart/resume from persisted checkpoint input +- transport/parsing verification asserts notification-only request and notification-only batch behavior returns HTTP `204` with empty body and uses one canonical ZEVM-owned transport/parser stack + +## Related Pages + +- [Installation](/quickstart/installation) +- [CI And Release Gates](/reference/ci-and-release-gates) +- [Release Metadata Runbook](/reference/release-metadata-runbook) +- [ZEVM](/index) diff --git a/site/vercel.json b/site/vercel.json new file mode 100644 index 0000000..6957e51 --- /dev/null +++ b/site/vercel.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": null, + "installCommand": "npm install", + "buildCommand": "npm run build", + "github": { "silent": true } +} diff --git a/site/vocs.config.ts b/site/vocs.config.ts new file mode 100644 index 0000000..12dba8a --- /dev/null +++ b/site/vocs.config.ts @@ -0,0 +1,114 @@ +import { defineConfig } from 'vocs/config' + +export default defineConfig({ + title: 'ZEVM', + description: + 'ZEVM is a Zig Ethereum client with a writable trusted dev node and a proof-backed light client, distributed as a binary, a C ABI, and a Node.js addon.', + baseUrl: 'https://zevm.tevm.sh', + rootDir: '.', + editLink: { + pattern: 'https://github.com/evmts/zevm/edit/main/site/src/pages/:path', + text: 'Edit on GitHub', + }, + socials: [ + { icon: 'github', link: 'https://github.com/evmts/zevm' }, + ], + topNav: [ + { text: 'Guides', link: '/quickstart/installation' }, + { text: 'Reference', link: '/reference/cli' }, + { text: 'Ecosystem', link: '/ecosystem' }, + { + text: 'npm', + link: 'https://www.npmjs.com/package/@evmts/zevm', + }, + ], + sidebar: [ + { text: 'Introduction', link: '/' }, + { + text: 'Getting Started', + collapsed: false, + items: [ + { text: 'Installation', link: '/quickstart/installation' }, + { text: 'Run Trusted Mode', link: '/quickstart/run-trusted-mode' }, + { text: 'Run Light Mode', link: '/quickstart/run-light-mode' }, + { text: 'Forked Dev Node', link: '/quickstart/forked-dev-node' }, + { text: 'Troubleshooting', link: '/quickstart/troubleshooting' }, + ], + }, + { + text: 'Concepts', + collapsed: false, + items: [ + { text: 'Runtime Modes', link: '/concepts/runtime-modes' }, + { text: 'Trusted Mode', link: '/concepts/trusted-mode' }, + { text: 'Light Mode', link: '/concepts/light-mode' }, + { text: 'State, Fork & Snapshots', link: '/concepts/state-fork-and-snapshots' }, + { text: 'Method Support By Mode', link: '/concepts/method-support-by-mode' }, + { + text: 'Architecture & Upstream Ownership', + link: '/concepts/architecture-and-upstream-ownership', + }, + ], + }, + { + text: 'Guides', + collapsed: false, + items: [ + { text: 'Testing Contracts Against ZEVM', link: '/guides/contract-testing' }, + { text: 'Embedding The Light Client In Node.js', link: '/guides/node-light-client' }, + { text: 'Embedding The C ABI', link: '/guides/embedding-c-abi' }, + { text: 'Building From Source', link: '/guides/building-from-source' }, + ], + }, + { + text: 'Reference', + collapsed: false, + items: [ + { text: 'CLI', link: '/reference/cli' }, + { text: 'Node.js API', link: '/reference/node-api' }, + { text: 'C ABI', link: '/reference/c-abi' }, + { + text: 'Configuration', + collapsed: true, + items: [ + { text: 'Overview', link: '/reference/configuration/overview' }, + { text: 'Trusted Mode', link: '/reference/configuration/trusted-mode' }, + { text: 'Light Mode', link: '/reference/configuration/light-mode' }, + ], + }, + { + text: 'JSON-RPC', + collapsed: true, + items: [ + { text: 'Overview', link: '/reference/json-rpc/overview' }, + { text: 'Core Reads', link: '/reference/json-rpc/core-reads' }, + { + text: 'Blocks, Receipts & Logs', + link: '/reference/json-rpc/blocks-receipts-and-logs', + }, + { + text: 'Transactions & Mining', + link: '/reference/json-rpc/transactions-and-mining', + }, + { text: 'Simulation', link: '/reference/json-rpc/simulation' }, + { text: 'Dev Controls', link: '/reference/json-rpc/dev-controls' }, + { text: 'Managed Dev Wallet', link: '/reference/json-rpc/managed-dev-wallet' }, + { + text: 'Verified Light-Mode Reads', + link: '/reference/json-rpc/verified-light-mode-reads', + }, + { + text: 'Unsupported & Deferred', + link: '/reference/json-rpc/unsupported-and-deferred', + }, + ], + }, + { text: 'Release Metadata Runbook', link: '/reference/release-metadata-runbook' }, + { text: 'CI & Release Gates', link: '/reference/ci-and-release-gates' }, + { text: 'Canonical Specs', link: '/reference/canonical-specs' }, + { text: 'Specs & Process', link: '/reference/specs-and-process' }, + ], + }, + { text: 'Ecosystem', link: '/ecosystem' }, + ], +}) diff --git a/src/c_bindings.zig b/src/c_bindings.zig index da1d4c6..344e7e6 100644 --- a/src/c_bindings.zig +++ b/src/c_bindings.zig @@ -21,7 +21,7 @@ const primitives = @import("primitives"); const consensus_sync = @import("consensus_sync.zig"); const light_proof = @import("light_proof.zig"); -const ZEVM_VERSION: [:0]const u8 = "0.0.0"; +const ZEVM_VERSION: [:0]const u8 = "0.1.0-beta.1"; const ZEVM_ABI_VERSION: u32 = 1; const ZEVM_OK: c_int = 0;