diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml index 2fffe73..cd03248 100644 --- a/.github/workflows/cd.yaml +++ b/.github/workflows/cd.yaml @@ -2,7 +2,7 @@ name: CD on: push: - branches: [ "main" ] + branches: ["main"] workflow_dispatch: concurrency: @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true permissions: - id-token: write # Required for NPM Trusted Publisher + id-token: write # Required for NPM Trusted Publisher contents: read jobs: @@ -37,13 +37,12 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: 'recursive' + submodules: "recursive" - uses: actions/setup-node@v4 with: - node-version: "23" + node-version: "24" registry-url: "https://registry.npmjs.org" - uses: pnpm/action-setup@v4 - run: pnpm install - run: pnpm build - - run: pnpm exec biome ci - - run: tsc + - run: pnpm check diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index de09a21..5b1646a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,15 +12,14 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: 'recursive' + submodules: "recursive" - uses: actions/setup-node@v4 with: - node-version: "23" + node-version: "24" - uses: pnpm/action-setup@v4 - run: pnpm install - run: pnpm build - - run: pnpm exec biome ci - - run: tsc + - run: pnpm check test: needs: check @@ -29,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: "23" + node-version: "24" - uses: pnpm/action-setup@v4 - run: pnpm install - run: pnpm vitest --coverage diff --git a/.gitignore b/.gitignore index 32cce62..b5ed486 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ dist docs dist/** node_modules/** +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..4e95979 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 120, + "experimentalSortImports": { + "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], + "internalPattern": ["@nillion/"], + "newlinesBetween": true + } +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..007de5e --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,27 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import", "unicorn", "vitest"], + "categories": { + "correctness": "warn" + }, + "rules": { + "no-nested-ternary": "error", + "no-unneeded-ternary": "error", + "no-unused-vars": "error", + "typescript/no-explicit-any": "error", + "typescript/explicit-function-return-type": "error", + "unicorn/prefer-node-protocol": "error", + "unicorn/filename-case": ["error", { "case": "kebabCase" }], + "import/no-cycle": "error" + }, + "overrides": [ + { + "files": ["tests/**/*.ts"], + "rules": { + "typescript/no-explicit-any": "off", + "typescript/no-non-null-assertion": "off", + "typescript/no-floating-promises": "off" + } + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f705a52..e3753e6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,12 +17,14 @@ This project is managed via [pnpm](https://pnpm.io/). To install dependencies ru The library uses [pino](https://github.com/pinojs/pino) for structured logging. You can control the log level to help debug issues: 1. **Node.js**: Set the `NILLION_LOG_LEVEL` environment variable + ```bash NILLION_LOG_LEVEL=debug pnpm test NILLION_LOG_LEVEL=trace node your-script.js ``` 2. **Browser**: Use the developer console to configure logging + ```javascript // Set log level via localStorage localStorage.setItem("NILLION_LOG_LEVEL", "debug"); @@ -32,12 +34,12 @@ The library uses [pino](https://github.com/pinojs/pino) for structured logging. ``` 3. **Available log levels** (from most to least verbose): - - `trace` - Extremely detailed debugging information - - `debug` - Detailed debugging information - - `info` - General informational messages - - `warn` - Warning messages - - `error` - Error messages only - - `silent` - Disable all logging + - `trace` - Extremely detailed debugging information + - `debug` - Detailed debugging information + - `info` - General informational messages + - `warn` - Warning messages + - `error` - Error messages only + - `silent` - Disable all logging ## Documentation @@ -49,7 +51,7 @@ The documentation can be generated automatically from the source files using [Ty All unit tests are executed and their coverage is measured when using [vitest](https://vitest.dev/): `pnpm test --coverage` -Style conventions are enforced using [Biome](https://biomejs.dev/): `biome check` +Style conventions are enforced using [oxlint](https://oxc.rs/docs/guide/usage/linter) and [oxfmt](https://oxc.rs/docs/guide/usage/formatter): `pnpm check` ## Versioning @@ -57,4 +59,4 @@ The version number format for this library and the changes to the library associ ## Publishing -This library can be published as a [package on npmjs](https://www.npmjs.com/package/@nillion/nuc) via the GitHub Actions workflow. \ No newline at end of file +This library can be published as a [package on npmjs](https://www.npmjs.com/package/@nillion/nuc) via the GitHub Actions workflow. diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 4013463..ca15c22 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -9,7 +9,7 @@ pnpm install @nillion/nuc ``` ```typescript -import { Builder, Codec, Signer, Validator } from '@nillion/nuc'; +import { Builder, Codec, Signer, Validator } from "@nillion/nuc"; ``` ## Core Concepts @@ -17,7 +17,7 @@ import { Builder, Codec, Signer, Validator } from '@nillion/nuc'; A Nuc (Nillion User Controlled) token is a type of capability-based authorisation token inspired by the UCAN specification. It grants specific permissions from a sender to a receiver. Three core claims define the actors in this relationship: | Claim | Role | Description | -|:----------|:------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------| +| :-------- | :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **`iss`** | **Issuer (Sender)** | The principal who created and signed the token. | | **`aud`** | **Audience (Receiver)** | The principal the token is addressed to. This is the only entity that can use (i.e., invoke or delegate) the token. | | **`sub`** | **Subject** | The principal the token is "about". It represents the identity whose authority is being granted. This value must stay the same throughout a delegation chain. | @@ -29,7 +29,7 @@ In a simple, two-party delegation, the `aud` and `sub` are often the same. When This example demonstrates the primary workflow of creating delegation and invocation tokens: ```typescript -import { Signer, Builder, Codec, Validator } from '@nillion/nuc'; +import { Signer, Builder, Codec, Validator } from "@nillion/nuc"; // Step 1: Create Signers for different parties // A root authority (e.g., for a server-side process with a private key) @@ -49,22 +49,23 @@ const serviceDidString = serviceDid.didString; // e.g., "did:key:zDnae..." // Step 3: Build a root delegation token // This grants capabilities from the root to the user const rootDelegation = await Builder.delegation() - .audience(userDid) // Who can use this delegation - .subject(userDid) // Who the delegation is about - .command("/nil/db/collections/read") // The authorized command namespace - .policy([ // Policy rules that must be satisfied + .audience(userDid) // Who can use this delegation + .subject(userDid) // Who the delegation is about + .command("/nil/db/collections/read") // The authorized command namespace + .policy([ + // Policy rules that must be satisfied ["==", ".command", "/nil/db/collections"], // Command must be an attenuation - ["!=", ".args.collection", "secrets"] + ["!=", ".args.collection", "secrets"], ]) - .expiresIn(3600 * 1000) // Expires in 1 hour + .expiresIn(3600 * 1000) // Expires in 1 hour .sign(rootSigner); // Step 4: Build an invocation token from the delegation // The user invokes their granted capability for the service const invocation = await Builder.invocationFrom(rootDelegation) - .audience(serviceDid) // The service that will process this - .command("/nil/db/collections/read") // The specific command being invoked - .arguments({ collection: "users" }) // Arguments for the command + .audience(serviceDid) // The service that will process this + .command("/nil/db/collections/read") // The specific command being invoked + .arguments({ collection: "users" }) // Arguments for the command .sign(userSigner); // Signed by the user // Step 5: Serialize for transmission @@ -81,13 +82,13 @@ try { params: { tokenRequirements: { type: "invocation", - audience: serviceDidString - } + audience: serviceDidString, + }, }, context: { // Additional context for policy evaluation - environment: "production" - } + environment: "production", + }, }); console.log("Token is valid!", decoded); } catch (error) { diff --git a/README.md b/README.md index 0c92f69..12cea72 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,4 @@ If you're unsure where to start, head over to [docs.nillion.com](https://docs.ni ## License -This project is licensed under the [MIT License](./LICENSE). \ No newline at end of file +This project is licensed under the [MIT License](./LICENSE). diff --git a/bin/check-version.ts b/bin/check-version.ts index 4c859b7..2dc120f 100644 --- a/bin/check-version.ts +++ b/bin/check-version.ts @@ -1,17 +1,16 @@ #!/usr/bin/env tsx import { appendFileSync } from "node:fs"; + import semver from "semver"; + import packageJson from "../package.json"; interface NpmRegistryResponse { "dist-tags": Record; } -async function getNpmVersion( - packageName: string, - distTag: string, -): Promise { +async function getNpmVersion(packageName: string, distTag: string): Promise { const response = await fetch(`https://registry.npmjs.org/${packageName}`); if (response.ok) { const data = (await response.json()) as NpmRegistryResponse; diff --git a/biome.jsonc b/biome.jsonc deleted file mode 100644 index dae81af..0000000 --- a/biome.jsonc +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.5/schema.json", - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true - }, - "files": { - "ignoreUnknown": true, - "includes": ["**", "!src/services/payer/gen"] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "formatWithErrors": true - }, - "assist": { "actions": { "source": { "organizeImports": "on" } } }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "correctness": { - "recommended": true, - "noUnusedImports": "error", - "noUnusedVariables": "error" - }, - "style": { - "noParameterAssign": "error", - "useAsConstAssertion": "error", - "useDefaultParameterLast": "error", - "useEnumInitializers": "error", - "useSelfClosingElements": "error", - "useConst": "error", - "useSingleVarDeclarator": "error", - "noUnusedTemplateLiteral": "error", - "useNumberNamespace": "error", - "noInferrableTypes": "error", - "noUselessElse": "error" - }, - "nursery": { - "noImportCycles": "error" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double", - "trailingCommas": "all" - } - }, - "overrides": [ - { - "includes": ["**/tests/**/*.ts"], - "linter": { - "rules": { - "style": { - "noNonNullAssertion": "off" - }, - "suspicious": { - "noExplicitAny": "off" - } - } - } - } - ] -} diff --git a/commitlint.config.ts b/commitlint.config.ts index e240600..7234c0e 100644 --- a/commitlint.config.ts +++ b/commitlint.config.ts @@ -3,11 +3,7 @@ import { RuleConfigSeverity, type UserConfig } from "@commitlint/types"; const config: UserConfig = { extends: ["@commitlint/config-conventional"], rules: { - "body-max-line-length": [ - RuleConfigSeverity.Disabled, - "always", - Number.POSITIVE_INFINITY, - ], + "body-max-line-length": [RuleConfigSeverity.Disabled, "always", Number.POSITIVE_INFINITY], }, }; diff --git a/lefthook.yml b/lefthook.yml index d553956..f2de925 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,8 +1,8 @@ pre-commit: commands: - biome-format: + oxfmt: glob: "*.{ts,json,jsonc}" - run: pnpm exec biome format --write --no-errors-on-unmatched --files-ignore-unknown=true --colors=off {staged_files} + run: pnpm exec oxfmt {staged_files} stage_fixed: true commit-msg: @@ -12,12 +12,7 @@ commit-msg: pre-push: commands: - biome-check: - glob: "*.{ts,json,jsonc}" - run: pnpm biome check --no-errors-on-unmatched --files-ignore-unknown=true --colors=off {push_files} - tsc-check: - glob: "*.{ts}" - run: pnpm exec tsc + check: + run: pnpm check test: - glob: "*.{ts}" - run: pnpm test \ No newline at end of file + run: pnpm test diff --git a/package.json b/package.json index a1c403f..cbcc940 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,15 @@ { "name": "@nillion/nuc", - "version": "2.0.0-rc.1", + "version": "2.0.0", "license": "MIT", "repository": "https://github.com/NillionNetwork/nuc-ts", - "engines": { - "node": ">=23" - }, + "files": [ + "CONTRIBUTING.md", + "dist", + "DOCUMENTATION.md", + "LICENSE", + "README.md" + ], "type": "module", "exports": { ".": { @@ -15,61 +19,61 @@ "./package.json": "./package.json" }, "scripts": { - "fix": "pnpm exec biome check --fix --unsafe && tsc --noEmit", - "fmt": "pnpm exec biome format --fix", + "check": "pnpm exec oxfmt --check && pnpm exec oxlint --type-aware && pnpm exec tsgo -b", + "fix": "pnpm exec oxfmt && pnpm exec oxlint --fix --type-aware && pnpm exec tsgo -b", + "fmt": "pnpm exec oxfmt", "install-hooks": "lefthook install", "test": "vitest --run", "build": "tsdown" }, - "peerDependencies": { - "pino": "^10.1.0" - }, "dependencies": { "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@scure/base": "^2.0.0", - "es-toolkit": "^1.42.0", - "multiformats": "^13.4.1", - "viem": "^2.41.2", - "zod": "^4.1.13" + "es-toolkit": "^1.43.0", + "multiformats": "^13.4.2", + "viem": "^2.44.1", + "zod": "^4.3.5" }, "devDependencies": { - "@biomejs/biome": "2.3.5", - "@commitlint/cli": "^20.2.0", - "@commitlint/config-conventional": "^20.2.0", - "@commitlint/types": "^20.2.0", + "@commitlint/cli": "^20.3.1", + "@commitlint/config-conventional": "^20.3.1", + "@commitlint/types": "^20.3.1", "@types/debug": "^4.1.12", - "@types/node": "^24.10.1", + "@types/node": "^25.0.7", "@types/semver": "^7.7.1", - "@vitest/coverage-v8": "^4.0.15", - "abitype": "^1.2.1", - "fast-check": "^4.3.0", - "lefthook": "^2.0.8", + "@typescript/native-preview": "7.0.0-dev.20260113.1", + "@vitest/coverage-v8": "^4.0.17", + "abitype": "^1.2.3", + "fast-check": "^4.5.3", + "lefthook": "^2.0.14", + "oxfmt": "^0.24.0", + "oxlint": "^1.39.0", + "oxlint-tsgolint": "^0.11.0", "semver": "^7.7.3", - "tsdown": "^0.16.8", + "tsdown": "0.20.0-beta.1", "tsx": "^4.21.0", - "type-fest": "^5.3.0", - "typedoc": "^0.28.15", + "type-fest": "^5.4.0", + "typedoc": "^0.28.16", "typescript": "^5.9.3", - "vite": "^7.2.6", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^4.0.15" + "vite": "^7.3.1", + "vite-tsconfig-paths": "^6.0.4", + "vitest": "^4.0.17" + }, + "peerDependencies": { + "pino": "^10.1.0" }, - "packageManager": "pnpm@10.22.0", - "files": [ - "dist", - "LICENSE", - "README.md", - "DOCUMENTATION.md", - "CONTRIBUTING.md" - ], "tsdown": { - "entry": "./src/lib.ts", - "format": "esm", - "clean": true, "alias": { "#": "./src", "#tests": "./tests" - } - } + }, + "clean": true, + "entry": "./src/lib.ts", + "format": "esm" + }, + "engines": { + "node": ">=24" + }, + "packageManager": "pnpm@10.28.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35835aa..00e34f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,93 +18,102 @@ importers: specifier: ^2.0.0 version: 2.0.0 es-toolkit: - specifier: ^1.42.0 - version: 1.42.0 + specifier: ^1.43.0 + version: 1.43.0 multiformats: - specifier: ^13.4.1 - version: 13.4.1 + specifier: ^13.4.2 + version: 13.4.2 pino: specifier: ^10.1.0 version: 10.1.0 viem: - specifier: ^2.41.2 - version: 2.41.2(typescript@5.9.3)(zod@4.1.13) + specifier: ^2.44.1 + version: 2.44.1(typescript@5.9.3)(zod@4.3.5) zod: - specifier: ^4.1.13 - version: 4.1.13 + specifier: ^4.3.5 + version: 4.3.5 devDependencies: - '@biomejs/biome': - specifier: 2.3.5 - version: 2.3.5 '@commitlint/cli': - specifier: ^20.2.0 - version: 20.2.0(@types/node@24.10.1)(typescript@5.9.3) + specifier: ^20.3.1 + version: 20.3.1(@types/node@25.0.7)(typescript@5.9.3) '@commitlint/config-conventional': - specifier: ^20.2.0 - version: 20.2.0 + specifier: ^20.3.1 + version: 20.3.1 '@commitlint/types': - specifier: ^20.2.0 - version: 20.2.0 + specifier: ^20.3.1 + version: 20.3.1 '@types/debug': specifier: ^4.1.12 version: 4.1.12 '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.7 + version: 25.0.7 '@types/semver': specifier: ^7.7.1 version: 7.7.1 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260113.1 + version: 7.0.0-dev.20260113.1 '@vitest/coverage-v8': - specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.10.1)(jiti@2.6.1)(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.0.17 + version: 4.0.17(vitest@4.0.17(@types/node@25.0.7)(jiti@2.6.1)(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) abitype: - specifier: ^1.2.1 - version: 1.2.1(typescript@5.9.3)(zod@4.1.13) + specifier: ^1.2.3 + version: 1.2.3(typescript@5.9.3)(zod@4.3.5) fast-check: - specifier: ^4.3.0 - version: 4.3.0 + specifier: ^4.5.3 + version: 4.5.3 lefthook: - specifier: ^2.0.8 - version: 2.0.8 + specifier: ^2.0.14 + version: 2.0.14 + oxfmt: + specifier: ^0.24.0 + version: 0.24.0 + oxlint: + specifier: ^1.39.0 + version: 1.39.0(oxlint-tsgolint@0.11.0) + oxlint-tsgolint: + specifier: ^0.11.0 + version: 0.11.0 semver: specifier: ^7.7.3 version: 7.7.3 tsdown: - specifier: ^0.16.8 - version: 0.16.8(typescript@5.9.3) + specifier: 0.20.0-beta.1 + version: 0.20.0-beta.1(@typescript/native-preview@7.0.0-dev.20260113.1)(typescript@5.9.3) tsx: specifier: ^4.21.0 version: 4.21.0 type-fest: - specifier: ^5.3.0 - version: 5.3.0 + specifier: ^5.4.0 + version: 5.4.0 typedoc: - specifier: ^0.28.15 - version: 0.28.15(typescript@5.9.3) + specifier: ^0.28.16 + version: 0.28.16(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.2.6 - version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-tsconfig-paths: - specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^6.0.4 + version: 6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@24.10.1)(jiti@2.6.1)(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@25.0.7)(jiti@2.6.1)(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages: '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': @@ -115,72 +124,19 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.3.5': - resolution: {integrity: sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@2.3.5': - resolution: {integrity: sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@2.3.5': - resolution: {integrity: sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@2.3.5': - resolution: {integrity: sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@2.3.5': - resolution: {integrity: sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@2.3.5': - resolution: {integrity: sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@2.3.5': - resolution: {integrity: sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@2.3.5': - resolution: {integrity: sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@2.3.5': - resolution: {integrity: sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -190,61 +146,61 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@commitlint/cli@20.2.0': - resolution: {integrity: sha512-l37HkrPZ2DZy26rKiTUvdq/LZtlMcxz+PeLv9dzK9NzoFGuJdOQyYU7IEkEQj0pO++uYue89wzOpZ0hcTtoqUA==} + '@commitlint/cli@20.3.1': + resolution: {integrity: sha512-NtInjSlyev/+SLPvx/ulz8hRE25Wf5S9dLNDcIwazq0JyB4/w1ROF/5nV0ObPTX8YpRaKYeKtXDYWqumBNHWsw==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@20.2.0': - resolution: {integrity: sha512-MsRac+yNIbTB4Q/psstKK4/ciVzACHicSwz+04Sxve+4DW+PiJeTjU0JnS4m/oOnulrXYN+yBPlKaBSGemRfgQ==} + '@commitlint/config-conventional@20.3.1': + resolution: {integrity: sha512-NCzwvxepstBZbmVXsvg49s+shCxlJDJPWxXqONVcAtJH9wWrOlkMQw/zyl+dJmt8lyVopt5mwQ3mR5M2N2rUWg==} engines: {node: '>=v18'} - '@commitlint/config-validator@20.2.0': - resolution: {integrity: sha512-SQCBGsL9MFk8utWNSthdxd9iOD1pIVZSHxGBwYIGfd67RTjxqzFOSAYeQVXOu3IxRC3YrTOH37ThnTLjUlyF2w==} + '@commitlint/config-validator@20.3.1': + resolution: {integrity: sha512-ErVLC/IsHhcvxCyh+FXo7jy12/nkQySjWXYgCoQbZLkFp4hysov8KS6CdxBB0cWjbZWjvNOKBMNoUVqkmGmahw==} engines: {node: '>=v18'} - '@commitlint/ensure@20.2.0': - resolution: {integrity: sha512-+8TgIGv89rOWyt3eC6lcR1H7hqChAKkpawytlq9P1i/HYugFRVqgoKJ8dhd89fMnlrQTLjA5E97/4sF09QwdoA==} + '@commitlint/ensure@20.3.1': + resolution: {integrity: sha512-h664FngOEd7bHAm0j8MEKq+qm2mH+V+hwJiIE2bWcw3pzJMlO0TPKtk0ATyRAtV6jQw+xviRYiIjjSjfajiB5w==} engines: {node: '>=v18'} '@commitlint/execute-rule@20.0.0': resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} engines: {node: '>=v18'} - '@commitlint/format@20.2.0': - resolution: {integrity: sha512-PhNoLNhxpfIBlW/i90uZ3yG3hwSSYx7n4d9Yc+2FAorAHS0D9btYRK4ZZXX+Gm3W5tDtu911ow/eWRfcRVgNWg==} + '@commitlint/format@20.3.1': + resolution: {integrity: sha512-jfsjGPFTd2Yti2YHwUH4SPRPbWKAJAwrfa3eNa9bXEdrXBb9mCwbIrgYX38LdEJK9zLJ3AsLBP4/FLEtxyu2AA==} engines: {node: '>=v18'} - '@commitlint/is-ignored@20.2.0': - resolution: {integrity: sha512-Lz0OGeZCo/QHUDLx5LmZc0EocwanneYJUM8z0bfWexArk62HKMLfLIodwXuKTO5y0s6ddXaTexrYHs7v96EOmw==} + '@commitlint/is-ignored@20.3.1': + resolution: {integrity: sha512-tWwAoh93QvAhxgp99CzCuHD86MgxE4NBtloKX+XxQxhfhSwHo7eloiar/yzx53YW9eqSLP95zgW2KDDk4/WX+A==} engines: {node: '>=v18'} - '@commitlint/lint@20.2.0': - resolution: {integrity: sha512-cQEEB+jlmyQbyiji/kmh8pUJSDeUmPiWq23kFV0EtW3eM+uAaMLMuoTMajbrtWYWQpPzOMDjYltQ8jxHeHgITg==} + '@commitlint/lint@20.3.1': + resolution: {integrity: sha512-LaOtrQ24+6SfUaWg8A+a+Wc77bvLbO5RIr6iy9F7CI3/0iq1uPEWgGRCwqWTuLGHkZDAcwaq0gZ01zpwZ1jCGw==} engines: {node: '>=v18'} - '@commitlint/load@20.2.0': - resolution: {integrity: sha512-iAK2GaBM8sPFTSwtagI67HrLKHIUxQc2BgpgNc/UMNme6LfmtHpIxQoN1TbP+X1iz58jq32HL1GbrFTCzcMi6g==} + '@commitlint/load@20.3.1': + resolution: {integrity: sha512-YDD9XA2XhgYgbjju8itZ/weIvOOobApDqwlPYCX5NLO/cPtw2UMO5Cmn44Ks8RQULUVI5fUT6roKvyxcoLbNmw==} engines: {node: '>=v18'} '@commitlint/message@20.0.0': resolution: {integrity: sha512-gLX4YmKnZqSwkmSB9OckQUrI5VyXEYiv3J5JKZRxIp8jOQsWjZgHSG/OgEfMQBK9ibdclEdAyIPYggwXoFGXjQ==} engines: {node: '>=v18'} - '@commitlint/parse@20.2.0': - resolution: {integrity: sha512-LXStagGU1ivh07X7sM+hnEr4BvzFYn1iBJ6DRg2QsIN8lBfSzyvkUcVCDwok9Ia4PWiEgei5HQjju6xfJ1YaSQ==} + '@commitlint/parse@20.3.1': + resolution: {integrity: sha512-TuUTdbLpyUNLgDzLDYlI2BeTE6V/COZbf3f8WwsV0K6eq/2nSpNTMw7wHtXb+YxeY9wwxBp/Ldad4P+YIxHJoA==} engines: {node: '>=v18'} - '@commitlint/read@20.2.0': - resolution: {integrity: sha512-+SjF9mxm5JCbe+8grOpXCXMMRzAnE0WWijhhtasdrpJoAFJYd5UgRTj/oCq5W3HJTwbvTOsijEJ0SUGImECD7Q==} + '@commitlint/read@20.3.1': + resolution: {integrity: sha512-nCmJAdIg3OdNVUpQW0Idk/eF/vfOo2W2xzmvRmNeptLrzFK7qhwwl/kIwy1Q1LZrKHUFNj7PGNpIT5INbgZWzA==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@20.2.0': - resolution: {integrity: sha512-KVoLDi9BEuqeq+G0wRABn4azLRiCC22/YHR2aCquwx6bzCHAIN8hMt3Nuf1VFxq/c8ai6s8qBxE8+ZD4HeFTlQ==} + '@commitlint/resolve-extends@20.3.1': + resolution: {integrity: sha512-iGTGeyaoDyHDEZNjD8rKeosjSNs8zYanmuowY4ful7kFI0dnY4b5QilVYaFQJ6IM27S57LAeH5sKSsOHy4bw5w==} engines: {node: '>=v18'} - '@commitlint/rules@20.2.0': - resolution: {integrity: sha512-27rHGpeAjnYl/A+qUUiYDa7Yn1WIjof/dFJjYW4gA1Ug+LUGa1P0AexzGZ5NBxTbAlmDgaxSZkLLxtLVqtg8PQ==} + '@commitlint/rules@20.3.1': + resolution: {integrity: sha512-/uic4P+4jVNpqQxz02+Y6vvIC0A2J899DBztA1j6q3f3MOKwydlNrojSh0dQmGDxxT1bXByiRtDhgFnOFnM6Pg==} engines: {node: '>=v18'} '@commitlint/to-lines@20.0.0': @@ -255,333 +211,177 @@ packages: resolution: {integrity: sha512-drXaPSP2EcopukrUXvUXmsQMu3Ey/FuJDc/5oiW4heoCfoE5BdLQyuc7veGeE3aoQaTVqZnh4D5WTWe2vefYKg==} engines: {node: '>=v18'} - '@commitlint/types@20.2.0': - resolution: {integrity: sha512-KTy0OqRDLR5y/zZMnizyx09z/rPlPC/zKhYgH8o/q6PuAjoQAKlRfY4zzv0M64yybQ//6//4H1n14pxaLZfUnA==} + '@commitlint/types@20.3.1': + resolution: {integrity: sha512-VmIFV/JkBRhDRRv7N5B7zEUkNZIx9Mp+8Pe65erz0rKycXLsi8Epcw0XJ+btSeRXgTzE7DyOyA9bkJ9mn/yqVQ==} engines: {node: '>=v18'} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.1': - resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.1': - resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.27.1': - resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.27.1': - resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.1': - resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.1': - resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.1': - resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.1': - resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.1': - resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.1': - resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.27.1': - resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.1': - resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.1': - resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.1': - resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.1': - resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.1': - resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.1': - resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.1': - resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.1': - resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.1': - resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.1': - resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.1': - resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.1': - resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.1': - resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.1': - resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.1': - resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@gerrit0/mini-shiki@3.19.0': - resolution: {integrity: sha512-ZSlWfLvr8Nl0T4iA3FF/8VH8HivYF82xQts2DY0tJxZd4wtXJ8AA0nmdW9lmO4hlrh3f9xNwEPtOgqETPqKwDA==} + '@gerrit0/mini-shiki@3.21.0': + resolution: {integrity: sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg==} '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} @@ -635,8 +435,8 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@1.1.0': - resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} @@ -667,295 +467,327 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@oxc-project/runtime@0.101.0': - resolution: {integrity: sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@oxc-project/types@0.101.0': - resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} - - '@oxc-project/types@0.99.0': - resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + '@oxc-project/types@0.107.0': + resolution: {integrity: sha512-QFDRbYfV2LVx8tyqtyiah3jQPUj1mK2+RYwxyFWyGoys6XJnwTdlzO6rdNNHOPorHAu5Uo34oWRKcvNpbJarmQ==} - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@oxfmt/darwin-arm64@0.24.0': + resolution: {integrity: sha512-aYXuGf/yq8nsyEcHindGhiz9I+GEqLkVq8CfPbd+6VE259CpPEH+CaGHEO1j6vIOmNr8KHRq+IAjeRO2uJpb8A==} + cpu: [arm64] + os: [darwin] - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@oxfmt/darwin-x64@0.24.0': + resolution: {integrity: sha512-vs3b8Bs53hbiNvcNeBilzE/+IhDTWKjSBB3v/ztr664nZk65j0xr+5IHMBNz3CFppmX7o/aBta2PxY+t+4KoPg==} + cpu: [x64] + os: [darwin] - '@rolldown/binding-android-arm64@1.0.0-beta.52': - resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxfmt/linux-arm64-gnu@0.24.0': + resolution: {integrity: sha512-ItPDOPoQ0wLj/s8osc5ch57uUcA1Wk8r0YdO8vLRpXA3UNg7KPOm1vdbkIZRRiSUphZcuX5ioOEetEK8H7RlTw==} cpu: [arm64] - os: [android] + os: [linux] - '@rolldown/binding-android-arm64@1.0.0-beta.53': - resolution: {integrity: sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxfmt/linux-arm64-musl@0.24.0': + resolution: {integrity: sha512-JkQO3WnQjQTJONx8nxdgVBfl6BBFfpp9bKhChYhWeakwJdr7QPOAWJ/v3FGZfr0TbqINwnNR74aVZayDDRyXEA==} cpu: [arm64] - os: [android] + os: [linux] - '@rolldown/binding-darwin-arm64@1.0.0-beta.52': - resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxfmt/linux-x64-gnu@0.24.0': + resolution: {integrity: sha512-N/SXlFO+2kak5gMt0oxApi0WXQDhwA0PShR0UbkY0PwtHjfSiDqJSOumyNqgQVoroKr1GNnoRmUqjZIz6DKIcw==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.24.0': + resolution: {integrity: sha512-WM0pek5YDCQf50XQ7GLCE9sMBCMPW/NPAEPH/Hx6Qyir37lEsP4rUmSECo/QFNTU6KBc9NnsviAyJruWPpCMXw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.24.0': + resolution: {integrity: sha512-vFCseli1KWtwdHrVlT/jWfZ8jP8oYpnPPEjI23mPLW8K/6GEJmmvy0PZP5NpWUFNTzX0lqie58XnrATJYAe9Xw==} cpu: [arm64] - os: [darwin] + os: [win32] - '@rolldown/binding-darwin-arm64@1.0.0-beta.53': - resolution: {integrity: sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxfmt/win32-x64@0.24.0': + resolution: {integrity: sha512-0tmlNzcyewAnauNeBCq0xmAkmiKzl+H09p0IdHy+QKrTQdtixtf+AOjDAADbRfihkS+heF15Pjc4IyJMdAAJjw==} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.11.0': + resolution: {integrity: sha512-F67T8dXgYIrgv6wpd52fKQFdmieSOHaxBkscgso64YdtEHrV3s52ASiZGNzw62TKihn9Ox9ek3PYx9XsxIJDUw==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.52': - resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxlint-tsgolint/darwin-x64@0.11.0': + resolution: {integrity: sha512-z44LO7+3z2mtcBxA9T66yEy/otp/2r5ypbkx7EYlPwbEqBAIDRt/8hqQ9/BUC//1qE549P1cBU6NjhgeyuXjYQ==} cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.53': - resolution: {integrity: sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxlint-tsgolint/linux-arm64@0.11.0': + resolution: {integrity: sha512-IeIjmpPi2j2Dn1CRizGikysyLp9B0q3jqiAalv9ewRyb8hqQW5YeMlsswo8pHd0Hz3KyFfone0NkvBt77Ex2pg==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.11.0': + resolution: {integrity: sha512-fpYGYU2pXjaXYnKgWrihFXE8zJiTRjYKSHAaBaVI056oqKjKGEoU2BfFbddpBrKgz9TmSOX/NGftrJnyMn1wXQ==} cpu: [x64] - os: [darwin] + os: [linux] - '@rolldown/binding-freebsd-x64@1.0.0-beta.52': - resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxlint-tsgolint/win32-arm64@0.11.0': + resolution: {integrity: sha512-37nzks9eqBt7NYE6okquu51vaqMruF5voX475L16Y8asJVCGpO/2VSy3ulYAXhZ+5Kdc8ZgrljVViJOjfPEPaA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.11.0': + resolution: {integrity: sha512-TsK4C61+mjmbkUJ3Q3E9Ev3VFbeI6prPEAm9FAOq8VsfUGEiIUBBjrZ8ysGoQXNiU3dCKpmu012ptVUZTk5/eg==} cpu: [x64] - os: [freebsd] + os: [win32] - '@rolldown/binding-freebsd-x64@1.0.0-beta.53': - resolution: {integrity: sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxlint/darwin-arm64@1.39.0': + resolution: {integrity: sha512-lT3hNhIa02xCujI6YGgjmYGg3Ht/X9ag5ipUVETaMpx5Rd4BbTNWUPif1WN1YZHxt3KLCIqaAe7zVhatv83HOQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.39.0': + resolution: {integrity: sha512-UT+rfTWd+Yr7iJeSLd/7nF8X4gTYssKh+n77hxl6Oilp3NnG1CKRHxZDy3o3lIBnwgzJkdyUAiYWO1bTMXQ1lA==} cpu: [x64] - os: [freebsd] + os: [darwin] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': - resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] + '@oxlint/linux-arm64-gnu@1.39.0': + resolution: {integrity: sha512-qocBkvS2V6rH0t9AT3DfQunMnj3xkM7srs5/Ycj2j5ZqMoaWd/FxHNVJDFP++35roKSvsRJoS0mtA8/77jqm6Q==} + cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': - resolution: {integrity: sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] + '@oxlint/linux-arm64-musl@1.39.0': + resolution: {integrity: sha512-arZzAc1PPcz9epvGBBCMHICeyQloKtHX3eoOe62B3Dskn7gf6Q14wnDHr1r9Vp4vtcBATNq6HlKV14smdlC/qA==} + cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': - resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + '@oxlint/linux-x64-gnu@1.39.0': + resolution: {integrity: sha512-ZVt5qsECpuNprdWxAPpDBwoixr1VTcZ4qAEQA2l/wmFyVPDYFD3oBY/SWACNnWBddMrswjTg9O8ALxYWoEpmXw==} + cpu: [x64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': - resolution: {integrity: sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + '@oxlint/linux-x64-musl@1.39.0': + resolution: {integrity: sha512-pB0hlGyKPbxr9NMIV783lD6cWL3MpaqnZRM9MWni4yBdHPTKyFNYdg5hGD0Bwg+UP4S2rOevq/+OO9x9Bi7E6g==} + cpu: [x64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': - resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} + '@oxlint/win32-arm64@1.39.0': + resolution: {integrity: sha512-Gg2SFaJohI9+tIQVKXlPw3FsPQFi/eCSWiCgwPtPn5uzQxHRTeQEZKuluz1fuzR5U70TXubb2liZi4Dgl8LJQA==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.39.0': + resolution: {integrity: sha512-sbi25lfj74hH+6qQtb7s1wEvd1j8OQbTaH8v3xTcDjrwm579Cyh0HBv1YSZ2+gsnVwfVDiCTL1D0JsNqYXszVA==} + cpu: [x64] + os: [win32] + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-6yLLgyswYwiCfls9+hoNFY9F8TQdwo15hpXDHzlAR0X/GojeKF+AuNcXjYNbOJ4zjl/5D6lliE8CbpB5t1OWIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [linux] + os: [android] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': - resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-hqGXRc162qCCIOAcHN2Cw4eXiVTwYsMFLOhAy1IG2CxY+dwc/l4Ga+dLPkLor3Ikqy5WDn+7kxHbbh6EmshEpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [linux] + os: [darwin] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': - resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} + '@rolldown/binding-darwin-x64@1.0.0-beta.59': + resolution: {integrity: sha512-ezvvGuhteE15JmMhJW0wS7BaXmhwLy1YHeEwievYaPC1PgGD86wgBKfOpHr9tSKllAXbCe0BeeMvasscWLhKdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [linux] + os: [darwin] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': - resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': + resolution: {integrity: sha512-4fhKVJiEYVd5n6no/mrL3LZ9kByfCGwmONOrdtvx8DJGDQhehH/q3RfhG3V/4jGKhpXgbDjpIjkkFdybCTcgew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': + resolution: {integrity: sha512-T3Y52sW6JAhvIqArBw+wtjNU1Ieaz4g0NBxyjSJoW971nZJBZygNlSYx78G4cwkCmo1dYTciTPDOnQygLV23pA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': - resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-NIW40jQDSQap2KDdmm9z3B/4OzWJ6trf8dwx3FD74kcQb3v34ThsBFTtzE5KjDuxnxgUlV+DkAu+XgSMKrgufw==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-CCKEk+H+8c0WGe/8n1E20n85Tq4Pv+HNAbjP1KfUXW+01aCWSMjU56ChNrM2tvHnXicfm7QRNoZyfY8cWh7jLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': - resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-VlfwJ/HCskPmQi8R0JuAFndySKVFX7yPhE658o27cjSDWWbXVtGkSbwaxstii7Q+3Rz87ZXN+HLnb1kd4R9Img==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': - resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-kuO92hTRyGy0Ts3Nsqll0rfO8eFsEJe9dGQGktkQnZ2hrJrDVN0y419dMgKy/gB2S2o7F2dpWhpfQOBehZPwVA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] + cpu: [x64] + os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': - resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-PXAebvNL4sYfCqi8LdY4qyFRacrRoiPZLo3NoUmiTxm7MPtYYR8CNtBGNokqDmMuZIQIecRaD/jbmFAIDz7DxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': - resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + resolution: {integrity: sha512-yJoklQg7XIZq8nAg0bbkEXcDK6sfpjxQGxpg2Nd6ERNtvg+eOaEBRgPww0BVTrYFQzje1pB5qPwC2VnJHT3koQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': - resolution: {integrity: sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': - resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-ljZ4+McmCbIuZwEBaoGtiG8Rq2nJjaXEnLEIx+usWetXn1ECjXY0LAhkELxOV6ytv4ensEmoJJ8nXg47hRMjlw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': - resolution: {integrity: sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': - resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': - resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': - resolution: {integrity: sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-bMY4tTIwbdZljW+xe/ln1hvs0SRitahQSXfWtvgAtIzgSX9Ar7KqJzU7lRm33YTRFIHLULRi53yNjw9nJGd6uQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.52': - resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} + '@rolldown/pluginutils@1.0.0-beta.59': + resolution: {integrity: sha512-aoh6LAJRyhtazs98ydgpNOYstxUlsOV1KJXcpf/0c0vFcUA8uyd/hwKRhqE/AAPNqAho9RliGsvitCoOzREoVA==} - '@rolldown/pluginutils@1.0.0-beta.53': - resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} cpu: [x64] os: [win32] @@ -971,23 +803,23 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - '@shikijs/engine-oniguruma@3.19.0': - resolution: {integrity: sha512-1hRxtYIJfJSZeM5ivbUXv9hcJP3PWRo5prG/V2sWwiubUKTa+7P62d2qxCW8jiVFX4pgRHhnHNp+qeR7Xl+6kg==} + '@shikijs/engine-oniguruma@3.21.0': + resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} - '@shikijs/langs@3.19.0': - resolution: {integrity: sha512-dBMFzzg1QiXqCVQ5ONc0z2ebyoi5BKz+MtfByLm0o5/nbUu3Iz8uaTCa5uzGiscQKm7lVShfZHU1+OG3t5hgwg==} + '@shikijs/langs@3.21.0': + resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} - '@shikijs/themes@3.19.0': - resolution: {integrity: sha512-H36qw+oh91Y0s6OlFfdSuQ0Ld+5CgB/VE6gNPK+Hk4VRbVG/XQgkjnt4KzfnnoO6tZPtKJKHPjwebOCfjd6F8A==} + '@shikijs/themes@3.21.0': + resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} - '@shikijs/types@3.19.0': - resolution: {integrity: sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==} + '@shikijs/types@3.21.0': + resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1016,8 +848,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.0.7': + resolution: {integrity: sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1031,20 +863,59 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@vitest/coverage-v8@4.0.15': - resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-uAT5+7Z1PDMKXBHa6snw2m34cmYoKEqN2H18+aNgC40n/NKplnvWEogF7IFbdQKngJx4dfxflKTZwr6426+ktw==} + cpu: [arm64] + os: [darwin] + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-pscoSdv6JkIJuCG5T6M7orIejZnuYO0a1kw2t69RFXJxuL3HcbX/kQ3S1xbw2+U7XPX4vwZk6OSS8xtuxlai5A==} + cpu: [x64] + os: [darwin] + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-K1j7z6M8WsGXmc9NjAFCKAsWX9yCYkN73XH/nhovz3kpSl8DfLhzwHgK/ZMUyju1CeCK7kjQWPVXARWgPplw9Q==} + cpu: [arm64] + os: [linux] + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-3RegnIYwOPhBjIDa26Lqm9FBzCLNDx2BgJvmd3VU5wKzHa1aucH4dFGKdbWFZvUEKro2rpjxB5r1p3iz2Y+ZnA==} + cpu: [arm] + os: [linux] + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-AOKLMSlP03NF6Xn3UI7fWpe7/mHLqh9tnP4kvTPbvOzJ3jIVkjDQNgwfKBDJ8aam8DY1dTsNKUOtkhtBfxVtNw==} + cpu: [x64] + os: [linux] + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-W8W3U9z0pXM02u/AnR0D1sKSdlquJ1pp6hf/uDd2WKvK2I/69aUwvh1gJ9YKTk/xZ5lInmV+AviDsgZjsMV1mg==} + cpu: [arm64] + os: [win32] + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-PCg9g8XTjRFMexs9qRvrpY6mnX6PQUKq3GSK/I/jncpuzhAZgAAj8cYRbCGdIq2pxwMFjBlmSgWOTwfweopnbg==} + cpu: [x64] + os: [win32] + + '@typescript/native-preview@7.0.0-dev.20260113.1': + resolution: {integrity: sha512-oz6EQSlmlGAcAEnwh1Tid0JOfJWHJNQNA2foBis1pAvXES+jsWRLuHPDu0wbzeVHLJm4qxSsejTCrMFYn2Yhbg==} + hasBin: true + + '@vitest/coverage-v8@4.0.17': + resolution: {integrity: sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==} peerDependencies: - '@vitest/browser': 4.0.15 - vitest: 4.0.15 + '@vitest/browser': 4.0.17 + vitest: 4.0.17 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.15': - resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + '@vitest/expect@4.0.17': + resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} - '@vitest/mocker@4.0.15': - resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + '@vitest/mocker@4.0.17': + resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1054,38 +925,27 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.15': - resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + '@vitest/pretty-format@4.0.17': + resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} - '@vitest/runner@4.0.15': - resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + '@vitest/runner@4.0.17': + resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} - '@vitest/snapshot@4.0.15': - resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + '@vitest/snapshot@4.0.17': + resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} - '@vitest/spy@4.0.15': - resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/spy@4.0.17': + resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} - '@vitest/utils@4.0.15': - resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@vitest/utils@4.0.17': + resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - abitype@1.1.0: - resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - abitype@1.2.1: - resolution: {integrity: sha512-AhkAWBE5QqzSuaPi6B9w5scl5739iBknQdFFAbY/CybASOBVWtVmPavUYW1OrDRX/iZWB/Je80xhJMZz2G4G1Q==} + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} peerDependencies: typescript: '>=5.0.4' zod: ^3.22.0 || ^4.0.0 @@ -1124,8 +984,8 @@ packages: resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} engines: {node: '>=20.19.0'} - ast-v8-to-istanbul@0.3.8: - resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + ast-v8-to-istanbul@0.3.10: + resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} @@ -1134,8 +994,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - birpc@3.0.0: - resolution: {integrity: sha512-by+04pHuxpCEQcucAXqzopqfhyI8TLK5Qg5MST0cB6MP+JhHna9ollrtK9moVh27aq6Q6MEJgebD0cVm//yBkg==} + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -1148,18 +1008,14 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@6.2.1: - resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -1225,9 +1081,8 @@ packages: supports-color: optional: true - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} - engines: {node: '>=0.3.1'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} @@ -1263,16 +1118,11 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-toolkit@1.42.0: - resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} + es-toolkit@1.43.0: + resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.1: - resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -1286,12 +1136,12 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - fast-check@4.3.0: - resolution: {integrity: sha512-JVw/DJSxVKl8uhCb7GrwanT9VWsCIdBkK3WpP37B/Au4pyaspriSjtrY2ApbSFwTg3ViPfniT13n75PhzE7VEQ==} + fast-check@4.5.3: + resolution: {integrity: sha512-IE9csY7lnhxBnA8g/WI5eg/hygA6MGWJMSNfFRrBlXUciADEhS1EDB0SIsMSvzubzIlOBbVITSsypCsW717poA==} engines: {node: '>=12.17.0'} fast-deep-equal@3.1.3: @@ -1348,8 +1198,8 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.0.1: + resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -1361,6 +1211,10 @@ packages: import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + import-without-cache@0.2.5: + resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + engines: {node: '>=20.19.0'} + ini@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1396,10 +1250,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -1433,58 +1283,58 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - lefthook-darwin-arm64@2.0.8: - resolution: {integrity: sha512-Nu52qmqhSP+DKKuKYKDkMkPbgvgTZv+ueEo1LVXidTcgxEwvrbe2balcdqdulQTsPfYtm3pCPvv8ikalHrH+Qg==} + lefthook-darwin-arm64@2.0.14: + resolution: {integrity: sha512-5pSYHM3oiI2dApZ/r+fUE6EEh3fJx5ggUnS3B/XoK7moM8T2gLJJqvSyU8kGP/KE0xZrQs37RQYm1UskO/zeNA==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@2.0.8: - resolution: {integrity: sha512-EGNBw1vuXzphs/KyDchkglwnYNkKQH3EpptIPXcQCRC3WKiz87PSrwkOxjGtgDg6nLYWru3YUzgcFrIGUXjWPw==} + lefthook-darwin-x64@2.0.14: + resolution: {integrity: sha512-Hp8DJ9rRfG3eluguHomUz8XU2bGM2wctjsWQYoQ1OTh6eWL6BMQjToumComEt1imJXjO8EVmME5gNjBUJNgjxw==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@2.0.8: - resolution: {integrity: sha512-ZPua6y7y7l/0PpMJhU1ZAt4jl0dC3F+EGlSzy9v0vqzyoixk0HRqsz9nxN7wmJo/5vHhHJBjsE5/sEYS9Z8tsQ==} + lefthook-freebsd-arm64@2.0.14: + resolution: {integrity: sha512-3dwB8e0Jedzgwq8q8pg7QjdLHIX46+fPJ33uH/DkFHayzh0wqaz8cU63VSwFWKo7uq5SJ8IJ8qvTjBpDqfdKTQ==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@2.0.8: - resolution: {integrity: sha512-ab9M5gCsMeYzOeBoHIOz+zyVSnEZowwV2jn3Am+x625ZNcqU0T3eNf+a7ppopvkQjrehfmO3y5HiMVAkSAs1Vw==} + lefthook-freebsd-x64@2.0.14: + resolution: {integrity: sha512-hL8DJzCYDRZH0oW1+QGXUtBPcsl1ZLxutiuuqBUHtFNt0M25QxSKAN7yAx77l1xEYVg+GgxUgOytYSr0Q7K9wQ==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@2.0.8: - resolution: {integrity: sha512-BaoUKmwnAbWssSwVHoA0HyJFX3m+Mp6xJhxD4YAu8H1mo8DNOWBG5J7DGXJRIiBTm6YjAXlerq8Pjfx4lycfYQ==} + lefthook-linux-arm64@2.0.14: + resolution: {integrity: sha512-VubfIiTNthTsjiDX/ZDROLtXyDFkN3REKQjLYu+VA6VJPHrNPVhRs30bc3975JTFT6bf20gKDSAIWqCokDrewQ==} cpu: [arm64] os: [linux] - lefthook-linux-x64@2.0.8: - resolution: {integrity: sha512-oNXcoGWsGy/U9gqE6PJpLtiNlGlAgoYtVmfc2gauNPRJehaQBaifD5/5aXPiWhRukUTQ1p9kuShFDpT2jOYn5Q==} + lefthook-linux-x64@2.0.14: + resolution: {integrity: sha512-osVNjNAxPTsJnZnX5ahHJJW1XvDYvYuMdddAQ+49mnXPfTyHPQQsPIGo90nHm7WmBi6oUwfOCZC5HPPzqEc2oA==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@2.0.8: - resolution: {integrity: sha512-pxUgnilqsnDEWF7J5uNViHJ+Q4gSEQbRbrcIEdluBzjW34E20WK4UPk0bxZDQZAeaXTubNQEvyafmfY7dWe4Gg==} + lefthook-openbsd-arm64@2.0.14: + resolution: {integrity: sha512-VikhZ+oo9pHWa7HGtYVti/aEUACll/t93Lh06UKeLp9ctUqILINs/pYB0NatUXT0Krc4g6u8w5LtzMtDS8qdlg==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@2.0.8: - resolution: {integrity: sha512-p50cpkWImLwU330JJuJaioNVT1X/Z56iqPOLEgBt2+1BlljmPe/eGrMArF4iIKfdZ4wFJ9f2h0gq+jyvQGFjSg==} + lefthook-openbsd-x64@2.0.14: + resolution: {integrity: sha512-TW3GUSYlbdmrwRJ61bduLJEyXrTTQzOeGszODlf4caRr2cu7jmml1/vSz2wLJ43Gokx/59FXeSIcysMKijIBhw==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@2.0.8: - resolution: {integrity: sha512-dStshOCvmg9sQSUmWNiLMLv52HFTVxC9JE2HGxCiHcK5oqVZS2v9cCZdFdiDZ1Xldi3ozLi2y7/Xpzul8Oqv5Q==} + lefthook-windows-arm64@2.0.14: + resolution: {integrity: sha512-TH04uiyvEIe6r1adfQUxQwFDtE7GRGfOcFsRZb7hwMc5OzixLw5a/HqT3qDmNbBlq8QYFpSH9R9VtjLjio/Odw==} cpu: [arm64] os: [win32] - lefthook-windows-x64@2.0.8: - resolution: {integrity: sha512-2YgT6feliy6CCDwbkT3pg1ylKD1b9lj+O5NdLsrxvZGRmO6ftXleWB4xfWKGGY8FrzAD2Y3eEVDv5n3NvGHDzw==} + lefthook-windows-x64@2.0.14: + resolution: {integrity: sha512-ucxZc+FJErQu9gS/+ldhEMTKbhA/Ez4F1dPIR06E14Jax7pqdls1IyRWPhRPlvsDh7dkmXrEuBm1iglWpR0/8w==} cpu: [x64] os: [win32] - lefthook@2.0.8: - resolution: {integrity: sha512-FozDCKeSI+m3BP0cvyPgHch+yf7ClS3hDy1JsRUrbNmlyjqBcmlygnRXsZzpH+wHoNnF2fmfhJhkx/7S7IpaVw==} + lefthook@2.0.14: + resolution: {integrity: sha512-JpNpQLXwJJlWNZB/4gDD8UW1pVdABZ6bYRbCShjYHoPq70xbcuZKVIKj177IxJ4R5Nz6xD33BJVdUb1N1NdO7g==} hasBin: true lines-and-columns@1.2.4: @@ -1568,8 +1418,8 @@ packages: typescript: optional: true - multiformats@13.4.1: - resolution: {integrity: sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==} + multiformats@13.4.2: + resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} @@ -1590,14 +1440,33 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - ox@0.9.6: - resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} + ox@0.11.3: + resolution: {integrity: sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true + oxfmt@0.24.0: + resolution: {integrity: sha512-UjeM3Peez8Tl7IJ9s5UwAoZSiDRMww7BEc21gDYxLq3S3/KqJnM3mjNxsoSHgmBvSeX6RBhoVc2MfC/+96RdSw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint-tsgolint@0.11.0: + resolution: {integrity: sha512-fGYb7z/cljC0Rjtbxh7mIe8vtF/M9TShLvniwc2rdcqNG3Z9g3nM01cr2kWRb1DZdbY4/kItvIsrV4uhaMifyQ==} + hasBin: true + + oxlint@1.39.0: + resolution: {integrity: sha512-wSiLr0wjG+KTU6c1LpVoQk7JZ7l8HCKlAkVDVTJKWmCGazsNxexxnOXl7dsar92mQcRnzko5g077ggP3RINSjA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.10.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1671,10 +1540,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} - real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -1701,15 +1566,15 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rolldown-plugin-dts@0.18.3: - resolution: {integrity: sha512-rd1LZ0Awwfyn89UndUF/HoFF4oH9a5j+2ZeuKSJYM80vmeN/p0gslYMnHTQHBEXPhUlvAlqGA3tVgXB/1qFNDg==} + rolldown-plugin-dts@0.21.0: + resolution: {integrity: sha512-t/KiDGti8cXD69phhBGWG4mjIlN1BX5auS8iNPrRvkCII6FKccjR+E0lmP5fCwuEvH3lJPaF5iu/CMGUn6nuoQ==} engines: {node: '>=20.19.0'} peerDependencies: '@ts-macro/tsc': ^0.3.6 '@typescript/native-preview': '>=7.0.0-dev.20250601.1' - rolldown: ^1.0.0-beta.51 + rolldown: ^1.0.0-beta.57 typescript: ^5.0.0 - vue-tsc: ~3.1.0 + vue-tsc: ~3.2.0 peerDependenciesMeta: '@ts-macro/tsc': optional: true @@ -1720,18 +1585,13 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.52: - resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - rolldown@1.0.0-beta.53: - resolution: {integrity: sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==} + rolldown@1.0.0-beta.59: + resolution: {integrity: sha512-Slm000Gd8/AO9z4Kxl4r8mp/iakrbAuJ1L+7ddpkNxgQ+Vf37WPvY63l3oeyZcfuPD1DRrUYBsRPIXSOhvOsmw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1812,6 +1672,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.0.0: + resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} @@ -1834,13 +1698,13 @@ packages: typescript: optional: true - tsdown@0.16.8: - resolution: {integrity: sha512-6ANw9mgU9kk7SvTBKvpDu/DVJeAFECiLUSeL5M7f5Nm5H97E7ybxmXT4PQ23FySYn32y6OzjoAH/lsWCbGzfLA==} + tsdown@0.20.0-beta.1: + resolution: {integrity: sha512-F/A0vGKG8/8XSKMxQtHCeRHpI2jlpKQLQ8sEDKh3XXWZjAXyz5pjHosJvsL5NEv+9ZtcQZEw0xEzPgfJSAWgdg==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@vitejs/devtools': ^0.0.0-alpha.18 + '@vitejs/devtools': '*' publint: ^0.3.0 typescript: ^5.0.0 unplugin-lightningcss: ^0.4.0 @@ -1871,12 +1735,12 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.3.0: - resolution: {integrity: sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==} + type-fest@5.4.0: + resolution: {integrity: sha512-wfkA6r0tBpVfGiyO+zbf9e10QkRQSlK9F2UvyfnjoCmrvH2bjHyhPzhugSBOuq1dog3P0+FKckqe+Xf6WKVjwg==} engines: {node: '>=20'} - typedoc@0.28.15: - resolution: {integrity: sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==} + typedoc@0.28.16: + resolution: {integrity: sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: @@ -1904,8 +1768,8 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - unrun@0.2.16: - resolution: {integrity: sha512-DBkjUpQv9AQs1464XWnWQ97RuxPCu+CImvQMPmqFeHoL2Bi6C1BGPacMuXVw4VMIfQewNJZWUxPt5envG90oUA==} + unrun@0.2.24: + resolution: {integrity: sha512-xa4/O5q2jmI6EqxweJ+sOy5cyORZWcsgmi8pmABVSUyg24Fh44qJrneUHavZEMsbJbghHYWKSraFy5hDCb/m4w==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -1917,24 +1781,24 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - viem@2.41.2: - resolution: {integrity: sha512-LYliajglBe1FU6+EH9mSWozp+gRA/QcHfxeD9Odf83AdH5fwUS7DroH4gHvlv6Sshqi1uXrYFA2B/EOczxd15g==} + viem@2.44.1: + resolution: {integrity: sha512-wfQda7PIJeF9hWiGKV628AfBwyYxyoc89OcgF4s4/chs2PY8ibUA7IG+DWdU4oAkjhHm9w47w1m2dwwOPBU+ng==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + vite-tsconfig-paths@6.0.4: + resolution: {integrity: sha512-iIsEJ+ek5KqRTK17pmxtgIxXtqr3qDdE6OxrP9mVeGhVDNXRJTKN/l9oMbujTQNzMLe6XZ8qmpztfbkPu2TiFQ==} peerDependencies: vite: '*' peerDependenciesMeta: vite: optional: true - vite@7.2.6: - resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1973,18 +1837,18 @@ packages: yaml: optional: true - vitest@4.0.15: - resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + vitest@4.0.17: + resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.15 - '@vitest/browser-preview': 4.0.15 - '@vitest/browser-webdriverio': 4.0.15 - '@vitest/ui': 4.0.15 + '@vitest/browser-playwright': 4.0.17 + '@vitest/browser-preview': 4.0.17 + '@vitest/browser-webdriverio': 4.0.17 + '@vitest/ui': 4.0.17 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2057,23 +1921,23 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - zod@4.1.13: - resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} snapshots: '@adraffy/ens-normalize@1.11.1': {} - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.28.5': + '@babel/generator@7.28.6': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -2082,52 +1946,17 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.5': + '@babel/parser@7.28.6': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 - '@babel/types@7.28.5': + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.3.5': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.5 - '@biomejs/cli-darwin-x64': 2.3.5 - '@biomejs/cli-linux-arm64': 2.3.5 - '@biomejs/cli-linux-arm64-musl': 2.3.5 - '@biomejs/cli-linux-x64': 2.3.5 - '@biomejs/cli-linux-x64-musl': 2.3.5 - '@biomejs/cli-win32-arm64': 2.3.5 - '@biomejs/cli-win32-x64': 2.3.5 - - '@biomejs/cli-darwin-arm64@2.3.5': - optional: true - - '@biomejs/cli-darwin-x64@2.3.5': - optional: true - - '@biomejs/cli-linux-arm64-musl@2.3.5': - optional: true - - '@biomejs/cli-linux-arm64@2.3.5': - optional: true - - '@biomejs/cli-linux-x64-musl@2.3.5': - optional: true - - '@biomejs/cli-linux-x64@2.3.5': - optional: true - - '@biomejs/cli-win32-arm64@2.3.5': - optional: true - - '@biomejs/cli-win32-x64@2.3.5': - optional: true - '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 @@ -2144,32 +1973,32 @@ snapshots: tough-cookie: 4.1.4 optional: true - '@commitlint/cli@20.2.0(@types/node@24.10.1)(typescript@5.9.3)': + '@commitlint/cli@20.3.1(@types/node@25.0.7)(typescript@5.9.3)': dependencies: - '@commitlint/format': 20.2.0 - '@commitlint/lint': 20.2.0 - '@commitlint/load': 20.2.0(@types/node@24.10.1)(typescript@5.9.3) - '@commitlint/read': 20.2.0 - '@commitlint/types': 20.2.0 + '@commitlint/format': 20.3.1 + '@commitlint/lint': 20.3.1 + '@commitlint/load': 20.3.1(@types/node@25.0.7)(typescript@5.9.3) + '@commitlint/read': 20.3.1 + '@commitlint/types': 20.3.1 tinyexec: 1.0.2 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@20.2.0': + '@commitlint/config-conventional@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@20.2.0': + '@commitlint/config-validator@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 ajv: 8.17.1 - '@commitlint/ensure@20.2.0': + '@commitlint/ensure@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -2178,32 +2007,32 @@ snapshots: '@commitlint/execute-rule@20.0.0': {} - '@commitlint/format@20.2.0': + '@commitlint/format@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 chalk: 5.6.2 - '@commitlint/is-ignored@20.2.0': + '@commitlint/is-ignored@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 semver: 7.7.3 - '@commitlint/lint@20.2.0': + '@commitlint/lint@20.3.1': dependencies: - '@commitlint/is-ignored': 20.2.0 - '@commitlint/parse': 20.2.0 - '@commitlint/rules': 20.2.0 - '@commitlint/types': 20.2.0 + '@commitlint/is-ignored': 20.3.1 + '@commitlint/parse': 20.3.1 + '@commitlint/rules': 20.3.1 + '@commitlint/types': 20.3.1 - '@commitlint/load@20.2.0(@types/node@24.10.1)(typescript@5.9.3)': + '@commitlint/load@20.3.1(@types/node@25.0.7)(typescript@5.9.3)': dependencies: - '@commitlint/config-validator': 20.2.0 + '@commitlint/config-validator': 20.3.1 '@commitlint/execute-rule': 20.0.0 - '@commitlint/resolve-extends': 20.2.0 - '@commitlint/types': 20.2.0 + '@commitlint/resolve-extends': 20.3.1 + '@commitlint/types': 20.3.1 chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@24.10.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.0.7)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2213,35 +2042,35 @@ snapshots: '@commitlint/message@20.0.0': {} - '@commitlint/parse@20.2.0': + '@commitlint/parse@20.3.1': dependencies: - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@20.2.0': + '@commitlint/read@20.3.1': dependencies: '@commitlint/top-level': 20.0.0 - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 1.0.2 - '@commitlint/resolve-extends@20.2.0': + '@commitlint/resolve-extends@20.3.1': dependencies: - '@commitlint/config-validator': 20.2.0 - '@commitlint/types': 20.2.0 + '@commitlint/config-validator': 20.3.1 + '@commitlint/types': 20.3.1 global-directory: 4.0.1 import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@20.2.0': + '@commitlint/rules@20.3.1': dependencies: - '@commitlint/ensure': 20.2.0 + '@commitlint/ensure': 20.3.1 '@commitlint/message': 20.0.0 '@commitlint/to-lines': 20.0.0 - '@commitlint/types': 20.2.0 + '@commitlint/types': 20.3.1 '@commitlint/to-lines@20.0.0': {} @@ -2249,18 +2078,18 @@ snapshots: dependencies: find-up: 7.0.0 - '@commitlint/types@20.2.0': + '@commitlint/types@20.3.1': dependencies: '@types/conventional-commits-parser': 5.0.2 chalk: 5.6.2 - '@emnapi/core@1.7.1': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -2270,201 +2099,123 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/aix-ppc64@0.27.1': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.27.1': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-arm@0.27.1': - optional: true - - '@esbuild/android-x64@0.25.12': + '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/android-x64@0.27.1': + '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/darwin-arm64@0.27.1': + '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-x64@0.27.1': + '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.27.1': + '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.27.1': + '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-arm64@0.27.1': + '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-arm@0.27.1': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-ia32@0.27.1': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/linux-loong64@0.27.1': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.27.1': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.27.1': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.27.1': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/linux-s390x@0.27.1': + '@esbuild/win32-x64@0.27.2': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/linux-x64@0.27.1': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.27.1': - optional: true - - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.27.1': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.27.1': - optional: true - - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.27.1': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': - optional: true - - '@esbuild/openharmony-arm64@0.27.1': - optional: true - - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.27.1': - optional: true - - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.27.1': - optional: true - - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.27.1': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - - '@esbuild/win32-x64@0.27.1': - optional: true - - '@gerrit0/mini-shiki@3.19.0': + '@gerrit0/mini-shiki@3.21.0': dependencies: - '@shikijs/engine-oniguruma': 3.19.0 - '@shikijs/langs': 3.19.0 - '@shikijs/themes': 3.19.0 - '@shikijs/types': 3.19.0 + '@shikijs/engine-oniguruma': 3.21.0 + '@shikijs/langs': 3.21.0 + '@shikijs/themes': 3.21.0 + '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 '@inquirer/ansi@1.0.2': optional: true - '@inquirer/confirm@5.1.21(@types/node@24.10.1)': + '@inquirer/confirm@5.1.21(@types/node@25.0.7)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.1) - '@inquirer/type': 3.0.10(@types/node@24.10.1) + '@inquirer/core': 10.3.2(@types/node@25.0.7) + '@inquirer/type': 3.0.10(@types/node@25.0.7) optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 optional: true - '@inquirer/core@10.3.2(@types/node@24.10.1)': + '@inquirer/core@10.3.2(@types/node@25.0.7)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.1) + '@inquirer/type': 3.0.10(@types/node@25.0.7) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 optional: true '@inquirer/figures@1.0.15': optional: true - '@inquirer/type@3.0.10(@types/node@24.10.1)': + '@inquirer/type@3.0.10(@types/node@25.0.7)': optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 optional: true '@jridgewell/gen-mapping@0.3.13': @@ -2491,10 +2242,10 @@ snapshots: strict-event-emitter: 0.5.1 optional: true - '@napi-rs/wasm-runtime@1.1.0': + '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -2524,171 +2275,196 @@ snapshots: '@open-draft/until@2.1.0': optional: true - '@oxc-project/runtime@0.101.0': {} + '@oxc-project/types@0.107.0': {} - '@oxc-project/types@0.101.0': {} + '@oxfmt/darwin-arm64@0.24.0': + optional: true - '@oxc-project/types@0.99.0': {} + '@oxfmt/darwin-x64@0.24.0': + optional: true - '@pinojs/redact@0.4.0': {} + '@oxfmt/linux-arm64-gnu@0.24.0': + optional: true - '@quansync/fs@1.0.0': - dependencies: - quansync: 1.0.0 + '@oxfmt/linux-arm64-musl@0.24.0': + optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.52': + '@oxfmt/linux-x64-gnu@0.24.0': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.53': + '@oxfmt/linux-x64-musl@0.24.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + '@oxfmt/win32-arm64@0.24.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + '@oxfmt/win32-x64@0.24.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.52': + '@oxlint-tsgolint/darwin-arm64@0.11.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.53': + '@oxlint-tsgolint/darwin-x64@0.11.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + '@oxlint-tsgolint/linux-arm64@0.11.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + '@oxlint-tsgolint/linux-x64@0.11.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + '@oxlint-tsgolint/win32-arm64@0.11.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + '@oxlint-tsgolint/win32-x64@0.11.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + '@oxlint/darwin-arm64@1.39.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + '@oxlint/darwin-x64@1.39.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + '@oxlint/linux-arm64-gnu@1.39.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + '@oxlint/linux-arm64-musl@1.39.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + '@oxlint/linux-x64-gnu@1.39.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + '@oxlint/linux-x64-musl@1.39.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + '@oxlint/win32-arm64@1.39.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + '@oxlint/win32-x64@1.39.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + '@pinojs/redact@0.4.0': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': - dependencies: - '@napi-rs/wasm-runtime': 1.1.0 + '@rolldown/binding-darwin-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': - dependencies: - '@napi-rs/wasm-runtime': 1.1.0 + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': optional: true - '@rolldown/pluginutils@1.0.0-beta.52': {} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.59': {} + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true - '@rolldown/pluginutils@1.0.0-beta.53': {} + '@rollup/rollup-android-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.55.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true '@scure/base@1.2.6': {} @@ -2706,27 +2482,27 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@shikijs/engine-oniguruma@3.19.0': + '@shikijs/engine-oniguruma@3.21.0': dependencies: - '@shikijs/types': 3.19.0 + '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.19.0': + '@shikijs/langs@3.21.0': dependencies: - '@shikijs/types': 3.19.0 + '@shikijs/types': 3.21.0 - '@shikijs/themes@3.19.0': + '@shikijs/themes@3.21.0': dependencies: - '@shikijs/types': 3.19.0 + '@shikijs/types': 3.21.0 - '@shikijs/types@3.19.0': + '@shikijs/types@3.21.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} '@tybys/wasm-util@0.10.1': dependencies: @@ -2740,7 +2516,7 @@ snapshots: '@types/conventional-commits-parser@5.0.2': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 '@types/cookie@0.6.0': optional: true @@ -2759,7 +2535,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@24.10.1': + '@types/node@25.0.7': dependencies: undici-types: 7.16.0 @@ -2773,61 +2549,89 @@ snapshots: '@types/unist@3.0.3': {} - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.10.1)(jiti@2.6.1)(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260113.1': + optional: true + + '@typescript/native-preview@7.0.0-dev.20260113.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260113.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260113.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260113.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260113.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260113.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260113.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260113.1 + + '@vitest/coverage-v8@4.0.17(vitest@4.0.17(@types/node@25.0.7)(jiti@2.6.1)(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.15 - ast-v8-to-istanbul: 0.3.8 + '@vitest/utils': 4.0.17 + ast-v8-to-istanbul: 0.3.10 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 magicast: 0.5.1 obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@24.10.1)(jiti@2.6.1)(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color + vitest: 4.0.17(@types/node@25.0.7)(jiti@2.6.1)(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - '@vitest/expect@4.0.15': + '@vitest/expect@4.0.17': dependencies: - '@standard-schema/spec': 1.0.0 + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 - chai: 6.2.1 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.7.3(@types/node@24.10.1)(typescript@5.9.3) - vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + msw: 2.7.3(@types/node@25.0.7)(typescript@5.9.3) + vite: 7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/pretty-format@4.0.15': + '@vitest/pretty-format@4.0.17': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.15': + '@vitest/runner@4.0.17': dependencies: - '@vitest/utils': 4.0.15 + '@vitest/utils': 4.0.17 pathe: 2.0.3 - '@vitest/snapshot@4.0.15': + '@vitest/snapshot@4.0.17': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.17 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.15': {} + '@vitest/spy@4.0.17': {} - '@vitest/utils@4.0.15': + '@vitest/utils@4.0.17': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.17 tinyrainbow: 3.0.3 JSONStream@1.3.5: @@ -2835,15 +2639,10 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 - abitype@1.1.0(typescript@5.9.3)(zod@4.1.13): - optionalDependencies: - typescript: 5.9.3 - zod: 4.1.13 - - abitype@1.2.1(typescript@5.9.3)(zod@4.1.13): + abitype@1.2.3(typescript@5.9.3)(zod@4.3.5): optionalDependencies: typescript: 5.9.3 - zod: 4.1.13 + zod: 4.3.5 ajv@8.17.1: dependencies: @@ -2868,10 +2667,10 @@ snapshots: ast-kit@2.2.0: dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.6 pathe: 2.0.3 - ast-v8-to-istanbul@0.3.8: + ast-v8-to-istanbul@0.3.10: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -2881,7 +2680,7 @@ snapshots: balanced-match@1.0.2: {} - birpc@3.0.0: {} + birpc@4.0.0: {} brace-expansion@2.0.2: dependencies: @@ -2891,14 +2690,10 @@ snapshots: callsites@3.1.0: {} - chai@6.2.1: {} + chai@6.2.2: {} chalk@5.6.2: {} - chokidar@5.0.0: - dependencies: - readdirp: 5.0.0 - cli-width@4.1.0: optional: true @@ -2937,9 +2732,9 @@ snapshots: cookie@0.7.2: optional: true - cosmiconfig-typescript-loader@6.2.0(@types/node@24.10.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@25.0.7)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 @@ -2959,7 +2754,7 @@ snapshots: dependencies: ms: 2.1.3 - diff@8.0.2: {} + defu@6.1.4: {} dot-prop@5.3.0: dependencies: @@ -2981,65 +2776,36 @@ snapshots: es-module-lexer@1.7.0: {} - es-toolkit@1.42.0: {} + es-toolkit@1.43.0: {} - esbuild@0.25.12: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - esbuild@0.27.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.1 - '@esbuild/android-arm': 0.27.1 - '@esbuild/android-arm64': 0.27.1 - '@esbuild/android-x64': 0.27.1 - '@esbuild/darwin-arm64': 0.27.1 - '@esbuild/darwin-x64': 0.27.1 - '@esbuild/freebsd-arm64': 0.27.1 - '@esbuild/freebsd-x64': 0.27.1 - '@esbuild/linux-arm': 0.27.1 - '@esbuild/linux-arm64': 0.27.1 - '@esbuild/linux-ia32': 0.27.1 - '@esbuild/linux-loong64': 0.27.1 - '@esbuild/linux-mips64el': 0.27.1 - '@esbuild/linux-ppc64': 0.27.1 - '@esbuild/linux-riscv64': 0.27.1 - '@esbuild/linux-s390x': 0.27.1 - '@esbuild/linux-x64': 0.27.1 - '@esbuild/netbsd-arm64': 0.27.1 - '@esbuild/netbsd-x64': 0.27.1 - '@esbuild/openbsd-arm64': 0.27.1 - '@esbuild/openbsd-x64': 0.27.1 - '@esbuild/openharmony-arm64': 0.27.1 - '@esbuild/sunos-x64': 0.27.1 - '@esbuild/win32-arm64': 0.27.1 - '@esbuild/win32-ia32': 0.27.1 - '@esbuild/win32-x64': 0.27.1 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} @@ -3049,9 +2815,9 @@ snapshots: eventemitter3@5.0.1: {} - expect-type@1.2.2: {} + expect-type@1.3.0: {} - fast-check@4.3.0: + fast-check@4.5.3: dependencies: pure-rand: 7.0.1 @@ -3098,7 +2864,7 @@ snapshots: headers-polyfill@4.0.3: optional: true - hookable@5.5.3: {} + hookable@6.0.1: {} html-escaper@2.0.2: {} @@ -3109,6 +2875,8 @@ snapshots: import-meta-resolve@4.2.0: {} + import-without-cache@0.2.5: {} + ini@4.1.1: {} is-arrayish@0.2.1: {} @@ -3136,14 +2904,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 @@ -3167,48 +2927,48 @@ snapshots: jsonparse@1.3.1: {} - lefthook-darwin-arm64@2.0.8: + lefthook-darwin-arm64@2.0.14: optional: true - lefthook-darwin-x64@2.0.8: + lefthook-darwin-x64@2.0.14: optional: true - lefthook-freebsd-arm64@2.0.8: + lefthook-freebsd-arm64@2.0.14: optional: true - lefthook-freebsd-x64@2.0.8: + lefthook-freebsd-x64@2.0.14: optional: true - lefthook-linux-arm64@2.0.8: + lefthook-linux-arm64@2.0.14: optional: true - lefthook-linux-x64@2.0.8: + lefthook-linux-x64@2.0.14: optional: true - lefthook-openbsd-arm64@2.0.8: + lefthook-openbsd-arm64@2.0.14: optional: true - lefthook-openbsd-x64@2.0.8: + lefthook-openbsd-x64@2.0.14: optional: true - lefthook-windows-arm64@2.0.8: + lefthook-windows-arm64@2.0.14: optional: true - lefthook-windows-x64@2.0.8: + lefthook-windows-x64@2.0.14: optional: true - lefthook@2.0.8: + lefthook@2.0.14: optionalDependencies: - lefthook-darwin-arm64: 2.0.8 - lefthook-darwin-x64: 2.0.8 - lefthook-freebsd-arm64: 2.0.8 - lefthook-freebsd-x64: 2.0.8 - lefthook-linux-arm64: 2.0.8 - lefthook-linux-x64: 2.0.8 - lefthook-openbsd-arm64: 2.0.8 - lefthook-openbsd-x64: 2.0.8 - lefthook-windows-arm64: 2.0.8 - lefthook-windows-x64: 2.0.8 + lefthook-darwin-arm64: 2.0.14 + lefthook-darwin-x64: 2.0.14 + lefthook-freebsd-arm64: 2.0.14 + lefthook-freebsd-x64: 2.0.14 + lefthook-linux-arm64: 2.0.14 + lefthook-linux-x64: 2.0.14 + lefthook-openbsd-arm64: 2.0.14 + lefthook-openbsd-x64: 2.0.14 + lefthook-windows-arm64: 2.0.14 + lefthook-windows-x64: 2.0.14 lines-and-columns@1.2.4: {} @@ -3246,8 +3006,8 @@ snapshots: magicast@0.5.1: dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 source-map-js: 1.2.1 make-dir@4.0.0: @@ -3275,12 +3035,12 @@ snapshots: ms@2.1.3: {} - msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3): + msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.21(@types/node@24.10.1) + '@inquirer/confirm': 5.1.21(@types/node@25.0.7) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -3301,7 +3061,7 @@ snapshots: - '@types/node' optional: true - multiformats@13.4.1: {} + multiformats@13.4.2: {} mute-stream@2.0.0: optional: true @@ -3315,7 +3075,7 @@ snapshots: outvariant@1.4.3: optional: true - ox@0.9.6(typescript@5.9.3)(zod@4.1.13): + ox@0.11.3(typescript@5.9.3)(zod@4.3.5): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -3323,13 +3083,47 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.1(typescript@5.9.3)(zod@4.1.13) + abitype: 1.2.3(typescript@5.9.3)(zod@4.3.5) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - zod + oxfmt@0.24.0: + dependencies: + tinypool: 2.0.0 + optionalDependencies: + '@oxfmt/darwin-arm64': 0.24.0 + '@oxfmt/darwin-x64': 0.24.0 + '@oxfmt/linux-arm64-gnu': 0.24.0 + '@oxfmt/linux-arm64-musl': 0.24.0 + '@oxfmt/linux-x64-gnu': 0.24.0 + '@oxfmt/linux-x64-musl': 0.24.0 + '@oxfmt/win32-arm64': 0.24.0 + '@oxfmt/win32-x64': 0.24.0 + + oxlint-tsgolint@0.11.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.11.0 + '@oxlint-tsgolint/darwin-x64': 0.11.0 + '@oxlint-tsgolint/linux-arm64': 0.11.0 + '@oxlint-tsgolint/linux-x64': 0.11.0 + '@oxlint-tsgolint/win32-arm64': 0.11.0 + '@oxlint-tsgolint/win32-x64': 0.11.0 + + oxlint@1.39.0(oxlint-tsgolint@0.11.0): + optionalDependencies: + '@oxlint/darwin-arm64': 1.39.0 + '@oxlint/darwin-x64': 1.39.0 + '@oxlint/linux-arm64-gnu': 1.39.0 + '@oxlint/linux-arm64-musl': 1.39.0 + '@oxlint/linux-x64-gnu': 1.39.0 + '@oxlint/linux-x64-musl': 1.39.0 + '@oxlint/win32-arm64': 1.39.0 + '@oxlint/win32-x64': 1.39.0 + oxlint-tsgolint: 0.11.0 + p-limit@4.0.0: dependencies: yocto-queue: 1.2.2 @@ -3344,7 +3138,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -3407,8 +3201,6 @@ snapshots: quick-format-unescaped@4.0.4: {} - readdirp@5.0.0: {} - real-require@0.2.0: {} require-directory@2.1.1: {} @@ -3424,88 +3216,71 @@ snapshots: resolve-pkg-maps@1.0.0: {} - rolldown-plugin-dts@0.18.3(rolldown@1.0.0-beta.52)(typescript@5.9.3): + rolldown-plugin-dts@0.21.0(@typescript/native-preview@7.0.0-dev.20260113.1)(rolldown@1.0.0-beta.59)(typescript@5.9.3): dependencies: - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 ast-kit: 2.2.0 - birpc: 3.0.0 + birpc: 4.0.0 dts-resolver: 2.1.3 get-tsconfig: 4.13.0 - magic-string: 0.30.21 obug: 2.1.1 - rolldown: 1.0.0-beta.52 + rolldown: 1.0.0-beta.59 optionalDependencies: + '@typescript/native-preview': 7.0.0-dev.20260113.1 typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-beta.52: + rolldown@1.0.0-beta.59: dependencies: - '@oxc-project/types': 0.99.0 - '@rolldown/pluginutils': 1.0.0-beta.52 + '@oxc-project/types': 0.107.0 + '@rolldown/pluginutils': 1.0.0-beta.59 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.52 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 - '@rolldown/binding-darwin-x64': 1.0.0-beta.52 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 - - rolldown@1.0.0-beta.53: - dependencies: - '@oxc-project/types': 0.101.0 - '@rolldown/pluginutils': 1.0.0-beta.53 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.53 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.53 - '@rolldown/binding-darwin-x64': 1.0.0-beta.53 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.53 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.53 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.53 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.53 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 - - rollup@4.53.3: + '@rolldown/binding-android-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-x64': 1.0.0-beta.59 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.59 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.59 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.59 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.59 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.59 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.59 + + rollup@4.55.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 safe-stable-stringify@2.5.0: {} @@ -3568,6 +3343,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@2.0.0: {} + tinyrainbow@3.0.3: {} tough-cookie@4.1.4: @@ -3584,23 +3361,24 @@ snapshots: optionalDependencies: typescript: 5.9.3 - tsdown@0.16.8(typescript@5.9.3): + tsdown@0.20.0-beta.1(@typescript/native-preview@7.0.0-dev.20260113.1)(typescript@5.9.3): dependencies: ansis: 4.2.0 cac: 6.7.14 - chokidar: 5.0.0 - diff: 8.0.2 + defu: 6.1.4 empathic: 2.0.0 - hookable: 5.5.3 + hookable: 6.0.1 + import-without-cache: 0.2.5 obug: 2.1.1 - rolldown: 1.0.0-beta.52 - rolldown-plugin-dts: 0.18.3(rolldown@1.0.0-beta.52)(typescript@5.9.3) + picomatch: 4.0.3 + rolldown: 1.0.0-beta.59 + rolldown-plugin-dts: 0.21.0(@typescript/native-preview@7.0.0-dev.20260113.1)(rolldown@1.0.0-beta.59)(typescript@5.9.3) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.4.2 - unrun: 0.2.16 + unrun: 0.2.24 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3615,7 +3393,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.1 + esbuild: 0.27.2 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -3623,13 +3401,13 @@ snapshots: type-fest@4.41.0: optional: true - type-fest@5.3.0: + type-fest@5.4.0: dependencies: tagged-tag: 1.0.0 - typedoc@0.28.15(typescript@5.9.3): + typedoc@0.28.16(typescript@5.9.3): dependencies: - '@gerrit0/mini-shiki': 3.19.0 + '@gerrit0/mini-shiki': 3.21.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -3652,10 +3430,9 @@ snapshots: universalify@0.2.0: optional: true - unrun@0.2.16: + unrun@0.2.24: dependencies: - '@oxc-project/runtime': 0.101.0 - rolldown: 1.0.0-beta.53 + rolldown: 1.0.0-beta.59 url-parse@1.5.10: dependencies: @@ -3663,15 +3440,15 @@ snapshots: requires-port: 1.0.0 optional: true - viem@2.41.2(typescript@5.9.3)(zod@4.1.13): + viem@2.44.1(typescript@5.9.3)(zod@4.3.5): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.3)(zod@4.1.13) + abitype: 1.2.3(typescript@5.9.3)(zod@4.3.5) isows: 1.0.7(ws@8.18.3) - ox: 0.9.6(typescript@5.9.3)(zod@4.1.13) + ox: 0.11.3(typescript@5.9.3)(zod@4.3.5) ws: 8.18.3 optionalDependencies: typescript: 5.9.3 @@ -3680,43 +3457,43 @@ snapshots: - utf-8-validate - zod - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.12 + esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 fsevents: 2.3.3 jiti: 2.6.1 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.15(@types/node@24.10.1)(jiti@2.6.1)(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.17(@types/node@25.0.7)(jiti@2.6.1)(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.7.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.7.3(@types/node@25.0.7)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -3726,10 +3503,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.7 transitivePeerDependencies: - jiti - less @@ -3784,4 +3561,4 @@ snapshots: yoctocolors-cjs@2.1.3: optional: true - zod@4.1.13: {} + zod@4.3.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c02fdab..82bc2e4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,3 @@ onlyBuiltDependencies: - - '@bufbuild/buf' + - "@bufbuild/buf" - msw diff --git a/src/core/did/did.ts b/src/core/did/did.ts index bc21938..e25bcdc 100644 --- a/src/core/did/did.ts +++ b/src/core/did/did.ts @@ -1,6 +1,7 @@ import { hexToBytes } from "@noble/hashes/utils.js"; import _ from "es-toolkit/compat"; import { z } from "zod"; + import * as ethr from "./ethr"; import * as key from "./key"; import * as nil from "./nil"; @@ -104,10 +105,7 @@ export namespace Did { * const legacyDid = Did.fromPublicKey(publicKey, "nil"); * ``` */ - export function fromPublicKey( - publicKey: string, - method: "key" | "nil" = "key", - ): Did { + export function fromPublicKey(publicKey: string, method: "key" | "nil" = "key"): Did { if (method === "nil") { console.warn( 'DEPRECATION WARNING: The "nil" Did method is deprecated and will be removed in a future version. Use the "key" method instead.', @@ -143,10 +141,7 @@ export namespace Did { * const did = Did.Schema.parse("did:key:zDnae..."); * ``` */ - export const Schema = z - .string() - .regex(DID_EXPRESSION, "invalid Did") - .transform(parse); + export const Schema = z.string().regex(DID_EXPRESSION, "invalid Did").transform(parse); } /** diff --git a/src/core/did/ethr.ts b/src/core/did/ethr.ts index 5986408..1d5ca06 100644 --- a/src/core/did/ethr.ts +++ b/src/core/did/ethr.ts @@ -1,7 +1,7 @@ +import type { DidEthr } from "#/core/did/types"; import { bytesToHex } from "@noble/hashes/utils.js"; import { getAddress } from "viem"; import { hashMessage, recoverAddress } from "viem/utils"; -import type { DidEthr } from "#/core/did/types"; /** * Creates a did:ethr Did from an Ethereum address. @@ -71,11 +71,7 @@ export function parse(didString: string): DidEthr { * @param signature The signature to validate * @returns True if the message was signed by the provided did. */ -export async function validateSignature( - did: DidEthr, - message: Uint8Array, - signature: Uint8Array, -): Promise { +export async function validateSignature(did: DidEthr, message: Uint8Array, signature: Uint8Array): Promise { const messageHash = hashMessage({ raw: message }); const recoveredAddress = await recoverAddress({ hash: messageHash, diff --git a/src/core/did/key.ts b/src/core/did/key.ts index 8a2a70b..e29eaf3 100644 --- a/src/core/did/key.ts +++ b/src/core/did/key.ts @@ -1,6 +1,6 @@ +import type { DidKey } from "#/core/did/types"; import { secp256k1 } from "@noble/curves/secp256k1.js"; import { base58btc } from "multiformats/bases/base58"; -import type { DidKey } from "#/core/did/types"; const SECP256K1_PREFIX = new Uint8Array([0xe7, 0x01]); const KEY_PREFIX = "did:key:"; @@ -33,9 +33,7 @@ export function parse(didString: string): DidKey { * @internal Used for testing */ export function fromPublicKeyBytes(publicKeyBytes: Uint8Array): string { - const prefixedKey = new Uint8Array( - SECP256K1_PREFIX.length + publicKeyBytes.length, - ); + const prefixedKey = new Uint8Array(SECP256K1_PREFIX.length + publicKeyBytes.length); prefixedKey.set(SECP256K1_PREFIX); prefixedKey.set(publicKeyBytes, SECP256K1_PREFIX.length); return `${KEY_PREFIX}${base58btc.encode(prefixedKey)}`; @@ -49,11 +47,7 @@ export function fromPublicKeyBytes(publicKeyBytes: Uint8Array): string { * @param signature The signature to validate * @returns True if the message was signed by the provided did. */ -export function validateSignature( - did: DidKey, - message: Uint8Array, - signature: Uint8Array, -): boolean { +export function validateSignature(did: DidKey, message: Uint8Array, signature: Uint8Array): boolean { return secp256k1.verify(signature, message, did.publicKeyBytes, { prehash: true, }); diff --git a/src/core/did/nil.ts b/src/core/did/nil.ts index 0fc8596..7ee8dd1 100644 --- a/src/core/did/nil.ts +++ b/src/core/did/nil.ts @@ -3,9 +3,9 @@ * @deprecated The "nil" Did method is deprecated and will be removed in a future version. Use the "key" method instead. */ +import type { DidNil } from "#/core/did/types"; import { secp256k1 } from "@noble/curves/secp256k1.js"; import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js"; -import type { DidNil } from "#/core/did/types"; const NIL_PREFIX = "did:nil:"; @@ -38,11 +38,7 @@ export function fromPublicKeyBytes(publicKeyBytes: Uint8Array): string { * @param signature The signature to validate * @returns True if the message was signed by the provided did. */ -export function validateSignature( - did: DidNil, - message: Uint8Array, - signature: Uint8Array, -): boolean { +export function validateSignature(did: DidNil, message: Uint8Array, signature: Uint8Array): boolean { return secp256k1.verify(signature, message, did.publicKeyBytes, { prehash: true, }); diff --git a/src/core/errors.ts b/src/core/errors.ts index ebc66b3..b2faf7d 100644 --- a/src/core/errors.ts +++ b/src/core/errors.ts @@ -4,8 +4,6 @@ export class InvalidContentType extends Error { public readonly response: globalThis.Response, public override readonly cause: Error, ) { - super( - `Invalid content type: status=${response.status} url=${response.url} cause=${cause.message}`, - ); + super(`Invalid content type: status=${response.status} url=${response.url} cause=${cause.message}`); } } diff --git a/src/core/logger.ts b/src/core/logger.ts index d1287dd..0982eb1 100644 --- a/src/core/logger.ts +++ b/src/core/logger.ts @@ -78,8 +78,7 @@ function isValidLogLevel(value: unknown): value is LogLevel { * @internal */ function getInitialLogLevel(): LogLevel { - const fromEnv = - typeof process !== "undefined" ? process.env[LOG_LEVEL_KEY] : undefined; + const fromEnv = typeof process !== "undefined" ? process.env[LOG_LEVEL_KEY] : undefined; if (isValidLogLevel(fromEnv)) { return fromEnv; } @@ -107,7 +106,7 @@ export const Log: pino.Logger = pino({ */ export function setLogLevel(level: LogLevel): void { if (!isValidLogLevel(level)) { - console.warn(`[Logger] Invalid log level: "${level}". Ignoring.`); + console.warn(`[Logger] Invalid log level: "${String(level)}". Ignoring.`); return; } Log.level = level; @@ -173,7 +172,7 @@ if (typeof globalThis !== "undefined") { const instances = new Set(); globalThis.__NILLION = { _instances: instances, - setLogLevel: (level: LogLevel) => { + setLogLevel: (level: LogLevel): void => { // Broadcast the command to all registered logger instances. for (const instance of instances) { instance.set(level); @@ -184,7 +183,7 @@ if (typeof globalThis !== "undefined") { const first = instances.values().next().value; return first ? first.get() : getInitialLogLevel(); }, - clearStoredLogLevel: () => { + clearStoredLogLevel: (): void => { // This is a global action, so only one instance needs to perform it. const first = instances.values().next().value; if (first) { diff --git a/src/core/signer.ts b/src/core/signer.ts index 06ebe4f..43564bf 100644 --- a/src/core/signer.ts +++ b/src/core/signer.ts @@ -1,3 +1,5 @@ +import { type NucHeader, NucHeaderSchema, NucHeaders } from "#/nuc/header"; +import { Payload } from "#/nuc/payload"; import { secp256k1 } from "@noble/curves/secp256k1.js"; import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js"; import { @@ -9,8 +11,7 @@ import { type WalletClient, } from "viem"; import { mainnet } from "viem/chains"; -import { type NucHeader, NucHeaderSchema, NucHeaders } from "#/nuc/header"; -import { Payload } from "#/nuc/payload"; + import { Did } from "./did/did"; import * as ethr from "./did/ethr"; import { base64UrlDecode } from "./encoding"; @@ -68,12 +69,8 @@ export namespace Signer { * @param didMethod The Did method to use. Defaults to "key". * @returns A new Signer instance. */ - export function fromPrivateKey( - privateKey: string | Uint8Array, - didMethod: "key" | "nil" = "key", - ): Signer { - const privateKeyBytes = - typeof privateKey === "string" ? hexToBytes(privateKey) : privateKey; + export function fromPrivateKey(privateKey: string | Uint8Array, didMethod: "key" | "nil" = "key"): Signer { + const privateKeyBytes = typeof privateKey === "string" ? hexToBytes(privateKey) : privateKey; const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes); const publicKeyHex = bytesToHex(publicKeyBytes); @@ -94,8 +91,7 @@ export namespace Signer { return { header: NucHeaders.v1, getDid: async () => Did.fromPublicKey(publicKeyHex, "key"), - sign: async (data) => - secp256k1.sign(data, privateKeyBytes, { prehash: true }) as Uint8Array, + sign: async (data) => secp256k1.sign(data, privateKeyBytes, { prehash: true }) as Uint8Array, }; } @@ -105,10 +101,7 @@ export namespace Signer { * @param options.chainId Optional chainId for the EIP-712 domain. Defaults to 1 (mainnet). * @returns A Signer instance that uses EIP-712 signing */ - export function fromWeb3( - signer: Eip712Signer, - options?: { chainId?: number }, - ): Signer { + export function fromWeb3(signer: Eip712Signer, options?: { chainId?: number }): Signer { const domain = { name: "NUC", version: "1", @@ -120,26 +113,16 @@ export namespace Signer { getDid: async () => ethr.fromAddress(await signer.getAddress()), sign: async (data: Uint8Array): Promise => { // The `data` is `rawHeader.rawPayload`. We must parse the header from it. - const [rawHeader, payloadString] = new TextDecoder() - .decode(data) - .split("."); + const [rawHeader, payloadString] = new TextDecoder().decode(data).split("."); if (!rawHeader || !payloadString) { - throw new SigningError( - "Invalid data format for EIP-712 signing", - "ES256K", - ); + throw new SigningError("Invalid data format for EIP-712 signing", "ES256K"); } - const header = NucHeaderSchema.parse( - JSON.parse(base64UrlDecode(rawHeader)), - ); + const header = NucHeaderSchema.parse(JSON.parse(base64UrlDecode(rawHeader))); const { meta } = header; if (!meta || !meta.domain || !meta.types || !meta.primaryType) { - throw new SigningError( - "EIP-712 metadata missing from header", - "ES256K", - ); + throw new SigningError("EIP-712 metadata missing from header", "ES256K"); } const decodedPayload = JSON.parse(base64UrlDecode(payloadString)); @@ -160,9 +143,7 @@ export namespace Signer { }); // Remove 0x prefix if present and convert to bytes - const hexString = signatureHex.startsWith("0x") - ? signatureHex.slice(2) - : signatureHex; + const hexString = signatureHex.startsWith("0x") ? signatureHex.slice(2) : signatureHex; return hexToBytes(hexString); }, }; @@ -189,14 +170,10 @@ export namespace Signer { transport: custom(provider), }); - const [account] = options?.account - ? [options.account] - : await client.requestAddresses(); + const [account] = options?.account ? [options.account] : await client.requestAddresses(); if (!account) { - throw new Error( - "Failed to get address from provider. User may have rejected the request.", - ); + throw new Error("Failed to get address from provider. User may have rejected the request."); } const eip712SignerAdapter: Eip712Signer = { @@ -243,9 +220,7 @@ type Eip712InvocationPayload = { * Converts a standard Nuc Payload into an EIP-712 compatible format. * @internal */ -export function toEip712Payload( - payload: Payload, -): Eip712DelegationPayload | Eip712InvocationPayload { +export function toEip712Payload(payload: Payload): Eip712DelegationPayload | Eip712InvocationPayload { const common = { iss: Did.serialize(payload.iss), aud: Did.serialize(payload.aud), diff --git a/src/lib.ts b/src/lib.ts index 269c53d..3f1cbee 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,43 +1,17 @@ export { Did } from "#/core/did/did"; -export type { - DidEthr, - DidKey, - DidNil, - Multicodec, -} from "#/core/did/types"; +export type { DidEthr, DidKey, DidNil, Multicodec } from "#/core/did/types"; export * as Errors from "#/core/errors"; export type { Eip712Signer } from "#/core/signer"; export { Signer } from "#/core/signer"; -export type { - DelegationBuilder, - InvocationBuilder, -} from "#/nuc/builder"; +export type { DelegationBuilder, InvocationBuilder } from "#/nuc/builder"; export { Builder } from "#/nuc/builder"; export { Codec } from "#/nuc/codec"; export type { Nuc } from "#/nuc/envelope"; export { Envelope } from "#/nuc/envelope"; export { NUC_EIP712_DOMAIN } from "#/nuc/header"; -export type { - Command, - DelegationPayload, - InvocationPayload, -} from "#/nuc/payload"; +export type { Command, DelegationPayload, InvocationPayload } from "#/nuc/payload"; export { Payload } from "#/nuc/payload"; -export type { - And, - AnyOf, - Connector, - Equals, - Not, - NotEquals, - Operator, - Or, - PolicyRule, -} from "#/nuc/policy"; +export type { And, AnyOf, Connector, Equals, Not, NotEquals, Operator, Or, PolicyRule } from "#/nuc/policy"; export { Policy } from "#/nuc/policy"; -export type { - TokenRequirement, - ValidationOptions, - ValidationParameters, -} from "#/validator/types"; +export type { TokenRequirement, ValidationOptions, ValidationParameters } from "#/validator/types"; export { Validator } from "#/validator/validator"; diff --git a/src/nuc/builder.ts b/src/nuc/builder.ts index eb5df3c..be210f6 100644 --- a/src/nuc/builder.ts +++ b/src/nuc/builder.ts @@ -1,5 +1,3 @@ -import { bytesToHex, randomBytes } from "@noble/hashes/utils.js"; -import type { TypedDataDomain } from "abitype"; import { DEFAULT_MAX_LIFETIME_MS, DEFAULT_NONCE_LENGTH } from "#/constants"; import type { Did } from "#/core/did/types"; import { base64UrlEncode } from "#/core/encoding"; @@ -9,6 +7,8 @@ import { Envelope, type Nuc } from "#/nuc/envelope"; import { getEip712Header, NucHeaderType } from "#/nuc/header"; import { type Command, type DelegationPayload, Payload } from "#/nuc/payload"; import type { Policy, PolicyRule } from "#/nuc/policy"; +import { bytesToHex, randomBytes } from "@noble/hashes/utils.js"; +import type { TypedDataDomain } from "abitype"; /** * `Nuc` token builder base class. @@ -170,9 +170,7 @@ abstract class AbstractBuilder { */ public maxLifetime(ms: number): this { if (ms > this._maxLifetimeMs) { - throw new Error( - `Custom max lifetime of ${ms}ms exceeds the allowed maximum of ${this._maxLifetimeMs}ms.`, - ); + throw new Error(`Custom max lifetime of ${ms}ms exceeds the allowed maximum of ${this._maxLifetimeMs}ms.`); } this._maxLifetimeMs = ms; return this; @@ -236,9 +234,7 @@ abstract class AbstractBuilder { public async sign(signer: Signer): Promise { // Validate expiration properties before signing. if (!this._expiresAt) { - throw new Error( - "Expiration is a required field. Use `expiresAt(timestamp)` or `expiresIn(duration)`.", - ); + throw new Error("Expiration is a required field. Use `expiresAt(timestamp)` or `expiresIn(duration)`."); } if (this._expiresAt <= Date.now()) { throw new Error("Expiration date must be in the future."); @@ -247,9 +243,7 @@ abstract class AbstractBuilder { if (this._expiresAt > maxExpiry) { const asConfigured = new Date(this._expiresAt).toISOString(); const maxAllowed = new Date(maxExpiry).toISOString(); - throw new Error( - `Expiration of ${asConfigured} exceeds the maximum lifetime. Max expiry is ${maxAllowed}.`, - ); + throw new Error(`Expiration of ${asConfigured} exceeds the maximum lifetime. Max expiry is ${maxAllowed}.`); } // The issuer is now authoritatively derived from the signer. @@ -260,23 +254,14 @@ abstract class AbstractBuilder { // Use the domain from the signer's header to preserve chainId. const header = signer.header.typ === NucHeaderType.EIP712 - ? getEip712Header( - payloadData, - signer.header.meta?.domain as TypedDataDomain | undefined, - ) + ? getEip712Header(payloadData, signer.header.meta?.domain as TypedDataDomain | undefined) : signer.header; - const rawHeader = base64UrlEncode( - new TextEncoder().encode(JSON.stringify(header)), - ); + const rawHeader = base64UrlEncode(new TextEncoder().encode(JSON.stringify(header))); - const rawPayload = base64UrlEncode( - new TextEncoder().encode(JSON.stringify(payloadData)), - ); + const rawPayload = base64UrlEncode(new TextEncoder().encode(JSON.stringify(payloadData))); - const messageToSign = new TextEncoder().encode( - `${rawHeader}.${rawPayload}`, - ); + const messageToSign = new TextEncoder().encode(`${rawHeader}.${rawPayload}`); const signature = await signer.sign(messageToSign); const nuc: Nuc = { @@ -393,9 +378,7 @@ export class DelegationBuilder extends AbstractBuilder { exp: this._expiresAt ? Math.floor(this._expiresAt / 1000) : undefined, meta: this._meta, nonce: this._nonce || bytesToHex(randomBytes(DEFAULT_NONCE_LENGTH)), - prf: this._proof - ? [bytesToHex(Envelope.computeHash(this._proof.nuc))] - : [], + prf: this._proof ? [bytesToHex(Envelope.computeHash(this._proof.nuc))] : [], }; } } @@ -478,9 +461,7 @@ export class InvocationBuilder extends AbstractBuilder { exp: this._expiresAt ? Math.floor(this._expiresAt / 1000) : undefined, meta: this._meta, nonce: this._nonce || bytesToHex(randomBytes(DEFAULT_NONCE_LENGTH)), - prf: this._proof - ? [bytesToHex(Envelope.computeHash(this._proof.nuc))] - : [], + prf: this._proof ? [bytesToHex(Envelope.computeHash(this._proof.nuc))] : [], }; } } @@ -585,9 +566,7 @@ export const Builder = { delegationFrom(proof: Envelope): DelegationBuilder { const proofPayload = proof.nuc.payload; if (!Payload.isDelegationPayload(proofPayload)) { - throw new Error( - "Cannot create a delegation from a proof that is not a delegation.", - ); + throw new Error("Cannot create a delegation from a proof that is not a delegation."); } const builder = new DelegationBuilder(); @@ -635,9 +614,7 @@ export const Builder = { invocationFrom(proof: Envelope): InvocationBuilder { const proofPayload = proof.nuc.payload; if (!Payload.isDelegationPayload(proofPayload)) { - throw new Error( - "Cannot invoke a capability from a proof that is not a delegation.", - ); + throw new Error("Cannot invoke a capability from a proof that is not a delegation."); } const builder = new InvocationBuilder(); diff --git a/src/nuc/codec.ts b/src/nuc/codec.ts index d9683f7..04c61f7 100644 --- a/src/nuc/codec.ts +++ b/src/nuc/codec.ts @@ -1,11 +1,8 @@ -import z from "zod"; -import { - base64UrlDecode, - base64UrlDecodeToBytes, - base64UrlEncode, -} from "#/core/encoding"; +import { base64UrlDecode, base64UrlDecodeToBytes, base64UrlEncode } from "#/core/encoding"; import { Log } from "#/core/logger"; import { Envelope, type Nuc } from "#/nuc/envelope"; +import z from "zod"; + import { NucHeaderSchema } from "./header"; const INVALID_NUC_STRUCTURE = "invalid Nuc structure"; @@ -15,7 +12,12 @@ const INVALID_NUC_HEADER = "invalid Nuc header"; * Parses a single Nuc token string (the `header.payload.signature` format) into a raw object. * @internal */ -function parseToken(tokenString: string) { +function parseToken(tokenString: string): { + rawHeader: string; + rawPayload: string; + signature: Uint8Array; + payload: unknown; +} { const parts = tokenString.split("."); if (parts.length !== 3) { throw new Error(INVALID_NUC_STRUCTURE); diff --git a/src/nuc/envelope.ts b/src/nuc/envelope.ts index 5866a37..f99c7bc 100644 --- a/src/nuc/envelope.ts +++ b/src/nuc/envelope.ts @@ -1,7 +1,7 @@ -import { sha256 } from "@noble/hashes/sha2.js"; -import { z } from "zod"; import { base64UrlEncode } from "#/core/encoding"; import { Payload } from "#/nuc/payload"; +import { sha256 } from "@noble/hashes/sha2.js"; +import { z } from "zod"; const NucSchema = z.object({ rawHeader: z.string(), diff --git a/src/nuc/header.ts b/src/nuc/header.ts index f78814a..71539c6 100644 --- a/src/nuc/header.ts +++ b/src/nuc/header.ts @@ -1,6 +1,6 @@ +import { Payload } from "#/nuc/payload"; import type { TypedDataDomain } from "abitype"; import { z } from "zod"; -import { Payload } from "#/nuc/payload"; /** * Nuc encoding types. @@ -42,22 +42,16 @@ export const NucHeaderSchema = z ), alg: z .enum([NucHeaderAlgorithm.Es256k]) - .describe( - '**Required.** The cryptographic algorithm used for the signature (e.g., "ES256K").', - ), + .describe('**Required.** The cryptographic algorithm used for the signature (e.g., "ES256K").'), ver: z .string() .regex(/^\d+\.\d+\.\d+$/, "Version must be in semver format") .optional() - .describe( - "**Optional.** The semantic version of the Nuc payload specification.", - ), + .describe("**Optional.** The semantic version of the Nuc payload specification."), meta: z .record(z.string(), z.unknown()) .optional() - .describe( - "**Optional.** A container for metadata required by specific `typ` values.", - ), + .describe("**Optional.** A container for metadata required by specific `typ` values."), }) .strict(); @@ -146,10 +140,7 @@ export const NucHeaders = { /** * Helper to get the correct EIP-712 header based on payload type. */ -export function getEip712Header( - payload: Payload, - domain: TypedDataDomain = NUC_EIP712_DOMAIN, -): NucHeader { +export function getEip712Header(payload: Payload, domain: TypedDataDomain = NUC_EIP712_DOMAIN): NucHeader { if (Payload.isDelegationPayload(payload)) { return NucHeaders.v1_eip712_delegation(domain); } diff --git a/src/nuc/payload.ts b/src/nuc/payload.ts index 1540a8c..b1f01b4 100644 --- a/src/nuc/payload.ts +++ b/src/nuc/payload.ts @@ -1,8 +1,8 @@ +import { Did } from "#/core/did/did"; +import { Policy } from "#/nuc/policy"; import { hexToBytes } from "@noble/hashes/utils.js"; import _ from "es-toolkit/compat"; import { z } from "zod"; -import { Did } from "#/core/did/did"; -import { Policy } from "#/nuc/policy"; export const CommandSchema = z.string().startsWith("/"); export type Command = z.infer; @@ -155,10 +155,7 @@ export namespace Payload { * Payload.isCommandAttenuationOf("/nil/db/data", "/nil/db/write"); // false * ``` */ - export function isCommandAttenuationOf( - command: Command, - parent: Command, - ): boolean { + export function isCommandAttenuationOf(command: Command, parent: Command): boolean { const commandSegments = command.slice(1).split("/").filter(Boolean); const parentSegments = parent.slice(1).split("/").filter(Boolean); @@ -199,9 +196,7 @@ export namespace Payload { * } * ``` */ - export function isInvocationPayload( - payload: Payload, - ): payload is InvocationPayload { + export function isInvocationPayload(payload: Payload): payload is InvocationPayload { return (payload as InvocationPayload).args !== undefined; } @@ -220,14 +215,7 @@ export namespace Payload { * } * ``` */ - export function isDelegationPayload( - value: unknown, - ): value is DelegationPayload { - return ( - value !== null && - value !== undefined && - typeof value === "object" && - "pol" in value - ); + export function isDelegationPayload(value: unknown): value is DelegationPayload { + return value !== null && value !== undefined && typeof value === "object" && "pol" in value; } } diff --git a/src/nuc/policy.ts b/src/nuc/policy.ts index 17c3ac6..3d93876 100644 --- a/src/nuc/policy.ts +++ b/src/nuc/policy.ts @@ -1,7 +1,7 @@ -import _ from "es-toolkit/compat"; -import { z } from "zod"; import { Log } from "#/core/logger"; import { applySelector, type Selector } from "#/nuc/selector"; +import _ from "es-toolkit/compat"; +import { z } from "zod"; /** * Simple type aliases for operators @@ -267,10 +267,7 @@ export namespace Policy { // For a policy (array of rules with implicit AND), analyze as if it were an AND connector if (policy.length === 1) { const result = analyzeRule(policy[0]); - Log.info( - { maxDepth: result.depth, maxWidth: result.width }, - "Policy tree analysis complete", - ); + Log.info({ maxDepth: result.depth, maxWidth: result.width }, "Policy tree analysis complete"); return { maxDepth: result.depth, maxWidth: result.width, @@ -283,10 +280,7 @@ export namespace Policy { maxWidth: Math.max(policy.length, ...results.map((r) => r.width)), }; - Log.info( - { maxDepth: result.maxDepth, maxWidth: result.maxWidth }, - "Policy tree analysis complete", - ); + Log.info({ maxDepth: result.maxDepth, maxWidth: result.maxWidth }, "Policy tree analysis complete"); return result; } @@ -306,11 +300,7 @@ function evaluatePolicyRule( if (isOperator(rule)) { const [op, selector, value] = rule; const selectorValue = typeof selector === "string" ? selector : selector; - const selectedValue = applySelector( - selectorValue as Selector, - record, - context, - ); + const selectedValue = applySelector(selectorValue as Selector, record, context); Log.debug( { @@ -353,10 +343,7 @@ function evaluatePolicyRule( case "anyOf": { const result = value.some((option) => _.isEqual(selectedValue, option)); - Log.debug( - { selector, actualValue: selectedValue, options: value, result }, - "AnyOf check", - ); + Log.debug({ selector, actualValue: selectedValue, options: value, result }, "AnyOf check"); return result; } } @@ -371,10 +358,7 @@ function evaluatePolicyRule( for (let i = 0; i < childPolicy.length; i++) { const result = evaluatePolicyRule(childPolicy[i], record, context); if (!result) { - Log.debug( - { failedAt: i, rule: childPolicy[i] }, - "AND connector short-circuited", - ); + Log.debug({ failedAt: i, rule: childPolicy[i] }, "AND connector short-circuited"); return false; } } diff --git a/src/nuc/selector.ts b/src/nuc/selector.ts index 43696fb..156ae5c 100644 --- a/src/nuc/selector.ts +++ b/src/nuc/selector.ts @@ -16,10 +16,7 @@ import { z } from "zod"; */ const SELECTOR_REGEX = /^(\$)?\.([a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*)?$/; -export const SelectorSchema = z - .string() - .regex(SELECTOR_REGEX, "Invalid selector format") - .brand<"Selector">(); +export const SelectorSchema = z.string().regex(SELECTOR_REGEX, "Invalid selector format").brand<"Selector">(); export type Selector = z.infer; diff --git a/src/validator/chain.ts b/src/validator/chain.ts index eaa9e13..10ae84b 100644 --- a/src/validator/chain.ts +++ b/src/validator/chain.ts @@ -1,9 +1,10 @@ -import { bytesToHex } from "@noble/hashes/utils.js"; import { Did } from "#/core/did/did"; import { Log } from "#/core/logger"; import type { Nuc } from "#/nuc/envelope"; import { Envelope } from "#/nuc/envelope"; import { Payload, REVOKE_COMMAND } from "#/nuc/payload"; +import { bytesToHex } from "@noble/hashes/utils.js"; + import { validatePolicyProperties } from "./policy"; import { validateTemporalProperties } from "./temporal"; import type { ValidationParameters } from "./types"; @@ -15,8 +16,7 @@ export const ISSUER_AUDIENCE_MISMATCH = "issuer/audience mismatch"; export const MISSING_PROOF = "proof is missing"; export const NOT_BEFORE_BACKWARDS = "`not before` cannot move backwards"; export const PROOFS_MUST_BE_DELEGATIONS = "proofs must be delegations"; -export const ROOT_KEY_SIGNATURE_MISSING = - "root NUC is not signed by a root issuer"; +export const ROOT_KEY_SIGNATURE_MISSING = "root NUC is not signed by a root issuer"; export const SUBJECT_NOT_IN_CHAIN = "subject not in chain"; export const TOO_MANY_PROOFS = "up to one `prf` in a token is allowed"; export const UNCHAINED_PROOFS = "extra proofs not part of chain provided"; @@ -24,20 +24,11 @@ export const UNCHAINED_PROOFS = "extra proofs not part of chain provided"; /** * Validate proof chain */ -export function validateProofs( - payload: Payload, - proofs: Payload[], - rootIssuers: string[], -): void { +export function validateProofs(payload: Payload, proofs: Payload[], rootIssuers: string[]): void { if (rootIssuers.length > 0) { const root = proofs.length > 0 ? proofs[proofs.length - 1] : payload; - if ( - !rootIssuers.some((issuer) => Did.areEqual(Did.parse(issuer), root.iss)) - ) { - Log.debug( - { rootIssuer: root.iss, expectedIssuers: rootIssuers }, - ROOT_KEY_SIGNATURE_MISSING, - ); + if (!rootIssuers.some((issuer) => Did.areEqual(Did.parse(issuer), root.iss))) { + Log.debug({ rootIssuer: root.iss, expectedIssuers: rootIssuers }, ROOT_KEY_SIGNATURE_MISSING); throw new Error(ROOT_KEY_SIGNATURE_MISSING); } } @@ -76,10 +67,7 @@ export function validatePayloadChain( if (payloads.length >= 2) { const payload = payloads[1]; if (!Did.areEqual(payload.iss, payload.sub)) { - Log.debug( - { issuer: payload.iss, subject: payload.sub }, - SUBJECT_NOT_IN_CHAIN, - ); + Log.debug({ issuer: payload.iss, subject: payload.sub }, SUBJECT_NOT_IN_CHAIN); throw new Error(SUBJECT_NOT_IN_CHAIN); } } @@ -88,42 +76,24 @@ export function validatePayloadChain( /** * Validate relationship between consecutive tokens */ -export function validateRelationshipProperties( - previous: Payload, - current: Payload, -): void { +export function validateRelationshipProperties(previous: Payload, current: Payload): void { if (!Did.areEqual(previous.aud, current.iss)) { - Log.debug( - { expected: previous.aud, actual: current.iss }, - ISSUER_AUDIENCE_MISMATCH, - ); + Log.debug({ expected: previous.aud, actual: current.iss }, ISSUER_AUDIENCE_MISMATCH); throw new Error(ISSUER_AUDIENCE_MISMATCH); } if (!Did.areEqual(previous.sub, current.sub)) { - Log.debug( - { previousSubject: previous.sub, currentSubject: current.sub }, - DIFFERENT_SUBJECTS, - ); + Log.debug({ previousSubject: previous.sub, currentSubject: current.sub }, DIFFERENT_SUBJECTS); throw new Error(DIFFERENT_SUBJECTS); } - if ( - !Payload.isCommandAttenuationOf(current.cmd, previous.cmd) && - current.cmd !== REVOKE_COMMAND - ) { - Log.debug( - { previousCommand: previous.cmd, currentCommand: current.cmd }, - COMMAND_NOT_ATTENUATED, - ); + if (!Payload.isCommandAttenuationOf(current.cmd, previous.cmd) && current.cmd !== REVOKE_COMMAND) { + Log.debug({ previousCommand: previous.cmd, currentCommand: current.cmd }, COMMAND_NOT_ATTENUATED); throw new Error(COMMAND_NOT_ATTENUATED); } if (previous.nbf && current.nbf && previous.nbf > current.nbf) { - Log.debug( - { previousNbf: previous.nbf, currentNbf: current.nbf }, - NOT_BEFORE_BACKWARDS, - ); + Log.debug({ previousNbf: previous.nbf, currentNbf: current.nbf }, NOT_BEFORE_BACKWARDS); throw new Error(NOT_BEFORE_BACKWARDS); } } @@ -159,9 +129,7 @@ export function sortProofs(hash: Uint8Array, proofs: Nuc[]): Payload[] { let nextHash: string | null = bytesToHex(hash); while (nextHash) { - const nextProofIndex = indexedProofs.findIndex( - ([hash, _]) => hash === nextHash, - ); + const nextProofIndex = indexedProofs.findIndex(([hash, _]) => hash === nextHash); if (nextProofIndex < 0) { Log.debug({ missingHash: nextHash }, MISSING_PROOF); diff --git a/src/validator/policy.ts b/src/validator/policy.ts index 7d2d981..b230b79 100644 --- a/src/validator/policy.ts +++ b/src/validator/policy.ts @@ -1,5 +1,6 @@ import { Log } from "#/core/logger"; import { Policy } from "#/nuc/policy"; + import type { ValidationParameters } from "./types"; export const POLICY_TOO_DEEP = "policy is too deep"; @@ -14,26 +15,17 @@ export function validatePolicyProperties( config: Required>, ): void { if (policy.length > config.maxPolicyWidth) { - Log.debug( - { policyLength: policy.length, maxPolicyWidth: config.maxPolicyWidth }, - POLICY_TOO_WIDE, - ); + Log.debug({ policyLength: policy.length, maxPolicyWidth: config.maxPolicyWidth }, POLICY_TOO_WIDE); throw new Error(POLICY_TOO_WIDE); } const properties = Policy.getPolicyTreeProperties(policy); if (properties.maxWidth > config.maxPolicyWidth) { - Log.debug( - { maxWidth: properties.maxWidth, maxPolicyWidth: config.maxPolicyWidth }, - POLICY_TOO_WIDE, - ); + Log.debug({ maxWidth: properties.maxWidth, maxPolicyWidth: config.maxPolicyWidth }, POLICY_TOO_WIDE); throw new Error(POLICY_TOO_WIDE); } if (properties.maxDepth > config.maxPolicyDepth) { - Log.debug( - { maxDepth: properties.maxDepth, maxPolicyDepth: config.maxPolicyDepth }, - POLICY_TOO_DEEP, - ); + Log.debug({ maxDepth: properties.maxDepth, maxPolicyDepth: config.maxPolicyDepth }, POLICY_TOO_DEEP); throw new Error(POLICY_TOO_DEEP); } } diff --git a/src/validator/signatures.ts b/src/validator/signatures.ts index beed391..bfcdc8a 100644 --- a/src/validator/signatures.ts +++ b/src/validator/signatures.ts @@ -1,6 +1,3 @@ -import { bytesToHex } from "@noble/hashes/utils.js"; -import type { SignTypedDataParameters } from "viem"; -import { hashTypedData, recoverAddress } from "viem/utils"; import type { Did } from "#/core/did/did"; import * as ethr from "#/core/did/ethr"; import * as key from "#/core/did/key"; @@ -9,6 +6,9 @@ import type { DidEthr } from "#/core/did/types"; import { base64UrlDecode } from "#/core/encoding"; import { toEip712Payload } from "#/core/signer"; import type { Envelope, Nuc } from "#/nuc/envelope"; +import { bytesToHex } from "@noble/hashes/utils.js"; +import type { SignTypedDataParameters } from "viem"; +import { hashTypedData, recoverAddress } from "viem/utils"; export const INVALID_SIGNATURES = "invalid signatures"; @@ -30,9 +30,7 @@ export async function validateNucSignature(nuc: Nuc): Promise { /** * Validate all signatures in an envelope. */ -export async function validateEnvelopeSignature( - envelope: Envelope, -): Promise { +export async function validateEnvelopeSignature(envelope: Envelope): Promise { await validateNucSignature(envelope.nuc); for (const proof of envelope.proofs) { await validateNucSignature(proof); @@ -42,11 +40,7 @@ export async function validateEnvelopeSignature( /** * Validates the message's signature against the provided did. */ -export async function validateDidSignature( - did: Did, - message: Uint8Array, - signature: Uint8Array, -): Promise { +export async function validateDidSignature(did: Did, message: Uint8Array, signature: Uint8Array): Promise { switch (did.method) { case "key": return key.validateSignature(did, message, signature); @@ -58,8 +52,7 @@ export async function validateDidSignature( } export const EIP712_INVALID_SIGNATURE = "EIP-712 signature verification failed"; -export const EIP712_INVALID_ISSUER = - "issuer must be a did:ethr for EIP-712 tokens"; +export const EIP712_INVALID_ISSUER = "issuer must be a did:ethr for EIP-712 tokens"; /** * Validates an eip712 signed message by recovering the public key from the signature. @@ -86,16 +79,12 @@ export async function validateEip712Signature(nuc: Nuc): Promise { signature: `0x${bytesToHex(signature)}` as `0x${string}`, }); - if ( - recoveredAddress.toLowerCase() !== - (payload.iss as DidEthr).address.toLowerCase() - ) { + if (recoveredAddress.toLowerCase() !== (payload.iss as DidEthr).address.toLowerCase()) { throw new Error(EIP712_INVALID_SIGNATURE); } } -export const NATIVE_SIGNATURE_VERIFICATION_FAILED = - "native signature verification failed"; +export const NATIVE_SIGNATURE_VERIFICATION_FAILED = "native signature verification failed"; /** * Validates an eip712 signed message by recovering the public key from the signature. diff --git a/src/validator/temporal.ts b/src/validator/temporal.ts index c11741b..073e074 100644 --- a/src/validator/temporal.ts +++ b/src/validator/temporal.ts @@ -7,26 +7,17 @@ export const TOKEN_EXPIRED = "token is expired"; /** * Validate temporal properties of a token */ -export function validateTemporalProperties( - payload: Payload, - currentTime: number, -): void { +export function validateTemporalProperties(payload: Payload, currentTime: number): void { // Convert currentTime from milliseconds to seconds for comparison const currentTimeInSeconds = Math.floor(currentTime / 1000); if (payload.exp && payload.exp <= currentTimeInSeconds) { - Log.debug( - { expiredAt: payload.exp, now: currentTimeInSeconds }, - TOKEN_EXPIRED, - ); + Log.debug({ expiredAt: payload.exp, now: currentTimeInSeconds }, TOKEN_EXPIRED); throw new Error(TOKEN_EXPIRED); } if (payload.nbf && payload.nbf > currentTimeInSeconds) { - Log.debug( - { notBefore: payload.nbf, now: currentTimeInSeconds }, - NOT_BEFORE_NOT_MET, - ); + Log.debug({ notBefore: payload.nbf, now: currentTimeInSeconds }, NOT_BEFORE_NOT_MET); throw new Error(NOT_BEFORE_NOT_MET); } } diff --git a/src/validator/types.ts b/src/validator/types.ts index bb11cf4..913e5f5 100644 --- a/src/validator/types.ts +++ b/src/validator/types.ts @@ -1,9 +1,7 @@ /** * Token requirement types */ -export type TokenRequirement = - | { type: "invocation"; audience: string } - | { type: "delegation"; audience: string }; +export type TokenRequirement = { type: "invocation"; audience: string } | { type: "delegation"; audience: string }; /** * Validation parameters configuration diff --git a/src/validator/validator.ts b/src/validator/validator.ts index c04dd7f..4601185 100644 --- a/src/validator/validator.ts +++ b/src/validator/validator.ts @@ -4,24 +4,15 @@ import { Codec } from "#/nuc/codec"; import type { Envelope } from "#/nuc/envelope"; import { Payload } from "#/nuc/payload"; import { Policy } from "#/nuc/policy"; + import { sortProofs, validatePayloadChain, validateProofs } from "./chain"; import { validateEnvelopeSignature } from "./signatures"; -import type { - TokenRequirement, - ValidationOptions, - ValidationParameters, -} from "./types"; +import type { TokenRequirement, ValidationOptions, ValidationParameters } from "./types"; // Re-export types -export type { - TokenRequirement, - ValidationOptions, - ValidationParameters, -} from "./types"; +export type { TokenRequirement, ValidationOptions, ValidationParameters } from "./types"; -const DEFAULT_VALIDATION_PARAMETERS: Required< - Omit -> = { +const DEFAULT_VALIDATION_PARAMETERS: Required> = { maxChainLength: 5, maxPolicyWidth: 10, maxPolicyDepth: 5, @@ -36,8 +27,7 @@ export namespace Validator { export const MISSING_PROOF = "proof is missing"; export const NOT_BEFORE_BACKWARDS = "`not before` cannot move backwards"; export const PROOFS_MUST_BE_DELEGATIONS = "proofs must be delegations"; - export const ROOT_KEY_SIGNATURE_MISSING = - "root NUC is not signed by a root issuer"; + export const ROOT_KEY_SIGNATURE_MISSING = "root NUC is not signed by a root issuer"; export const SUBJECT_NOT_IN_CHAIN = "subject not in chain"; export const TOO_MANY_PROOFS = "up to one `prf` in a token is allowed"; export const UNCHAINED_PROOFS = "extra proofs not part of chain provided"; @@ -67,10 +57,7 @@ export namespace Validator { * @returns A validated `Envelope` object. * @throws Throws an error if any part of the validation fails. See `Validator.validate` for a full list of possible errors. */ - export async function parse( - tokenString: string, - options: ValidationOptions, - ): Promise { + export async function parse(tokenString: string, options: ValidationOptions): Promise { // The internal Codec function is "unsafe" because it doesn't validate. // We immediately pass its output to the validator to ensure no unvalidated // data is ever returned to the user from this function. @@ -154,16 +141,8 @@ export namespace Validator { * } * ``` */ - export async function validate( - envelope: Envelope, - options: ValidationOptions, - ): Promise { - const { - rootIssuers, - params = {}, - context = {}, - timeProvider = () => Date.now(), - } = options; + export async function validate(envelope: Envelope, options: ValidationOptions): Promise { + const { rootIssuers, params = {}, context = {}, timeProvider = (): number => Date.now() } = options; const config = { ...DEFAULT_VALIDATION_PARAMETERS, ...params }; if (envelope.proofs.length + 1 > config.maxChainLength) { @@ -185,9 +164,7 @@ export namespace Validator { throw new Error(Validator.TOO_MANY_PROOFS); } - const proofs = proofBytes.flatMap((proofHash) => - sortProofs(proofHash, envelope.proofs), - ); + const proofs = proofBytes.flatMap((proofHash) => sortProofs(proofHash, envelope.proofs)); const now = timeProvider(); @@ -226,28 +203,19 @@ function validatePayload( * Validates a delegation token against token requirements. * @internal */ -function validateDelegationPayload( - payload: Payload, - tokenRequirements?: TokenRequirement, -): void { +function validateDelegationPayload(payload: Payload, tokenRequirements?: TokenRequirement): void { if (!tokenRequirements) { return; } if (tokenRequirements.type === "invocation") { - Log.debug( - { expectedType: "invocation", actualType: "delegation" }, - Validator.NEED_INVOCATION, - ); + Log.debug({ expectedType: "invocation", actualType: "delegation" }, Validator.NEED_INVOCATION); throw new Error(Validator.NEED_INVOCATION); } if (tokenRequirements.type === "delegation") { if (!Did.areEqual(payload.aud, Did.parse(tokenRequirements.audience))) { - Log.debug( - { expected: tokenRequirements.audience, actual: payload.aud }, - Validator.INVALID_AUDIENCE, - ); + Log.debug({ expected: tokenRequirements.audience, actual: payload.aud }, Validator.INVALID_AUDIENCE); throw new Error(Validator.INVALID_AUDIENCE); } } @@ -274,19 +242,13 @@ function validateInvocationPayload( } if (tokenRequirements.type === "delegation") { - Log.debug( - { expectedType: "delegation", actualType: "invocation" }, - Validator.NEED_DELEGATION, - ); + Log.debug({ expectedType: "delegation", actualType: "invocation" }, Validator.NEED_DELEGATION); throw new Error(Validator.NEED_DELEGATION); } if (tokenRequirements.type === "invocation") { if (!Did.areEqual(payload.aud, Did.parse(tokenRequirements.audience))) { - Log.debug( - { expected: tokenRequirements.audience, actual: payload.aud }, - Validator.INVALID_AUDIENCE, - ); + Log.debug({ expected: tokenRequirements.audience, actual: payload.aud }, Validator.INVALID_AUDIENCE); throw new Error(Validator.INVALID_AUDIENCE); } } @@ -306,14 +268,8 @@ function validatePolicyEvaluates( throw new Error(Validator.PROOFS_MUST_BE_DELEGATIONS); } - if ( - Payload.isDelegationPayload(proof) && - !Policy.evaluatePolicy(proof.pol, payloadJson, context) - ) { - Log.debug( - { policy: proof.pol, payload: payloadJson, context }, - Validator.POLICY_NOT_MET, - ); + if (Payload.isDelegationPayload(proof) && !Policy.evaluatePolicy(proof.pol, payloadJson, context)) { + Log.debug({ policy: proof.pol, payload: payloadJson, context }, Validator.POLICY_NOT_MET); throw new Error(Validator.POLICY_NOT_MET); } } diff --git a/tests/helpers/assertions.ts b/tests/helpers/assertions.ts index 20036f6..6707e97 100644 --- a/tests/helpers/assertions.ts +++ b/tests/helpers/assertions.ts @@ -1,7 +1,7 @@ -import { secp256k1 } from "@noble/curves/secp256k1.js"; import * as didKey from "#/core/did/key"; import type { Envelope } from "#/nuc/envelope"; import { type ValidationParameters, Validator } from "#/validator/validator"; +import { secp256k1 } from "@noble/curves/secp256k1.js"; export const ROOT_KEYS = [secp256k1.utils.randomSecretKey()]; export const ROOT_DIDS: string[] = ROOT_KEYS.map((privKey) => @@ -15,14 +15,11 @@ export type AsserterConfiguration = { currentTime?: number; }; -export async function assertSuccess( - envelope: Envelope, - config: AsserterConfiguration = {}, -): Promise { +export async function assertSuccess(envelope: Envelope, config: AsserterConfiguration = {}): Promise { const timeProvider = config.currentTime === undefined ? undefined - : () => { + : (): number => { if (config.currentTime === undefined) { throw new Error("currentTime unexpectedly undefined"); } @@ -41,10 +38,10 @@ export async function assertFailure( envelope: Envelope, expectedMessage: string, config: AsserterConfiguration = {}, -) { +): Promise { const timeProvider = config.currentTime !== undefined - ? () => { + ? (): number => { if (config.currentTime === undefined) { throw new Error("currentTime unexpectedly undefined"); } @@ -65,14 +62,10 @@ export async function assertFailure( // Test passes return; } - throw new Error( - `Validation failed with unexpected message: expected '${expectedMessage}', got '${e.message}'`, - ); + throw new Error(`Validation failed with unexpected message: expected '${expectedMessage}', got '${e.message}'`); } // Re-throw if it's not a standard Error throw e; } - throw new Error( - `Validation succeeded but was expected to fail with: ${expectedMessage}`, - ); + throw new Error(`Validation succeeded but was expected to fail with: ${expectedMessage}`); } diff --git a/tests/helpers/signers.ts b/tests/helpers/signers.ts index 0d3d54a..3e1989a 100644 --- a/tests/helpers/signers.ts +++ b/tests/helpers/signers.ts @@ -1,8 +1,8 @@ -import { hexToBytes } from "@noble/hashes/utils.js"; -import type { PrivateKeyAccount } from "viem/accounts"; import * as ethr from "#/core/did/ethr"; import type { Signer } from "#/core/signer"; import { NucHeaders } from "#/nuc/header"; +import { hexToBytes } from "@noble/hashes/utils.js"; +import type { PrivateKeyAccount } from "viem/accounts"; /** * Creates a native `did:ethr` signer from a viem PrivateKeyAccount instance. @@ -18,9 +18,7 @@ export function createNativeEthrSigner(account: PrivateKeyAccount): Signer { message: { raw: data }, }); // Remove 0x prefix if present - const cleanHex = signatureHex.startsWith("0x") - ? signatureHex.slice(2) - : signatureHex; + const cleanHex = signatureHex.startsWith("0x") ? signatureHex.slice(2) : signatureHex; return hexToBytes(cleanHex); }, }; diff --git a/tests/integration/heterogeneous-chain.test.ts b/tests/integration/heterogeneous-chain.test.ts index 1fde56b..3a314cb 100644 --- a/tests/integration/heterogeneous-chain.test.ts +++ b/tests/integration/heterogeneous-chain.test.ts @@ -1,25 +1,21 @@ -import { privateKeyToAccount } from "viem/accounts"; -import { describe, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import * as ethr from "#/core/did/ethr"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { assertSuccess } from "#tests/helpers/assertions"; import { createNativeEthrSigner } from "#tests/helpers/signers"; +import { privateKeyToAccount } from "viem/accounts"; +import { describe, it } from "vitest"; describe("heterogeneous nuc chain", () => { - it("should validate a heterogeneous chain: did:key -> did:ethr -> did:nil", async ({ - expect, - }) => { + it("should validate a heterogeneous chain: did:key -> did:ethr -> did:nil", async ({ expect }) => { // Phase 1 - Actors // A. The root of trust, using did:key const rootSigner = Signer.generate(); const rootDid = await rootSigner.getDid(); // B. An intermediate user with an Ethereum wallet - const userAccount = privateKeyToAccount( - "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", - ); + const userAccount = privateKeyToAccount("0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a"); const userDid = ethr.fromAddress(userAccount.address); const userSigner = createNativeEthrSigner(userAccount); @@ -40,9 +36,7 @@ describe("heterogeneous nuc chain", () => { .sign(rootSigner); // 2. User (did:ethr) delegates to LegacySvc (did:nil) - const userToLegacySvcDelegation = await Builder.delegationFrom( - rootToUserDelegation, - ) + const userToLegacySvcDelegation = await Builder.delegationFrom(rootToUserDelegation) .audience(legacySvcDid) .command("/nil/db/data/find") .expiresIn(ONE_HOUR_MS / 2) diff --git a/tests/integration/nuc-rs-compat.test.ts b/tests/integration/nuc-rs-compat.test.ts index fbfe349..184c0c1 100644 --- a/tests/integration/nuc-rs-compat.test.ts +++ b/tests/integration/nuc-rs-compat.test.ts @@ -1,5 +1,6 @@ -import { describe, expect, it } from "vitest"; import { assertFailure, assertSuccess } from "#tests/helpers/assertions"; +import { describe, expect, it } from "vitest"; + import { NucRsCompatAssertions } from "./nuc-rs-compat"; describe("nuc-rs compatibility tests", () => { diff --git a/tests/integration/nuc-rs-compat.ts b/tests/integration/nuc-rs-compat.ts index cc1bd49..a3b2dd1 100644 --- a/tests/integration/nuc-rs-compat.ts +++ b/tests/integration/nuc-rs-compat.ts @@ -1,13 +1,11 @@ import * as fs from "node:fs"; import * as path from "node:path"; -import { hexToBytes } from "@noble/hashes/utils.js"; -import { z } from "zod"; + import * as didKey from "#/core/did/key"; import { Codec } from "#/nuc/codec"; -import type { - TokenRequirement, - ValidationParameters, -} from "#/validator/validator"; +import type { TokenRequirement, ValidationParameters } from "#/validator/validator"; +import { hexToBytes } from "@noble/hashes/utils.js"; +import { z } from "zod"; // Schema for parsing the `token_requirements` field from the text file. const TokenReqSchema = z.union([ @@ -54,9 +52,7 @@ const InputSchema = z }) .transform((input) => ({ token: input.token, - rootKeys: input.root_keys.map((hexKey) => - didKey.fromPublicKeyBytes(hexToBytes(hexKey)), - ), + rootKeys: input.root_keys.map((hexKey) => didKey.fromPublicKeyBytes(hexToBytes(hexKey))), currentTime: input.current_time * 1000, context: input.context, parameters: input.parameters, diff --git a/tests/integration/signer-eip1193-provider.test.ts b/tests/integration/signer-eip1193-provider.test.ts index f513ac4..0c8d9f2 100644 --- a/tests/integration/signer-eip1193-provider.test.ts +++ b/tests/integration/signer-eip1193-provider.test.ts @@ -1,8 +1,8 @@ -import type { EIP1193Provider } from "viem"; -import { describe, expect, it, vi } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; +import type { EIP1193Provider } from "viem"; +import { describe, expect, it, vi } from "vitest"; const MOCK_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; const MOCK_SIGNATURE = diff --git a/tests/integration/validator.test.ts b/tests/integration/validator.test.ts index 75a8382..d2d9df7 100644 --- a/tests/integration/validator.test.ts +++ b/tests/integration/validator.test.ts @@ -1,15 +1,10 @@ -import { describe, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { REVOKE_COMMAND } from "#/nuc/payload"; import { Validator } from "#/validator/validator"; -import { - assertFailure, - assertSuccess, - ROOT_DIDS, - ROOT_KEYS, -} from "#tests/helpers/assertions"; +import { assertFailure, assertSuccess, ROOT_DIDS, ROOT_KEYS } from "#tests/helpers/assertions"; +import { describe, it } from "vitest"; describe("Validator", () => { // Use a consistent root signer for all tests, derived from the test seed diff --git a/tests/unit/builder.test.ts b/tests/unit/builder.test.ts index 213b9c4..874ad05 100644 --- a/tests/unit/builder.test.ts +++ b/tests/unit/builder.test.ts @@ -1,9 +1,9 @@ -import { describe, it } from "vitest"; import { FOUR_WEEKS_MS, ONE_HOUR_MS } from "#/constants"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Payload, REVOKE_COMMAND } from "#/nuc/payload"; +import { describe, it } from "vitest"; describe("Builder", () => { const signer = Signer.generate(); @@ -80,9 +80,7 @@ describe("Builder", () => { expect(payload.cmd).toBe("/db/read"); // Inherited }); - it("builds an invocation token from a delegation using invoking()", async ({ - expect, - }) => { + it("builds an invocation token from a delegation using invoking()", async ({ expect }) => { const rootSigner = Signer.generate(); const userSigner = Signer.generate(); const userDid = await userSigner.getDid(); @@ -127,9 +125,7 @@ describe("Builder Ergonomics", () => { const userSigner = Signer.generate(); const serviceSigner = Signer.generate(); - it("should sign and serialize a delegation in one step", async ({ - expect, - }) => { + it("should sign and serialize a delegation in one step", async ({ expect }) => { const userDid = await userSigner.getDid(); const serializedToken = await Builder.delegation() @@ -156,9 +152,7 @@ describe("Builder Ergonomics", () => { .expiresIn(ONE_HOUR_MS) .signAndSerialize(rootSigner); - const chainedDelegationString = await Builder.delegationFromString( - rootDelegationString, - ) + const chainedDelegationString = await Builder.delegationFromString(rootDelegationString) .audience(serviceDid) .expiresIn(ONE_HOUR_MS / 2) .signAndSerialize(userSigner); @@ -180,9 +174,7 @@ describe("Builder Ergonomics", () => { .expiresIn(ONE_HOUR_MS) .signAndSerialize(rootSigner); - const invocationString = await Builder.invocationFromString( - rootDelegationString, - ) + const invocationString = await Builder.invocationFromString(rootDelegationString) .audience(serviceDid) .arguments({ foo: "bar" }) .expiresIn(ONE_HOUR_MS / 2) @@ -207,19 +199,12 @@ describe("Builder Expiration and Lifetime", () => { const audDid = await aud.getDid(); const subDid = await sub.getDid(); - const builder = Builder.delegation() - .audience(audDid) - .subject(subDid) - .command("/test"); + const builder = Builder.delegation().audience(audDid).subject(subDid).command("/test"); - await expect(builder.sign(signer)).rejects.toThrow( - "Expiration is a required field.", - ); + await expect(builder.sign(signer)).rejects.toThrow("Expiration is a required field."); }); - it("should throw an error if expiration is in the past", async ({ - expect, - }) => { + it("should throw an error if expiration is in the past", async ({ expect }) => { const audDid = await aud.getDid(); const subDid = await sub.getDid(); @@ -229,9 +214,7 @@ describe("Builder Expiration and Lifetime", () => { .command("/test") .expiresAt(Date.now() - 1000); - await expect(builder.sign(signer)).rejects.toThrow( - "Expiration date must be in the future.", - ); + await expect(builder.sign(signer)).rejects.toThrow("Expiration date must be in the future."); }); it("should correctly set expiration using expiresIn", async ({ expect }) => { @@ -253,22 +236,14 @@ describe("Builder Expiration and Lifetime", () => { expect(envelope.nuc.payload.exp).toBeLessThanOrEqual(expectedExp + 1); }); - it("should throw if expiration exceeds the default max lifetime", async ({ - expect, - }) => { + it("should throw if expiration exceeds the default max lifetime", async ({ expect }) => { const audDid = await aud.getDid(); const subDid = await sub.getDid(); const longLifetime = FOUR_WEEKS_MS + 1000; - const builder = Builder.delegation() - .audience(audDid) - .subject(subDid) - .command("/test") - .expiresIn(longLifetime); + const builder = Builder.delegation().audience(audDid).subject(subDid).command("/test").expiresIn(longLifetime); - await expect(builder.sign(signer)).rejects.toThrow( - "exceeds the maximum lifetime", - ); + await expect(builder.sign(signer)).rejects.toThrow("exceeds the maximum lifetime"); }); it("should allow setting a shorter max lifetime", async ({ expect }) => { @@ -294,29 +269,18 @@ describe("Builder Expiration and Lifetime", () => { .maxLifetime(shortMaxLifetime) .expiresIn(shortMaxLifetime + 1); - await expect(builder.sign(signer)).rejects.toThrow( - "exceeds the maximum lifetime. Max expiry is", - ); + await expect(builder.sign(signer)).rejects.toThrow("exceeds the maximum lifetime. Max expiry is"); }); - it("should throw when trying to set a max lifetime longer than allowed", async ({ - expect, - }) => { + it("should throw when trying to set a max lifetime longer than allowed", async ({ expect }) => { const audDid = await aud.getDid(); const subDid = await sub.getDid(); - const builder = Builder.delegation() - .audience(audDid) - .subject(subDid) - .command("/test"); + const builder = Builder.delegation().audience(audDid).subject(subDid).command("/test"); - expect(() => builder.maxLifetime(FOUR_WEEKS_MS + 1000)).toThrow( - "exceeds the allowed maximum", - ); + expect(() => builder.maxLifetime(FOUR_WEEKS_MS + 1000)).toThrow("exceeds the allowed maximum"); }); - it("should cap a chained token's lifetime by its parent's", async ({ - expect, - }) => { + it("should cap a chained token's lifetime by its parent's", async ({ expect }) => { const userSigner = Signer.generate(); const userDid = await userSigner.getDid(); const serviceDid = await Signer.generate().getDid(); @@ -336,9 +300,7 @@ describe("Builder Expiration and Lifetime", () => { .audience(serviceDid) .expiresIn(parentLifetime + 1000); - await expect(childBuilder.sign(userSigner)).rejects.toThrow( - "exceeds the maximum lifetime", - ); + await expect(childBuilder.sign(userSigner)).rejects.toThrow("exceeds the maximum lifetime"); // This should succeed const validChild = await Builder.delegationFrom(rootDelegation) @@ -348,9 +310,7 @@ describe("Builder Expiration and Lifetime", () => { expect(validChild).toBeDefined(); }); - it("should correctly convert ms to seconds in payload for exp and nbf", async ({ - expect, - }) => { + it("should correctly convert ms to seconds in payload for exp and nbf", async ({ expect }) => { const audDid = await aud.getDid(); const subDid = await sub.getDid(); const now = Date.now(); diff --git a/tests/unit/codec.test.ts b/tests/unit/codec.test.ts index 4a3cc3c..17dfe3b 100644 --- a/tests/unit/codec.test.ts +++ b/tests/unit/codec.test.ts @@ -1,10 +1,10 @@ -import * as fc from "fast-check"; -import { describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; +import * as fc from "fast-check"; +import { describe, expect, it } from "vitest"; describe("Codec and Validator.parse", () => { const rootSigner = Signer.generate(); @@ -47,18 +47,13 @@ describe("Codec and Validator.parse", () => { describe("error paths for _unsafeDecodeBase64Url", () => { it("should throw for an invalid Nuc structure", () => { const invalidToken = "a.b"; - expect(() => Codec._unsafeDecodeBase64Url(invalidToken)).toThrow( - "invalid Nuc structure", - ); + expect(() => Codec._unsafeDecodeBase64Url(invalidToken)).toThrow("invalid Nuc structure"); }); it("should throw for an invalid header", () => { // Create a header with invalid version format - const invalidHeader = - "eyJhbGciOiJFUzI1NksiLCJ2ZXIiOiJpbnZhbGlkIn0.e30.e30"; // {"alg":"ES256K","ver":"invalid"} - expect(() => Codec._unsafeDecodeBase64Url(invalidHeader)).toThrow( - "invalid Nuc header", - ); + const invalidHeader = "eyJhbGciOiJFUzI1NksiLCJ2ZXIiOiJpbnZhbGlkIn0.e30.e30"; // {"alg":"ES256K","ver":"invalid"} + expect(() => Codec._unsafeDecodeBase64Url(invalidHeader)).toThrow("invalid Nuc header"); }); it("should throw for empty tokens in a chain", async () => { @@ -71,9 +66,7 @@ describe("Codec and Validator.parse", () => { .sign(rootSigner); const validSerialized = Codec.serializeBase64Url(rootEnvelope); const invalidChain = `${validSerialized}//${validSerialized}`; - expect(() => Codec._unsafeDecodeBase64Url(invalidChain)).toThrow( - "empty token", - ); + expect(() => Codec._unsafeDecodeBase64Url(invalidChain)).toThrow("empty token"); }); it("should throw for an empty input string", () => { diff --git a/tests/unit/command.test.ts b/tests/unit/command.test.ts index 4b05ecd..8783edf 100644 --- a/tests/unit/command.test.ts +++ b/tests/unit/command.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from "vitest"; import { type Command, Payload } from "#/nuc/payload"; +import { describe, expect, it } from "vitest"; describe("isCommandAttenuationOf", () => { it.each([ @@ -8,12 +8,7 @@ describe("isCommandAttenuationOf", () => { ["/a/b", "/a/b", true], ["/a", "/a/b", false], ["/x", "/y", false], - ])( - 'should return %s for command "%s" and parent "%s"', - (cmd, parent, expected) => { - expect( - Payload.isCommandAttenuationOf(cmd as Command, parent as Command), - ).toBe(expected); - }, - ); + ])('should return %s for command "%s" and parent "%s"', (cmd, parent, expected) => { + expect(Payload.isCommandAttenuationOf(cmd as Command, parent as Command)).toBe(expected); + }); }); diff --git a/tests/unit/did.test.ts b/tests/unit/did.test.ts index 1fa3f82..db22c54 100644 --- a/tests/unit/did.test.ts +++ b/tests/unit/did.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from "vitest"; import { Did } from "#/core/did/did"; import type { DidKey, DidNil } from "#/core/did/types"; import { Signer } from "#/core/signer"; +import { describe, expect, it } from "vitest"; describe("Dids", () => { // Generate a single signer to create both nil and key DIDs from @@ -35,9 +35,7 @@ describe("Dids", () => { }); it("throws on unsupported method", () => { - expect(() => Did.parse("did:unsupported:123")).toThrow( - "Unsupported Did method", - ); + expect(() => Did.parse("did:unsupported:123")).toThrow("Unsupported Did method"); }); it("correctly compares Dids for equality", async () => { diff --git a/tests/unit/payload.test.ts b/tests/unit/payload.test.ts index 8b2c21b..4d1f69c 100644 --- a/tests/unit/payload.test.ts +++ b/tests/unit/payload.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from "vitest"; import { Did } from "#/core/did/did"; import { Signer } from "#/core/signer"; import { CommandSchema, Payload } from "#/nuc/payload"; +import { describe, expect, it } from "vitest"; describe("Token Module", () => { // Generate signer for reuse diff --git a/tests/unit/policy.test.ts b/tests/unit/policy.test.ts index 8c36d64..257b461 100644 --- a/tests/unit/policy.test.ts +++ b/tests/unit/policy.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "vitest"; import { Policy } from "#/nuc/policy"; +import { describe, expect, test } from "vitest"; describe("Policy", () => { test.each([ @@ -156,9 +156,7 @@ describe("Policy", () => { }, { case: "eq object", - policy: Policy.Schema.parse([ - ["==", ".name", { first: "bob", last: "smith" }], - ]), + policy: Policy.Schema.parse([["==", ".name", { first: "bob", last: "smith" }]]), }, { case: "eq value context", @@ -256,9 +254,7 @@ describe("Policy", () => { }, { case: "eq object", - policy: Policy.Schema.parse([ - ["==", ".name", { first: "john", last: "smith" }], - ]), + policy: Policy.Schema.parse([["==", ".name", { first: "john", last: "smith" }]]), }, { case: "eq value context", diff --git a/tests/unit/selector.test.ts b/tests/unit/selector.test.ts index 3d19553..6ca33b0 100644 --- a/tests/unit/selector.test.ts +++ b/tests/unit/selector.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "vitest"; import { applySelector, SelectorSchema } from "#/nuc/selector"; +import { describe, expect, test } from "vitest"; describe("Selector", () => { test.each([ @@ -11,8 +11,7 @@ describe("Selector", () => { { case: "multi context", input: "$.foo.bar" }, { case: "entire_alphabet", - input: - ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_", + input: ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_", }, ])("select $case ($input)", ({ input }) => { expect(() => SelectorSchema.parse(input)).not.toThrowError(); diff --git a/tests/unit/signer-eip712.test.ts b/tests/unit/signer-eip712.test.ts index 4851b02..c6a392a 100644 --- a/tests/unit/signer-eip712.test.ts +++ b/tests/unit/signer-eip712.test.ts @@ -1,19 +1,15 @@ -import { privateKeyToAccount } from "viem/accounts"; -import { describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import * as ethr from "#/core/did/ethr"; import { type Eip712Signer, Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; +import { privateKeyToAccount } from "viem/accounts"; +import { describe, expect, it } from "vitest"; describe("EIP-712 Signer (`did:ethr`)", () => { - const account = privateKeyToAccount( - "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", - ); - const audience = ethr.fromAddress( - "0x742d35cc6634c0532925A3B844bc9E7095ED4E40", - ); + const account = privateKeyToAccount("0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a"); + const audience = ethr.fromAddress("0x742d35cc6634c0532925A3B844bc9E7095ED4E40"); const eip712Signer: Eip712Signer = { getAddress: async () => account.address, signTypedData: async (params) => account.signTypedData(params), diff --git a/tests/unit/signer-ethr.test.ts b/tests/unit/signer-ethr.test.ts index 929c8b9..3cb6bd7 100644 --- a/tests/unit/signer-ethr.test.ts +++ b/tests/unit/signer-ethr.test.ts @@ -1,18 +1,16 @@ -import { privateKeyToAccount } from "viem/accounts"; -import { describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; import { createNativeEthrSigner } from "#tests/helpers/signers"; +import { privateKeyToAccount } from "viem/accounts"; +import { describe, expect, it } from "vitest"; async function assertValidParse( - envelope: Awaited< - ReturnType<(typeof Builder.delegation)["prototype"]["sign"]> - >, + envelope: Awaited>, rootDidString: string, -) { +): Promise { const serialized = Codec.serializeBase64Url(envelope); const parsed = await Validator.parse(serialized, { rootIssuers: [rootDidString], @@ -22,9 +20,7 @@ async function assertValidParse( describe("Native Signer (`did:ethr`)", () => { it("should build and successfully validate a native signed Nuc from a viem account", async () => { - const account = privateKeyToAccount( - "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", - ); + const account = privateKeyToAccount("0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a"); const audienceSigner = Signer.generate(); const audience = await audienceSigner.getDid(); diff --git a/tests/unit/signer-legacy.test.ts b/tests/unit/signer-legacy.test.ts index 8c6ff0c..2cbeaae 100644 --- a/tests/unit/signer-legacy.test.ts +++ b/tests/unit/signer-legacy.test.ts @@ -1,17 +1,15 @@ -import { describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { base64UrlDecode } from "#/core/encoding"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; +import { describe, expect, it } from "vitest"; async function assertValidParse( - envelope: Awaited< - ReturnType<(typeof Builder.delegation)["prototype"]["sign"]> - >, + envelope: Awaited>, rootDidString: string, -) { +): Promise { const serialized = Codec.serializeBase64Url(envelope); const parsed = await Validator.parse(serialized, { rootIssuers: [rootDidString], diff --git a/tests/unit/signer-native.test.ts b/tests/unit/signer-native.test.ts index 15df702..7796bbf 100644 --- a/tests/unit/signer-native.test.ts +++ b/tests/unit/signer-native.test.ts @@ -1,17 +1,15 @@ -import { describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import { base64UrlDecode } from "#/core/encoding"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; +import { describe, expect, it } from "vitest"; async function assertValidParse( - envelope: Awaited< - ReturnType<(typeof Builder.delegation)["prototype"]["sign"]> - >, + envelope: Awaited>, rootDidString: string, -) { +): Promise { const serialized = Codec.serializeBase64Url(envelope); const parsed = await Validator.parse(serialized, { rootIssuers: [rootDidString], diff --git a/tests/unit/signer-web3.test.ts b/tests/unit/signer-web3.test.ts index 24e31ab..4658e90 100644 --- a/tests/unit/signer-web3.test.ts +++ b/tests/unit/signer-web3.test.ts @@ -1,19 +1,17 @@ -import type { PrivateKeyAccount } from "viem/accounts"; -import { privateKeyToAccount } from "viem/accounts"; -import { beforeEach, describe, expect, it } from "vitest"; import { ONE_HOUR_MS } from "#/constants"; import type { Signer as NucSigner } from "#/core/signer"; import { Signer } from "#/core/signer"; import { Builder } from "#/nuc/builder"; import { Codec } from "#/nuc/codec"; import { Validator } from "#/validator/validator"; +import type { PrivateKeyAccount } from "viem/accounts"; +import { privateKeyToAccount } from "viem/accounts"; +import { beforeEach, describe, expect, it } from "vitest"; async function assertValidParse( - envelope: Awaited< - ReturnType<(typeof Builder.delegation)["prototype"]["sign"]> - >, + envelope: Awaited>, rootDidString: string, -) { +): Promise { const serialized = Codec.serializeBase64Url(envelope); const parsed = await Validator.parse(serialized, { rootIssuers: [rootDidString], @@ -26,14 +24,11 @@ describe("Web3 Signer (EIP-712)", () => { let web3Signer: NucSigner; beforeEach(async () => { - account = privateKeyToAccount( - "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", - ); + account = privateKeyToAccount("0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a"); const eip712Adapter = { - getAddress: async () => account.address, - signTypedData: async ( - params: Parameters[0], - ) => account.signTypedData(params), + getAddress: async (): Promise<`0x${string}`> => account.address, + signTypedData: async (params: Parameters[0]): Promise<`0x${string}`> => + account.signTypedData(params), }; web3Signer = Signer.fromWeb3(eip712Adapter); }); diff --git a/tsconfig.json b/tsconfig.json index 4a7e2e4..435b128 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,10 +21,9 @@ "noImplicitReturns": true, "isolatedModules": true, - "baseUrl": ".", "paths": { - "#/*": ["src/*"], - "#tests/*": ["tests/*"] + "#/*": ["./src/*"], + "#tests/*": ["./tests/*"] } }, "include": ["./src/**/*.ts", "./tests/**/*.ts"]