diff --git a/.changeset/router-bench-audit-and-isolation.md b/.changeset/router-bench-audit-and-isolation.md
new file mode 100644
index 0000000..d05254f
--- /dev/null
+++ b/.changeset/router-bench-audit-and-isolation.md
@@ -0,0 +1,83 @@
+---
+"@zipbul/router": patch
+---
+
+Bench audit, lint/format tooling setup, router lint compliance, circular-dep removal. **No published API change** — `dist/` is unaffected; consumers see no behavioral difference.
+
+## Part 1 — Bench audit & harness fixes (line-by-line + Codex/Explore second-opinion)
+
+### Measurement correctness (output was lying)
+
+- `router.bench.ts`: removed non-existent `enableCache`, `ignoreTrailingSlash`, `caseSensitive` options (silently ignored by `RouterOptions`). The cache-hit vs no-cache and case-insensitive benches were measuring nothing of the kind; sections deleted. `fullOptionsRouter` now uses the real options (`trailingSlash: 'ignore'`, `pathCaseSensitive: false`). Static-match 10/100/500/1000 collapsed to a single hash-bucket bench (all four are O(1) static-bucket lookups; the four-row scaling was misleading).
+- `100k-verification.ts`: `100k churn` scenario removed — hit/miss paths were fixed strings, defeating the advertised "unique-path churn" intent. Real churn measurement already lives in `cacheTraversalFeasibility()`. `100k-gate-runner.ts` scenarios list updated.
+- `complex-shapes.bench.ts`: `regex` shape now skips memoirist with `regex: null` (was registering a tester-less variant under the "regex (testers)" label — apples-to-oranges vs zipbul). Label corrected from "2 testers" to "3 testers".
+- `comparison.bench.ts`: `miss` scenario's `wrongMethod` axis now hits a registered path; the previous unregistered path collapsed wrong-method into the plain miss axis.
+- `regression-snapshot.ts`: `p99NsPerOp` JSON field renamed to `maxNsPerOp`. With TRIALS=11 the nearest-rank p99 index lands on the max sample.
+
+### Statistical honesty
+
+- `helpers.ts` `percentile()`: docstring warns small-N inputs collapse p75/p99 to max. `100k-gate-runner.ts`, `100k-external-baselines.ts`: `buildP75/P99` collapsed to `buildMax`. `100k-bun-serve-baseline.ts`: `warmedP99` removed.
+- `first-call-latency.ts`: replaced local `Math.floor(n*0.99)` with shared `percentile()`.
+
+### Methodology consistency
+
+- `100k-external-baselines.ts`: `find-my-way` adapter uses `{ ignoreTrailingSlash: true }` matching `100k-external-correctness.ts`. `settleScavenger()` called before `mem()` baseline.
+- `100k-verification.ts`: removed `candidateMicrobench()` and `tryUrlPatternBaseline()` (didn't measure zipbul Router).
+
+### Cross-router fairness — full pair isolation
+
+- `comparison.bench.ts`: 7 adapters × 7 scenarios = **49 fresh-process pairs**. Worker takes `argv = [adapter, scenarioLabel]`. Sanity-gate failures print structured reasons.
+- `complex-shapes.bench.ts`: 3 routers × 11 shapes = **33 fresh-process pairs** with per-shape build functions (no JIT pollution from sibling shapes). Unsupported pairs print `skip=true reason=unsupported`.
+
+### Dead-code purge
+
+- Deleted `bench/comparison-solo.bench.ts`, `bench/baseline/percent-gate.bench.txt`.
+- Removed unused `supports` field, `skipFor` parameter in `100k-external-correctness.ts`.
+- Removed unused devDependencies `@hattip/router` and `itty-router` (referenced only by since-deleted benches).
+
+### Walker-fallback bench note
+
+`walker-fallbacks.bench.ts`: header note that the three benches measure each walker on the workload that triggers its selection — route counts and match paths differ, so the timings are per-walker sanity numbers, not cross-walker comparisons.
+
+## Part 2 — Lint/format/dead-code tooling (toolkit-wide)
+
+Copied from `zipbul/` sibling repo for consistency with the broader Zipbul ecosystem standards. All configs at toolkit root (`.oxlintrc.jsonc`, `.oxfmtrc.jsonc`, `knip.json`). Root `package.json` scripts: `typecheck`, `lint`, `format`, `format:check`, `knip`, `dpdm`. devDependencies pinned to versions matching the sibling repo (`oxlint@^1.41.0`, `oxlint-tsgolint@^0.11.1`, `oxfmt@^0.26.0`, `knip@^5.63.1`, `dpdm@^4.2.0`).
+
+### tsconfig stricter (`toolkit/tsconfig.json`)
+
+`noUnusedLocals`, `noUnusedParameters`, `noPropertyAccessFromIndexSignature` all enabled (was `false`). Router passes cleanly.
+
+### Sensible overrides (`.oxlintrc.jsonc`)
+
+- `packages/router/bench/**/*.ts`: `no-explicit-any`, `no-loop-func`, `import/no-dynamic-require`, `default-case` off. Adapter testing against 7 external routers with disparate return shapes requires loose typing; per-shape `Shape` union switches use exhaustive type-narrowing that TypeScript verifies.
+- `**/*.spec.ts`/`**/*.test.ts`: `no-explicit-any` off (intentional `any` for type-error coverage); `jest/no-conditional-in-test` off (Result-type narrowing `if (err.data.kind === 'X')` is legitimate TypeScript narrowing, not a test antipattern).
+
+### Router exports-last refactor (12 files)
+
+All `export function`/`export interface`/`export class` declarations moved to a single bottom `export { ... }` / `export type { ... }` block per file. Files touched: `pattern-tester.ts`, `path-policy.ts`, `wildcard-method-expand.ts`, `emitter.ts`, `prefix-factor.ts`, `factor-detect.ts`, `path-parser.ts`, `route-expand.ts`, `wildcard-prefix-index.ts`, `router.ts`, `pipeline/registration.ts`, `codegen/segment-compile.ts`, `tree/segment-tree.ts`.
+
+### Circular dependency removal
+
+Extracted `SegmentNode` + `ParamSegment` interfaces from `src/tree/segment-tree.ts` into a new `src/tree/node-types.ts`. `segment-tree.ts` now imports the types from `./node-types` and re-exports them; `undo.ts` also imports from `./node-types`. Eliminates the type-only `segment-tree → undo → segment-tree` cycle that `dpdm` flagged.
+
+### Test/spec import dedup
+
+- `src/builder/path-parser.spec.ts`, `src/builder/route-expand.spec.ts`, `src/router.spec.ts`: merged duplicate inline imports (one at top, one mid-file) into single top imports — fixes `import/no-duplicates` and `import/first`.
+
+### Format pass
+
+`oxfmt` applied to every `.ts`, `.md`, `.json` in the monorepo. 204 files reformatted (printWidth 130, trailingComma all, sorted package.json scripts, sorted imports per group).
+
+## Verification
+
+- `bunx tsc --noEmit -p packages/router/tsconfig.json` — 0 errors.
+- `bun test` (router-scoped) — 999 pass / 0 fail / 9533 expects.
+- `bunx oxlint packages/router` — 0 warnings / 0 errors.
+- `bunx dpdm packages/router/src/**/*.ts packages/router/index.ts` — no circular dependencies.
+- Bench worker smoke runs confirmed for `comparison.bench.ts`, `complex-shapes.bench.ts`, `cache-cardinality.bench.ts`, `walker-fallbacks.bench.ts`, `first-call-latency.ts`, `regression-snapshot.ts`, `router.bench.ts`, `100k-verification.ts`, `100k-external-correctness.ts`. `100k-gate-runner.ts` regex parser still matches `100k-verification.ts` output format.
+
+## Known follow-ups (out of router scope)
+
+- `cors`, `multipart`, `rate-limiter`, `result`, `query-parser` still have lint violations (53 errors total across those packages). Pre-existing; not addressed in this PR. Tracking separately.
+- `knip` reports ~11 router exports + 9 router types as unused outside their own file. Most are internal helpers (`flushStaticBuffer`, `emitParamBranch`, etc.) — safe to delete or keep as internal-API surface. Decided not to remove now to avoid scope creep.
+- Pre-existing stale `dist/` artifacts in `packages/result` and `packages/shared` cause 26 cross-package test failures when running `bun test` from monorepo root. Unrelated; tracked separately.
diff --git a/.changeset/router-build-fix-and-match-correctness.md b/.changeset/router-build-fix-and-match-correctness.md
new file mode 100644
index 0000000..7c25692
--- /dev/null
+++ b/.changeset/router-build-fix-and-match-correctness.md
@@ -0,0 +1,24 @@
+---
+"@zipbul/router": minor
+---
+
+Fix a broken published build and several match-time correctness defects.
+
+## Build
+
+- **Fixed a broken build configuration.** The `bun build --packages external` + `sideEffects: false` combination triggered a Bun bundler bug (oven-sh/bun#18008) that emitted an 84-byte stub re-exporting undeclared identifiers — the produced `dist` could not be imported. The build now uses `bunup` (Bun-native library bundler), emitting a working ESM bundle, a `.d.ts`, and a linked source map. `sideEffects: false` was removed (it provides no benefit for a server-side library and was the bug trigger).
+
+## Match-time correctness
+
+- **`:param` immediately followed by a `*name` star wildcard now matches an empty tail.** `/:p/*rest` against `/x` now returns `{ p: 'x', rest: '' }` (previously `null`). The compiled match function diverged from the reference walkers on this shape.
+- **Case-insensitive matching (`pathCaseSensitive: false`) no longer mutates captured values.** Case-folding now applies to route selection only; captured `:param` and `*wildcard` values keep their original case (e.g. `/Users/:id` + `/USERS/AbC` → `{ id: 'AbC' }`, previously `'abc'`). Folding is now ASCII-only (length-preserving) instead of `String.toLowerCase()`: a captured value containing a length-changing non-ASCII char (e.g. `İ`, whose `toLowerCase()` is two code units) no longer corrupts the capture offsets (`/:id/x` + `/İ/x` → `{ id: 'İ' }`, previously `{ id: 'İ/' }`). Since URL paths are ASCII (RFC 3986; non-ASCII arrives percent-encoded), ASCII folding is complete.
+- **Case-insensitive hit cache no longer serves stale captures.** The dynamic-match cache was keyed on the case-folded path, so two case-variant inputs (`/u/AbC`, `/u/aBc`) collapsed to one entry and the second returned the first's captured value. The cache is now keyed on the non-folded (but still trailing-slash-trimmed) path, so each case-variant keeps its own capture while same-path and trailing-slash-variant inputs still cache-hit.
+- **Regex param fast-path no longer over-matches.** `:id(\w+)` (and `\w{1,}`) now correctly rejects hyphens, matching the actual `\w` semantics.
+- **Optional + regex params are now supported.** `:id(\d+)?` builds and matches (`/x/42` → `{ id: '42' }`, `/x` absent, `/x/abc` no match); previously rejected with a misleading `path-query` error.
+- **Non-ASCII HTTP method tokens are now rejected** with `method-invalid-token` (RFC 7230/9110 token grammar is ASCII-only); previously accepted.
+- **A raw `?` in a non-param segment is now rejected** (`/a?` → `path-query`); the `?` optional decorator is accepted only on param segments.
+
+## Internal
+
+- Removed dead code: the unused `OptionalParamDefaults` class, `MethodRegistry.get()`/`size`, and the unreachable nullable-value path in the hit cache.
+- Per-route build rollback now restores `maxParamsObserved`.
diff --git a/.changeset/router-options-enum-to-boolean.md b/.changeset/router-options-enum-to-boolean.md
new file mode 100644
index 0000000..e290615
--- /dev/null
+++ b/.changeset/router-options-enum-to-boolean.md
@@ -0,0 +1,47 @@
+---
+"@zipbul/router": major
+---
+
+BREAKING: collapse two 2-state public enums into booleans on `RouterOptions`.
+
+The `TrailingSlash` and `OptionalParamBehavior` enums each had only two
+members. They were boolean choices dressed up as enums — the internal
+pipeline already converted both to booleans before consuming them
+(`router.ts:95`, `build.ts:106`). Replacing the enums with booleans
+removes ceremony from every call site without changing runtime behavior.
+
+### Migration
+
+```ts
+// Before
+import { Router, TrailingSlash, OptionalParamBehavior } from '@zipbul/router';
+new Router({
+ trailingSlash: TrailingSlash.Strict,
+ optionalParamBehavior: OptionalParamBehavior.SetUndefined,
+});
+
+// After
+import { Router } from '@zipbul/router';
+new Router({
+ ignoreTrailingSlash: false,
+ omitMissingOptional: false,
+});
+```
+
+| Old | New |
+| :----------------------------------------------------------- | :----------------------------- |
+| `{ trailingSlash: TrailingSlash.Strict }` | `{ ignoreTrailingSlash: false }` |
+| `{ trailingSlash: TrailingSlash.Ignore }` (default) | `{ ignoreTrailingSlash: true }` (or omit) |
+| `{ optionalParamBehavior: OptionalParamBehavior.Omit }` (default) | `{ omitMissingOptional: true }` (or omit) |
+| `{ optionalParamBehavior: OptionalParamBehavior.SetUndefined }` | `{ omitMissingOptional: false }` |
+
+Defaults are unchanged: trailing slash is ignored by default; missing
+optional parameters are omitted from `params` by default.
+
+### Public export surface
+
+The two enum names are removed from the public exports. Remaining
+exports: `Router`, `RouterError`, `MatchSource`, `RouterErrorKind`.
+`MatchSource` (3 members) and `RouterErrorKind` (21 members) remain
+enums — both have enough cardinality that the enum form carries
+meaningful information.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6cfb3dc..7603fe9 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,7 +15,7 @@ jobs:
- uses: oven-sh/setup-bun@v2
with:
- bun-version: "1.3.9"
+ bun-version: '1.3.9'
- run: bun install --frozen-lockfile
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9d37fa0..6e864ec 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -22,12 +22,12 @@ jobs:
- uses: oven-sh/setup-bun@v2
with:
- bun-version: "1.3.9"
+ bun-version: '1.3.9'
- uses: actions/setup-node@v4
with:
- node-version: "24"
- registry-url: "https://registry.npmjs.org"
+ node-version: '24'
+ registry-url: 'https://registry.npmjs.org'
- run: bun install --frozen-lockfile
@@ -65,7 +65,7 @@ jobs:
with:
publish: bun run scripts/publish.ts
version: bunx changeset version
- title: "chore: version packages"
- commit: "chore: version packages"
+ title: 'chore: version packages'
+ commit: 'chore: version packages'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index e5825ec..1d6d673 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,5 @@ dist
# code coverage
coverage
*.lcov
+
+.claude/scheduled_tasks.lock
diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc
new file mode 100644
index 0000000..f3b7506
--- /dev/null
+++ b/.oxfmtrc.jsonc
@@ -0,0 +1,43 @@
+{
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
+
+ // Prettier-compatible core options
+ "printWidth": 130,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": true,
+ "singleQuote": true,
+ "jsxSingleQuote": false,
+ "quoteProps": "as-needed",
+ "trailingComma": "all",
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "avoid",
+ "proseWrap": "preserve",
+ "embeddedLanguageFormatting": "auto",
+ "endOfLine": "lf",
+ "insertFinalNewline": true,
+ "ignorePatterns": [],
+ "experimentalSortPackageJson": {
+ "sortScripts": true,
+ },
+ "experimentalSortImports": {
+ "customGroups": [],
+ "groups": [
+ "type-import",
+ ["value-builtin", "value-external"],
+ "type-internal",
+ "value-internal",
+ ["type-parent", "type-sibling", "type-index"],
+ ["value-parent", "value-sibling", "value-index"],
+ "unknown",
+ ],
+ "ignoreCase": true,
+ "internalPattern": ["~/", "@/"],
+ "newlinesBetween": true,
+ "order": "asc",
+ "partitionByComment": false,
+ "partitionByNewline": false,
+ "sortSideEffects": false,
+ },
+}
diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc
new file mode 100644
index 0000000..bc0b1bb
--- /dev/null
+++ b/.oxlintrc.jsonc
@@ -0,0 +1,273 @@
+{
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
+ "plugins": ["unicorn", "typescript", "oxc", "import", "promise", "node", "jsdoc", "jest"],
+ "rules": {
+ "unicorn/no-new-array": "off",
+ "unicorn/no-null": "off",
+ "unicorn/no-useless-undefined": "off",
+ "constructor-super": "error",
+ "for-direction": "error",
+ "no-async-promise-executor": "error",
+ "no-caller": "error",
+ "no-class-assign": "error",
+ "no-compare-neg-zero": "error",
+ "no-cond-assign": "error",
+ "no-const-assign": "error",
+ "no-constant-binary-expression": "error",
+ "no-constant-condition": "error",
+ "no-control-regex": "error",
+ "no-debugger": "error",
+ "no-delete-var": "error",
+ "no-dupe-class-members": "error",
+ "no-dupe-else-if": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-empty-pattern": "error",
+ "no-ex-assign": "error",
+ "no-extra-boolean-cast": "error",
+ "no-func-assign": "error",
+ "no-global-assign": "error",
+ "no-import-assign": "error",
+ "no-invalid-regexp": "error",
+ "no-irregular-whitespace": "error",
+ "no-loss-of-precision": "error",
+ "no-new-native-nonconstructor": "error",
+ "no-obj-calls": "error",
+ "no-self-assign": "error",
+ "no-setter-return": "error",
+ "no-sparse-arrays": "error",
+ "no-this-before-super": "error",
+ "no-unsafe-finally": "error",
+ "no-unsafe-negation": "error",
+ "no-unsafe-optional-chaining": "error",
+ "no-useless-backreference": "error",
+ "no-useless-catch": "error",
+ "no-useless-escape": "error",
+ "no-useless-rename": "error",
+ "no-with": "error",
+ "no-empty": [
+ "error",
+ {
+ "allowEmptyCatch": true,
+ },
+ ],
+ "curly": "error",
+ "no-else-return": "error",
+ "no-unneeded-ternary": "error",
+ "default-case": "error",
+ "default-case-last": "error",
+ "default-param-last": "error",
+ "no-self-compare": "error",
+ "no-loop-func": "error",
+ "typescript/no-empty-object-type": [
+ "error",
+ {
+ "allowInterfaces": "always",
+ },
+ ],
+ "typescript/await-thenable": "error",
+ "typescript/no-array-delete": "error",
+ "typescript/no-base-to-string": "error",
+ "typescript/no-confusing-void-expression": "error",
+ "typescript/no-deprecated": "error",
+ "typescript/no-duplicate-type-constituents": "error",
+ "typescript/no-floating-promises": "error",
+ "typescript/no-for-in-array": "error",
+ "typescript/no-meaningless-void-operator": "error",
+ "typescript/no-misused-promises": "error",
+ "typescript/no-misused-spread": "error",
+ "typescript/no-mixed-enums": "error",
+ "typescript/no-redundant-type-constituents": "error",
+ "typescript/no-unnecessary-boolean-literal-compare": "error",
+ "typescript/no-unnecessary-template-expression": "error",
+ "typescript/no-unnecessary-type-arguments": "error",
+ "typescript/no-unnecessary-type-assertion": "error",
+ "typescript/no-implied-eval": "error",
+ "typescript/no-explicit-any": "error",
+ "typescript/switch-exhaustiveness-check": "error",
+ "typescript/strict-boolean-expressions": "error",
+ "typescript/no-unsafe-argument": "error",
+ "typescript/no-unsafe-assignment": "error",
+ "typescript/no-unsafe-call": "error",
+ "typescript/no-unsafe-enum-comparison": "error",
+ "typescript/no-unsafe-member-access": "error",
+ "typescript/no-unsafe-return": "error",
+ "typescript/no-unsafe-type-assertion": "error",
+ "typescript/no-unsafe-unary-minus": "error",
+ "typescript/non-nullable-type-assertion-style": "error",
+ "typescript/only-throw-error": "error",
+ "typescript/prefer-includes": "error",
+ "typescript/prefer-nullish-coalescing": "error",
+ "typescript/prefer-optional-chain": "error",
+ "typescript/prefer-promise-reject-errors": "error",
+ "typescript/prefer-reduce-type-parameter": "error",
+ "typescript/prefer-return-this-type": "error",
+ "typescript/promise-function-async": "error",
+ "typescript/related-getter-setter-pairs": "error",
+ "typescript/require-array-sort-compare": "error",
+ "typescript/require-await": "error",
+ "typescript/restrict-plus-operands": "error",
+ "typescript/restrict-template-expressions": "error",
+ "typescript/return-await": "error",
+ "typescript/unbound-method": "error",
+ "typescript/use-unknown-in-catch-callback-variable": "off",
+ "no-unused-vars": [
+ "error",
+ {
+ "args": "all",
+ "argsIgnorePattern": "^_",
+ "caughtErrors": "all",
+ "caughtErrorsIgnorePattern": "^_",
+ "destructuredArrayIgnorePattern": "^_",
+ "varsIgnorePattern": "^_",
+ "ignoreRestSiblings": true,
+ },
+ ],
+ "promise/catch-or-return": "error",
+ "promise/always-return": "error",
+ "promise/no-return-in-finally": "error",
+ "promise/no-nesting": "error",
+ "promise/no-multiple-resolved": "error",
+ "promise/prefer-catch": "error",
+ "promise/prefer-await-to-then": "error",
+ "promise/valid-params": "error",
+ "promise/no-callback-in-promise": "error",
+ "import/no-cycle": "error",
+ "import/no-commonjs": "error",
+ "import/no-amd": "error",
+ "import/no-dynamic-require": "error",
+ "import/no-default-export": "error",
+ "import/first": "error",
+ "import/exports-last": "error",
+ "import/no-duplicates": "error",
+ "import/no-self-import": "error",
+ "import/no-unassigned-import": "error",
+ "oxc/missing-throw": "error",
+ "oxc/number-arg-out-of-range": "error",
+ "oxc/uninvoked-array-callback": "error",
+ "oxc/no-accumulating-spread": "error",
+ "oxc/no-map-spread": "error",
+ "unicorn/no-unnecessary-await": "error",
+ "unicorn/no-useless-spread": "error",
+ "unicorn/prefer-array-find": "error",
+ "unicorn/prefer-set-has": "error",
+ "unicorn/prefer-set-size": "error",
+ "no-eval": "error",
+ "no-restricted-globals": ["error", "Reflect", "Proxy"],
+ "no-restricted-imports": [
+ "error",
+ {
+ "paths": [
+ {
+ "name": "node:module",
+ "importNames": ["createRequire"],
+ "message": "Do not import createRequire; avoid require()-based loading.",
+ },
+ {
+ "name": "module",
+ "importNames": ["createRequire"],
+ "message": "Do not import createRequire; avoid require()-based loading.",
+ },
+ ],
+ },
+ ],
+ },
+ "overrides": [
+ {
+ // Bench harness interfaces with 7 external routers whose APIs use
+ // disparate return shapes; the orchestrator/worker split loops over
+ // adapter records by design. Allowing these patterns here keeps
+ // bench code minimal without leaking looseness into src/.
+ "files": ["packages/router/bench/**/*.ts"],
+ "rules": {
+ "typescript/no-explicit-any": "off",
+ "eslint/no-loop-func": "off",
+ "import/no-dynamic-require": "off",
+ // Exhaustive Shape/RouterKind unions in per-shape build functions;
+ // TypeScript proves exhaustiveness at compile time, default-case
+ // would be unreachable dead code.
+ "default-case": "off",
+ },
+ },
+ {
+ "files": ["**/*.spec.ts", "**/*.test.ts", "**/*.e2e.test.ts"],
+ "rules": {
+ "jest/consistent-test-it": "error",
+ "jest/expect-expect": "error",
+ "jest/max-expects": "error",
+ "jest/max-nested-describe": "error",
+ "jest/no-commented-out-tests": "error",
+ "jest/no-conditional-expect": "error",
+ // Result-type narrowing patterns (`if (err.data.kind === 'X') { expect(...) }`)
+ // are legitimate TypeScript narrowing, not test antipatterns. The expect()
+ // on the discriminant precedes the if; the if exists for the type system.
+ "jest/no-conditional-in-test": "off",
+ "jest/no-confusing-set-timeout": "error",
+ "jest/no-disabled-tests": "error",
+ "jest/no-focused-tests": "error",
+ "jest/no-done-callback": "error",
+ "jest/no-duplicate-hooks": "error",
+ "jest/no-identical-title": "error",
+ "jest/no-export": "error",
+ "jest/no-standalone-expect": "error",
+ "jest/no-test-prefixes": "error",
+ "jest/no-test-return-statement": "error",
+ "jest/padding-around-test-blocks": "error",
+ "jest/require-top-level-describe": "error",
+ "jest/valid-describe-callback": "error",
+ "jest/valid-expect": "error",
+ "jest/valid-title": "error",
+ // Test files frequently use `any` for deliberate type-error coverage.
+ "typescript/no-explicit-any": "off",
+ },
+ },
+ ],
+ "settings": {
+ "jsx-a11y": {
+ "polymorphicPropName": null,
+ "components": {},
+ "attributes": {},
+ },
+ "import/resolver": {
+ "typescript": {
+ "bun": true,
+ },
+ },
+ "next": {
+ "rootDir": [],
+ },
+ "react": {
+ "formComponents": [],
+ "linkComponents": [],
+ "version": null,
+ },
+ "jsdoc": {
+ "ignorePrivate": false,
+ "ignoreInternal": false,
+ "ignoreReplacesDocs": true,
+ "overrideReplacesDocs": true,
+ "augmentsExtendsReplacesDocs": false,
+ "implementsReplacesDocs": false,
+ "exemptDestructuredRootsFromChecks": false,
+ "tagNamePreference": {},
+ },
+ "vitest": {
+ "typecheck": false,
+ },
+ },
+ "env": {
+ "builtin": true,
+ },
+ "globals": {},
+ "ignorePatterns": [
+ "node_modules",
+ "**/node_modules/**",
+ "**/*.d.ts",
+ ".zipbul",
+ "**/.zipbul/**",
+ "dist",
+ "**/dist/**",
+ ".dependency-cruiser.cjs",
+ "commitlint.config.cjs",
+ ],
+}
diff --git a/.vscode/mcp.json b/.vscode/mcp.json
index 6a67605..e828674 100644
--- a/.vscode/mcp.json
+++ b/.vscode/mcp.json
@@ -2,10 +2,7 @@
"servers": {
"sequential-thinking": {
"command": "bunx",
- "args": [
- "-y",
- "@modelcontextprotocol/server-sequential-thinking"
- ]
+ "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
}
}
}
diff --git a/README.md b/README.md
index 0b22198..4638316 100644
--- a/README.md
+++ b/README.md
@@ -9,17 +9,17 @@ Each package solves one problem, returns a plain value, and stays out of your wa
## 📦 Packages
-| Package | Description | Version | Coverage |
-|:--------|:------------|:--------|:---------|
-| [@zipbul/shared](packages/shared) | Type-safe HTTP enums and constants | [](https://www.npmjs.com/package/@zipbul/shared) | — |
-| [@zipbul/result](packages/result) | Error handling without exceptions | [](https://www.npmjs.com/package/@zipbul/result) |  |
-| [@zipbul/cors](packages/cors) | Framework-agnostic CORS handling | [](https://www.npmjs.com/package/@zipbul/cors) |  |
+| Package | Description | Version | Coverage |
+| :-------------------------------------------- | :------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| [@zipbul/shared](packages/shared) | Type-safe HTTP enums and constants | [](https://www.npmjs.com/package/@zipbul/shared) | — |
+| [@zipbul/result](packages/result) | Error handling without exceptions | [](https://www.npmjs.com/package/@zipbul/result) |  |
+| [@zipbul/cors](packages/cors) | Framework-agnostic CORS handling | [](https://www.npmjs.com/package/@zipbul/cors) |  |
| [@zipbul/query-parser](packages/query-parser) | RFC 3986 compliant query string parser | [](https://www.npmjs.com/package/@zipbul/query-parser) |  |
-| [@zipbul/rate-limiter](packages/rate-limiter) | Rate limiter with multiple algorithms | [](https://www.npmjs.com/package/@zipbul/rate-limiter) |  |
-| [@zipbul/router](packages/router) | High-performance radix-tree URL router | [](https://www.npmjs.com/package/@zipbul/router) |  |
+| [@zipbul/rate-limiter](packages/rate-limiter) | Rate limiter with multiple algorithms | [](https://www.npmjs.com/package/@zipbul/rate-limiter) |  |
+| [@zipbul/router](packages/router) | High-performance radix-tree URL router | [](https://www.npmjs.com/package/@zipbul/router) |  |
-## License
+## License
[MIT](LICENSE)
diff --git a/bun.lock b/bun.lock
index 216ce48..d7997e0 100644
--- a/bun.lock
+++ b/bun.lock
@@ -3,11 +3,16 @@
"configVersion": 1,
"workspaces": {
"": {
- "name": "bunner-pantry",
+ "name": "@zipbul/toolkit",
"devDependencies": {
"@changesets/cli": "^2.29.8",
"@types/bun": "latest",
+ "dpdm": "^4.2.0",
"fast-check": "^4.5.3",
+ "knip": "^6.14.1",
+ "oxfmt": "^0.50.0",
+ "oxlint": "^1.65.0",
+ "oxlint-tsgolint": "^0.22.1",
},
"peerDependencies": {
"typescript": "^5",
@@ -95,17 +100,25 @@
"version": "0.2.3",
"dependencies": {
"@zipbul/result": "workspace:*",
- "@zipbul/shared": "workspace:*",
},
"devDependencies": {
+ "@stryker-mutator/core": "^9.6.1",
"@types/bun": "latest",
+ "@zipbul/shared": "workspace:*",
+ "bunup": "^0.16.31",
+ "dpdm": "^4.2.0",
"fast-check": "^3.0.0",
"find-my-way": "^9.5.0",
"hono": "^4.12.3",
+ "knip": "^6.14.1",
"koa-tree-router": "^0.13.1",
"memoirist": "^0.4.0",
"mitata": "^1.0.34",
+ "oxfmt": "^0.51.0",
+ "oxlint": "^1.66.0",
+ "radix3": "^1.1.2",
"rou3": "^0.7.12",
+ "typescript": "^5",
},
},
"packages/shared": {
@@ -114,23 +127,91 @@
},
},
"packages": {
- "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
+ "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+
+ "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
+
+ "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
+
+ "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="],
+
+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw=="],
+
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
+
+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/helper-replace-supers": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg=="],
+
+ "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
+
+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg=="],
+
+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
+
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
+
+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong=="],
+
+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="],
+
+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.29.7", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ=="],
+
+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
+
+ "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
+
+ "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@7.29.7", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/plugin-syntax-decorators": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg=="],
- "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.14", "", { "dependencies": { "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA=="],
+ "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg=="],
- "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
+ "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="],
+
+ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA=="],
+
+ "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg=="],
+
+ "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/plugin-transform-destructuring": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw=="],
+
+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.29.7", "", { "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ=="],
+
+ "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/plugin-syntax-typescript": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw=="],
+
+ "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="],
+
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
+
+ "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="],
+
+ "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@bunup/dts": ["@bunup/dts@0.14.53", "", { "dependencies": { "@babel/parser": "^7.28.6", "coffi": "^0.1.37", "oxc-minify": "^0.93.0", "oxc-resolver": "^11.16.2", "oxc-transform": "^0.93.0", "picocolors": "^1.1.1", "std-env": "^3.10.0", "ts-import-resolver": "^0.1.23" }, "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-qyHgYEYxcghoChICEhuFKfA/EqqRA9WHOHLXcIkR9c70DgLAEXcOlkYhfBPmGxfMKJYL0X4VtQwst0/AMk9D3g=="],
+
+ "@bunup/shared": ["@bunup/shared@0.16.28", "", { "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-6xyJB5/OFYf0tLCQSRL+PrgzYlS0KabysM06cBY0Ijuk1tr5Aak8/NqzE6ifu+s6K0mstnGXQ+6DqtNlOMEazw=="],
+
+ "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.1", "", { "dependencies": { "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA=="],
+
+ "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.10", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A=="],
"@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="],
- "@changesets/cli": ["@changesets/cli@2.29.8", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA=="],
+ "@changesets/cli": ["@changesets/cli@2.31.0", "", { "dependencies": { "@changesets/apply-release-plan": "^7.1.1", "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg=="],
- "@changesets/config": ["@changesets/config@3.1.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog=="],
+ "@changesets/config": ["@changesets/config@3.1.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q=="],
"@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="],
- "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="],
+ "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.4", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg=="],
- "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.14", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g=="],
+ "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.16", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.10", "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g=="],
"@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="],
@@ -138,11 +219,11 @@
"@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="],
- "@changesets/parse": ["@changesets/parse@0.4.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA=="],
+ "@changesets/parse": ["@changesets/parse@0.4.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A=="],
"@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="],
- "@changesets/read": ["@changesets/read@0.6.6", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg=="],
+ "@changesets/read": ["@changesets/read@0.6.7", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA=="],
"@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="],
@@ -150,25 +231,317 @@
"@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="],
+ "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+
+ "@inquirer/ansi": ["@inquirer/ansi@2.0.5", "", {}, "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw=="],
+
+ "@inquirer/checkbox": ["@inquirer/checkbox@5.1.5", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/core": "^11.1.10", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Jmf9tgBHIEK5SAOB7swYfStqmtkZb00xOTpSQmkoGEpdxOTpJi9RS0A8bkfDPHTTItZRJrRdZrEMu25wyj0VfQ=="],
+
+ "@inquirer/confirm": ["@inquirer/confirm@6.0.13", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-wkGPC7yJ5WJk1DJ5SX7fzk+gfj4BM8cf5dDDi71B/551xHrdsZVRJOC0WyikXd0pEsb/9cLniuE4atbsMqmFkw=="],
+
+ "@inquirer/core": ["@inquirer/core@11.1.10", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A=="],
+
+ "@inquirer/editor": ["@inquirer/editor@5.1.2", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/external-editor": "^3.0.0", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Y3Nor7S/DhIPo+8Ym/dSY4efwKI4BsflKDwXh0jNeXJsSF3dteS/3Yf+z4wkibVZDvYMyCgknSTQlNahfunGHg=="],
+
+ "@inquirer/expand": ["@inquirer/expand@5.0.14", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-qyY9zcIX2eKYwaAUiQo9zORd61Lc3sXeM72fVbeHkYnDkqfr8/armcRbmVAIrExeJhI2puk+uomeKtWrpUVUmQ=="],
+
"@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
+ "@inquirer/figures": ["@inquirer/figures@2.0.5", "", {}, "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ=="],
+
+ "@inquirer/input": ["@inquirer/input@5.0.13", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-0l0jCHlJnXIV8CTxwQC0C+5Ziq8WP22edWgmciW2xYvoeoSck4v5FvCS1ctKdqLLR0dUo93uAHgWHywgBSoRyw=="],
+
+ "@inquirer/number": ["@inquirer/number@4.0.13", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-WHmkYnnJAou5gx7RgcvAfUggnHNM1zWfoh0dFPl3dxVssuqt+dK5rIbaOYQXNyOegvFnopbKupjnhw2O8gANNg=="],
+
+ "@inquirer/password": ["@inquirer/password@5.0.13", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-XDGu64ROHZjOOXLAANvJN7iIxWKhOSCG5VakrZ5kaScVR+snVJCFglD/hL3/677awtWcu4pXoWa280CDIYcBeg=="],
+
+ "@inquirer/prompts": ["@inquirer/prompts@8.4.3", "", { "dependencies": { "@inquirer/checkbox": "^5.1.5", "@inquirer/confirm": "^6.0.13", "@inquirer/editor": "^5.1.2", "@inquirer/expand": "^5.0.14", "@inquirer/input": "^5.0.13", "@inquirer/number": "^4.0.13", "@inquirer/password": "^5.0.13", "@inquirer/rawlist": "^5.2.9", "@inquirer/search": "^4.1.9", "@inquirer/select": "^5.1.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ai5LseTw9HhegupIgmo4cn7RpnCGznjjXu4OI+7jMR8vu7T1ZCCNMzFFAovUCjL1fl0cceksIN1++yQE59SmZw=="],
+
+ "@inquirer/rawlist": ["@inquirer/rawlist@5.2.9", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-a1ErXEfgjfPYpyQ89dp+7n2IISjH9oQg3ygvF5adz8B7aHn4n2PjEgu1wpVTp69K3bj3lVLxP0qJ2b1clk1Whw=="],
+
+ "@inquirer/search": ["@inquirer/search@4.1.9", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZlbM28Q9lmLkFPNAIv+ZuY530n5Km8U1WW48oYEvDhe9yc2uL3m3t+JSdRUkQlk5fuIuskgiIVjcb7czFzQpuA=="],
+
+ "@inquirer/select": ["@inquirer/select@5.1.5", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/core": "^11.1.10", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-6SRg6kHfK/sjLXOsuqNebuir+sjwrf/iWuRUnXgB2slzEewppI1WfzeS16XxDcOQmXBruMmmB9Cgrz7wsAxqMg=="],
+
+ "@inquirer/type": ["@inquirer/type@4.0.5", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q=="],
+
"@ioredis/commands": ["@ioredis/commands@1.5.1", "", {}, "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw=="],
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
"@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="],
"@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="],
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
+
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+ "@oxc-minify/binding-android-arm64": ["@oxc-minify/binding-android-arm64@0.93.0", "", { "os": "android", "cpu": "arm64" }, "sha512-N3j/JoK4hXwQbnyOJoEltM8MEkddWV3XtfYimO6jsMjr5R6QdauKaSVeQHO/lSezB7SFkrMPqr6X7tBfghHiXA=="],
+
+ "@oxc-minify/binding-darwin-arm64": ["@oxc-minify/binding-darwin-arm64@0.93.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kLJJe7uBE+a9ql6eLGAtJ1g1LuEXi4aHbsiu342wGe+wRieSPi/Cx0aeDsQjdetwK5mqJWjWS2FO/n03jiw+IQ=="],
+
+ "@oxc-minify/binding-darwin-x64": ["@oxc-minify/binding-darwin-x64@0.93.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-0g6sVLaatgJpD28et/ykZCr5MHn7SWOblRCpXS47vcVmRyBFnUt21oiv3RqKacl1LKgk3czDHHribEfRyygiVw=="],
+
+ "@oxc-minify/binding-freebsd-x64": ["@oxc-minify/binding-freebsd-x64@0.93.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-h8HUtllzBHIx31Uxx1maxd7ur4lMi0qoz0OzoqiohZ1/Ty5GZDe3F/yd6mN4M913e4xrNlcGLFaN8tI9W+Fstw=="],
+
+ "@oxc-minify/binding-linux-arm-gnueabihf": ["@oxc-minify/binding-linux-arm-gnueabihf@0.93.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CIElV4OLqkt5PJtirJ1ZRNvKkELhPkDWZmYpiDRI43mQl6Hkt0YsoBAeFKqrwx3AfwAYWvbFjHII++S+Vvnc4A=="],
+
+ "@oxc-minify/binding-linux-arm-musleabihf": ["@oxc-minify/binding-linux-arm-musleabihf@0.93.0", "", { "os": "linux", "cpu": "arm" }, "sha512-AOvZfiwnNULzSHxtW0BO0VXrFzDDFcknLZzQLZF8z9i070un+0S2Q3oZtA13gx7Z7LFJ87+/gKmgSKjHUI1Mzg=="],
+
+ "@oxc-minify/binding-linux-arm64-gnu": ["@oxc-minify/binding-linux-arm64-gnu@0.93.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RNBTRvQ3XiVwoDU12y92HCwkznRb5N5ybGqC1Jt/eyWuRDI2838rzcoTrHQ/oke9/u4vHZ1lZwabR8z+VALE1g=="],
+
+ "@oxc-minify/binding-linux-arm64-musl": ["@oxc-minify/binding-linux-arm64-musl@0.93.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-qtE6qL7HC61rLKQBCvgsNJ9Bvvhe4U6V9VBPmvFw1SKRhoUp3PAzkWGnrvAgqQQnFaP34sUq/P4YmXmWL9m7bw=="],
+
+ "@oxc-minify/binding-linux-riscv64-gnu": ["@oxc-minify/binding-linux-riscv64-gnu@0.93.0", "", { "os": "linux", "cpu": "none" }, "sha512-2/8Y2lY8Klns2xrOufR26SR6Ci79NbOR89vuQJCjQwVS7Veb8Gk3lJWn6XRna2QxdvjMQ+6+kmW2/CajJED1rg=="],
+
+ "@oxc-minify/binding-linux-s390x-gnu": ["@oxc-minify/binding-linux-s390x-gnu@0.93.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-0TyiFgN1NPBQcKbdOh4VDt16kaFknKRXvmVshblEqp0JdwZeHFDCWVsTdpFH+NCbnUuzeY932IeP18dUnT/BVw=="],
+
+ "@oxc-minify/binding-linux-x64-gnu": ["@oxc-minify/binding-linux-x64-gnu@0.93.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2vc22dp1RtbfKUM3DbkOvEwGa11JsjAdLHXBAAAkNAqD/ux+ERwLscoP2O71I5jXMTbeHe6eDem6gldyiWr76Q=="],
+
+ "@oxc-minify/binding-linux-x64-musl": ["@oxc-minify/binding-linux-x64-musl@0.93.0", "", { "os": "linux", "cpu": "x64" }, "sha512-o7vVnDnF5k3xlgINjL7D2R9v47jczG5Jk+4xeZ+O9c9XxSx4jvGTqtBWf1Ka95fupJEm2QpSrO+wlA14exF3kA=="],
+
+ "@oxc-minify/binding-wasm32-wasi": ["@oxc-minify/binding-wasm32-wasi@0.93.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.5" }, "cpu": "none" }, "sha512-cW338ha926sD39uRDOrD/OMBgzosVtVPthXj1cl5rW9OQxuduXNqWbn/rJCA4X16T3IUcUnIbP2oCR8NI9D9xw=="],
+
+ "@oxc-minify/binding-win32-arm64-msvc": ["@oxc-minify/binding-win32-arm64-msvc@0.93.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-f/STdah7v3L6hZDcGUlk2NVcXtwlrzFUiQHI+TcE21uMzHItCEv34gkDtrAq04sAsDF+Aykuw3LnsWwg0pv7RA=="],
+
+ "@oxc-minify/binding-win32-x64-msvc": ["@oxc-minify/binding-win32-x64-msvc@0.93.0", "", { "os": "win32", "cpu": "x64" }, "sha512-FLnVjLRW3ifwHR6/87q/OQCukw+KTCR1SpcawwcykG0F62BQZjiwXpEHwNWgrV41M9Mdd52ND8/+HrMqcFlZMw=="],
+
+ "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.130.0", "", { "os": "android", "cpu": "arm" }, "sha512-h/xYU8/7ADWzVSf5I+YalLpj33LOy9CI/zgbJNIZ5eunRBG+Czqa3lZsvuPHHf3rOt6z1c5+UzoxjbAzAvhwVw=="],
+
+ "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.130.0", "", { "os": "android", "cpu": "arm64" }, "sha512-oFWFJrsGv9siFM4HjMqKNB7IuIZD/SMmZdCXl8xyx7lDplGvPKyewpOo272rSWgMXe2Wx7bWI0Yj+gkHv4qbeg=="],
+
+ "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.130.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sGUzupdTplK9jQg7eJZ878HfEgQjJNBc6dAYVWJ9W5aU+J8rLfRJhTVsKThiu1pNwm6Y1qKCcbC6WhNWSXR3Ig=="],
+
+ "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.130.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-PsB4cdCISbC00Uy8eiD8bc2AkGWjZqrSrJnkBFuG2ptrrf6mZ2F5gLFSjOAVMMgZPg8B1D7OydJwLWSfyI2Plg=="],
+
+ "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.130.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-DgABp3l38hS77JbXCV4qk1+n6DPym5u8zzwuweokezm2tX194nDSJDENbDRECxVsiNbprKATLbk+Z5wlHT0OHw=="],
+
+ "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.130.0", "", { "os": "linux", "cpu": "arm" }, "sha512-4Kn3CTEmwFrzhTSC/JuUW16qovmaMdX7jeSKbL8w0pLtLww7To1a2XJi9Z5uD8QWUkfUHhqfV+VD6dVzBnWzoA=="],
+
+ "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.130.0", "", { "os": "linux", "cpu": "arm" }, "sha512-D35KZM3F4rRu1uAFKyBlg3Gaf/ybCjyaPR1hfgvk5ex8NtcTmRgc0JgSighEyNg96TPrFhemFba68SZuxaha8w=="],
+
+ "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.130.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q9o7oVlo955KHwS8l1u0bCzIx+JsZUA3XToLXC+MsMhye/9LeBQbt84nh120cl2XLy+TEzvugYDiHShg5yaX6Q=="],
+
+ "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.130.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EiJ/gC0ljbcwVpycC8YWw6ggMbtsPX8XMOt0mPx0aqWeMsNR+L9m05Flbvd5T+GlivG+GkSWQL7tM9SRFpM/dw=="],
+
+ "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.130.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-b+h/lsLLurp756dMGizNs5uPaJfyEdWrTcV5t8M609jWm1DEHB1StpRXCkyvwtkJx3m+qL5BNQ0dEKan/4yGFA=="],
+
+ "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.130.0", "", { "os": "linux", "cpu": "none" }, "sha512-O19Cil83XAyjEFfo8WhkMwY58ALqZ7ckjGL+25mjMIuF84urWBeANH0FC8B8BsSSygWU3/1aY3ADdDbp+wlBnw=="],
+
+ "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.130.0", "", { "os": "linux", "cpu": "none" }, "sha512-BgXRVC0+83n3YzCscLQjj6nbyeBIVeZYPTI4fFMAE4WNm2+4RXhWp03IVizL7esIz36kgmT48aebk1iM+cs8sw=="],
+
+ "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.130.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-6tJz0xvnGhsokE7N1WlUSBXibpYmT9xSJFS1Ce41Km/+8gQvdlW8MLhRv8PD0L7ix8vRG0FDDepp3jdOFzdVdw=="],
+
+ "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.130.0", "", { "os": "linux", "cpu": "x64" }, "sha512-9aCWj83dp3heTQGmGnZGdIWgxjZrr/7VQ0TGFHH5PKByxJKF2Hcr4qvaSUHhhGEa3MSsDjTL1YDP8RAgdL5/Cg=="],
+
+ "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.130.0", "", { "os": "linux", "cpu": "x64" }, "sha512-afXt87aZBqrUVli8TB/I8H1G50RDWcwirjWtXGXYqJ2ZqWEiErH7V72j3LUSDZaivmtu2OLX0KQ/mbhP81mr7A=="],
+
+ "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.130.0", "", { "os": "none", "cpu": "arm64" }, "sha512-I0NCrZV/YZuCGWgqwNN/GO/iXlLF2z+Wgc7u+Aa9N4P51oYeIa0XT+zVBUne4csO9GqxskXgI4g8JzzWGRpfOw=="],
+
+ "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.130.0", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-sJgQkGaBX0WJvPUDfwciex6IcTk5O5NLQ1bhEb6f3nBruh1GshKMRSMt2bxZlYrgBzjyBbJzsnO+InPG0bg+fA=="],
+
+ "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.130.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-bjcma99sQrNh6RY4mPO9yTkfxql6TDFoN3HWdK31RCKXwNhcDgJXW/l8PUtzKNiQ+9vpKJfJtQq+LklBuxSOBA=="],
+
+ "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.130.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-hRYbv6HhpSTzT4xTiIkadLI7upLQxuOdLPR/9nL1fTjwhgutBTPXrwaAPb/jTFVx6/8C7Jb5HcUKhmNwloTbFA=="],
+
+ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.130.0", "", { "os": "win32", "cpu": "x64" }, "sha512-RBpA9TsRucJq6HNVNCFF1iKg+QeTkLdZf7hi4xaOGCPvMZWvDHjQgSOEZMUpuW4JNciHbxNhLEYmz5CVygjVGQ=="],
+
+ "@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="],
+
+ "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="],
+
+ "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="],
+
+ "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="],
+
+ "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="],
+
+ "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="],
+
+ "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="],
+
+ "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="],
+
+ "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="],
+
+ "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="],
+
+ "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="],
+
+ "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="],
+
+ "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="],
+
+ "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="],
+
+ "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="],
+
+ "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="],
+
+ "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="],
+
+ "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="],
+
+ "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="],
+
+ "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="],
+
+ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
+
+ "@oxc-transform/binding-android-arm64": ["@oxc-transform/binding-android-arm64@0.93.0", "", { "os": "android", "cpu": "arm64" }, "sha512-sjmbt7SbsIgHC9luOLgwoFTI2zbTDesZlfiSFrSYNZv6S6o4zfR2Q/OLhRQqmar15JtxP8NVPuiPyqyx0mqHyg=="],
+
+ "@oxc-transform/binding-darwin-arm64": ["@oxc-transform/binding-darwin-arm64@0.93.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XhYYdSU1Oz1UFeMm8fbfdPrODDQkLz2USDjKmfGuoOQRFKXlq0YTktfzF6z1bxn+T8pc9jIlBDr7f+cyy2CCjg=="],
+
+ "@oxc-transform/binding-darwin-x64": ["@oxc-transform/binding-darwin-x64@0.93.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cRQE9cWmP1cLPqGKqbr453nio1uIgv2LAfIfdx1fQSClG6PvzfTWTqujM0bJpKquodkm4k07ug35+tp0aIkl0w=="],
+
+ "@oxc-transform/binding-freebsd-x64": ["@oxc-transform/binding-freebsd-x64@0.93.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-m2vojbIELwBwX4ehbEs+7gXx4ooBn2mpR8MkxjZdhucMTj7P38W+jSdW+04pX+/bf2vYxP2madTEZXSX6mseLg=="],
+
+ "@oxc-transform/binding-linux-arm-gnueabihf": ["@oxc-transform/binding-linux-arm-gnueabihf@0.93.0", "", { "os": "linux", "cpu": "arm" }, "sha512-NEoI0t9b8NHzvXuBIADYubKUbfsuDsY9g/uOTiVNoP+r16vpOdiY3avoqP2x2WPSiuprYVFM3Olq3WVngSg+IA=="],
+
+ "@oxc-transform/binding-linux-arm-musleabihf": ["@oxc-transform/binding-linux-arm-musleabihf@0.93.0", "", { "os": "linux", "cpu": "arm" }, "sha512-gzhgsb/o+V2PBElu2aMD7H1ZYOntr4lzuXDyVq/RbwwzF3G3jjFMB5hddbcjky8rdtmVzEaqqESI2h5kWkZUAw=="],
+
+ "@oxc-transform/binding-linux-arm64-gnu": ["@oxc-transform/binding-linux-arm64-gnu@0.93.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-4PdTqvMzLeMLbkwpHvj2ovQoIKaK8i1OnUGW7XzhZKPBGhkcdt/H3oa5FhZ2uoqSIM1KnKKP80MSC1OYqK+w0Q=="],
+
+ "@oxc-transform/binding-linux-arm64-musl": ["@oxc-transform/binding-linux-arm64-musl@0.93.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-c+CrpmFv32Z1WfR2V8sEKPI4XLewK9hQUq57RUDXj3P99IZ9eA0qIq/2Azle4YGbHdeEywAvqEDlbGa7o3ZFNQ=="],
+
+ "@oxc-transform/binding-linux-riscv64-gnu": ["@oxc-transform/binding-linux-riscv64-gnu@0.93.0", "", { "os": "linux", "cpu": "none" }, "sha512-9rkciYe67g/uuVU4bFst96c7Xc2rk2fhzWTsBySUjTvxpgEeBXPsx78OLNwFVZoGf0lGNMXU/oSxr8OImEgvcw=="],
+
+ "@oxc-transform/binding-linux-s390x-gnu": ["@oxc-transform/binding-linux-s390x-gnu@0.93.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-b/3he7qO4It9bTZbKWNvYMVNyoNldgWVDsTleWiRSskDZPTP6CggpcxVolltn8Eegiq4GycKSN1riInTngR6+w=="],
+
+ "@oxc-transform/binding-linux-x64-gnu": ["@oxc-transform/binding-linux-x64-gnu@0.93.0", "", { "os": "linux", "cpu": "x64" }, "sha512-PeKWwubXPza6JGYjZGRt3sleTAaxTac4SG3Nd/VF9WGCY7ljAb6Q0t/gIuyjLm7tgB2E4luFezJogqkAW/b1ng=="],
+
+ "@oxc-transform/binding-linux-x64-musl": ["@oxc-transform/binding-linux-x64-musl@0.93.0", "", { "os": "linux", "cpu": "x64" }, "sha512-UjeqejYo3ynOimHKKPdqtryD0iCWiYHRnNNl5sxzK4GPA/JcxNnRGejAbLH6gkPOFtAi2k4Y5ujc2nU8cX8LSw=="],
+
+ "@oxc-transform/binding-wasm32-wasi": ["@oxc-transform/binding-wasm32-wasi@0.93.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.5" }, "cpu": "none" }, "sha512-pMUgg0Mm5ASd8oEPf/yiZmHCqH5WMC0mjCK3CccEvfpUf+WC8WYiKiLkPz+0e7AyPW/Kb+MDI9FaYDKQ5QgyoQ=="],
+
+ "@oxc-transform/binding-win32-arm64-msvc": ["@oxc-transform/binding-win32-arm64-msvc@0.93.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-RR30xNVMIEe5PWSD26uGEZp6yH7fkLKznvPSebVOVl2IWW8Sjnd59i6Ws08FmBKH9QP3jW30MypL6ESdlE5yWw=="],
+
+ "@oxc-transform/binding-win32-x64-msvc": ["@oxc-transform/binding-win32-x64-msvc@0.93.0", "", { "os": "win32", "cpu": "x64" }, "sha512-6QN3DEaEw3eWioWEFRgNsTvYq8czYSnpkjB2za+/WdLN0g5FzOl2ZEfNiPrBWIPnSmjUmDWtWVWcSjwY7fX5/Q=="],
+
+ "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.50.0", "", { "os": "android", "cpu": "arm" }, "sha512-ICXQVKrDvsWUtfx6EiVJxfWrajKTwTfRV8vz2XiMkxZeuCKJLgD4YAj6dE3BWvpqDlkVkie4VSTAtMUWO9LDXg=="],
+
+ "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.50.0", "", { "os": "android", "cpu": "arm64" }, "sha512-quwjLQFkuW6OwLHeDeIXsTzOmipQFQbqsYN9HLk2B5I01IlAQZHP1UiLIg0O7pP+dUgPD2AD7SCYA3gs6NH5/g=="],
+
+ "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.50.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ikU5umElcMi78/TNI334wtjr5WZ5F4nWa1aIDseAKKGL0W3ygxeYKkrIJ0fggWa8MOon66BmG3xCqmX1m9YAOw=="],
+
+ "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.50.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-WT4MOYG4mv9IXrH0m60vHsJh+rRMPSOKTQmwDpwmgQ+DuW/i5dU4pqc0HDO5uclO5vjz5IFX5z/taW86LSVe/g=="],
+
+ "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.50.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-gH0rycVXqV4juWkvLs2uPMtTyppDc7qEUVzXAxnQ7FpcSZNXqKowUgtjH8q67ngj416r8+4NnAlyR/D35zwwhQ=="],
+
+ "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.50.0", "", { "os": "linux", "cpu": "arm" }, "sha512-wL/k+o0hiTeRvi/gPzeC1L/yTHTXIeHDKWU09s2zTBmv7ma59wTm+fADNSGYxhJQDxyavQbwTf1QpW3Zj924tQ=="],
+
+ "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.50.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Y59FKqoUM3Gf00E395b4ixfWyJGwO2GzaZawF5MZoVWcb3f6CkWUXyao0jyOvoIxDMzMybcVRuXyG7ih/Nxweg=="],
+
+ "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.50.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-OvXbfTjMignXWyJXg/NOFsiy996vFe8wb9tkxJaUq8ylq0XrzJg3ttavC5Tcmm6F8/GUs2r3XFJWWu9q/27uYw=="],
+
+ "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.50.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rqmvHZm7vMa3NLYa0khwkhReCmp9tqKnF23TFZ7S5cYJLvIE4b0k8famWE7kO897/DXznJe675n5SohFBggbxA=="],
+
+ "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.50.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-49bAdYbMSde42tzPDtuHnBWzOgmoS0PT9THCjvMnDVYMQYiHzPc2Mv5rkpBHVQOXM+PHfafJlxgK0anXSWBVvw=="],
+
+ "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.50.0", "", { "os": "linux", "cpu": "none" }, "sha512-VFT25/6kckkIM62KeWB2bi+xCEmC/zC+DcMaIpEfaio8ulkGDLSiTz11TyK0eqgTl3x5OklYEGDWohvAgOr8Bw=="],
+
+ "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.50.0", "", { "os": "linux", "cpu": "none" }, "sha512-BBJMuNy6jjkXjUUINF5UTQqb/nvjmtJad43Gp7bab0AAURAdthhJvduR7rHpWInpWYiaMzYsdrmURNcrmpxdZA=="],
+
+ "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.50.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xd4y+yjAYHKmryXhyUUwbyRD01iKfcvI74iE01L6p4F8SwjhZQXDshK+T8PcrPZLiFqH263P5xqJk94amjkjzQ=="],
+
+ "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.50.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Qp96rYJru7l++7mk4R+eh8qq9GFfFAMdmoN6VGoRHI8AA1XMnUIzH4u+zOcKZZwY+irHdsaBldDearwB4nOH7A=="],
+
+ "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.50.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5XLGp+yd5w2Key5LMqJO+X3XVsJKgeeUKljy32+MBF/J/JZ5m8WHl6dI5eOQOr3ixopxPiXIyDAxn3slI3UXiQ=="],
+
+ "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.50.0", "", { "os": "none", "cpu": "arm64" }, "sha512-QAxwzh7+GHugCD7WuERolVs8TKQwXNIAZXAHHTecbKVc9oWBkWzOiLauQuezXS57tVcof5zhi1IjZ8tOV0htTg=="],
+
+ "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.50.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-3nKN/kqClm9iCFWTwtJ9UpR5SGyExp5l3nw6uIiBt+3XitQtszin+vjHrL7JHfDksZ7Svigdaow2zqz/IKCfqw=="],
+
+ "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.50.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3r6XZ8+X6qlLbXaPW2NygfiAWSpKbkE36pAVzS83mY+cYY+pSMalJ+qnCgkr92tr+Iqv988XKQ1CpARTg9ITbQ=="],
+
+ "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.50.0", "", { "os": "win32", "cpu": "x64" }, "sha512-BSE8D8KsvquMG9vU+Qt4qGuoOcZ36rxU5S6ZkHNguj+MlWkXWCBETnno3yJ9CfWvfCrbmieaN9LK6hdcdHNZ/w=="],
+
+ "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.22.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4150Lpgc1YM09GcjA6GSrra1JoPjC7aOpfywLjWEY4vW0Sd1qKzqHF1WRaiw0/qUZ40OATYdv3aRd7ipPkWQbw=="],
+
+ "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.22.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-vFWcPWYOgZs4HWcgS1EjUZg33NLcNfEYU49KGImmCfZWkflENrmBYV4HN/C0YeAPum6ZZ/goPSvQrB/cOD+NfA=="],
+
+ "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.22.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-6LiUpP0Zir3+29FvBm7Y28q/dBjSHqTZ5MhG1Ckw4fGhI4cAvbcwXaKvbjx1TP7rRmBNOoq/M5xdpHjTb+GAew=="],
+
+ "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.22.1", "", { "os": "linux", "cpu": "x64" }, "sha512-fuX1hEQfpHauUbXADsfqVhRzrUrGabzGXbj5wsp2vKhV5uk/Rze8Mba9GdjFGECzvXudMGqHqxB4r6jGRdhxVA=="],
+
+ "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.22.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SZidAj+jrbZf9ZjBEYW0tiNZ+KasqB2zgW26qdiPpQSF/DzURnPmXz651IeA9YsmbVdHGIooEHUmev6QJdquA=="],
+
+ "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.22.1", "", { "os": "win32", "cpu": "x64" }, "sha512-QweSk9H5lFh5Y+WUf2Kq/OAN88V6+62ZwGhP38gqdRotI90luXSMkruFTj7Q2rYrzH4ZVNaSqx7NY8JpSfIzqg=="],
+
+ "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.66.0", "", { "os": "android", "cpu": "arm" }, "sha512-f7kq8N51T4phpzqfBpA2qaVTI/KrkCmNwaj3t/97I/WLTDI+UhlP5GL9eER+zVxBhtlx5rKXWByJU1/zDAvyaw=="],
+
+ "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.66.0", "", { "os": "android", "cpu": "arm64" }, "sha512-xu6QO71tdDS9mjmLZ3AqhtaVHBvdmsOKkYnReNNDgh+XiwnsipeQOIxbiYOOO0iAXycJ+GK0wdMSZP/2j/AmSg=="],
+
+ "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.66.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ24VimSOC7mxuEA99e0H2FS0C1yO3+iW13jPRAk+e2njsUs3QeAXsafCDyaIrV/MirdOVez+etQNQsJE43zNQ=="],
+
+ "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.66.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-awhj8ZvJrrRSnXj7V++rpZvTmnl99L6mi0B7gg7Cp7BN6cKpzuI481bHNLvXGA9GB1/oEgA3ponuyoAc6Md12A=="],
+
+ "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.66.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KQF0oVV21/FjIqkRuL8Q1vh8ECsE5+ocdH5tcqTQ4ZnYuDVoYibQUNfqBjQaUsP6UIIda5Y75Wpm5p4RgQWiWw=="],
+
+ "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.66.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9u1rgwZSEXWb30vbFZzQ78HVXBo0WCKNwJ3a2InRUTNMRng+PUDIoSFmA+m4HdUfBaIqftShq8J8qHc+eE/Vig=="],
+
+ "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.66.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ynot2HR1bHxUaNWoC280MVTDfZuaWuP3XfSMRDhyuZrVjhzoaBCVFlw8h8qeZjWKVUBhPWFIxB7AQTlK8Z2WWg=="],
+
+ "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.66.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-xCbgzciGgo+A4aQZEknsNrNiIwY7sU5SfRuMmRjPIvZAgdF34cIHiKvwOsS5XRLjlTVSFwitmq6YclTtHTfU+g=="],
+
+ "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.66.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-hmo+ZB/lHkR1HdDmnziNpzSLmulnUSu10VEqX2Yex7OwvoBAbjJQLvy4gIBRV3AAwWnCvAxKp5Nv1GE6LU1QMg=="],
+
+ "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.66.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2Invd4Uyy81mVooQC5FBtfxSNrvcX1OxbMlVQ6M2erRrNI2awFYF26YNW2yFxdVFZ4ffNOWKghtMjhnUPsXsVA=="],
+
+ "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.66.0", "", { "os": "linux", "cpu": "none" }, "sha512-s0iXPDQVdgayE3RGa/N2DZF7tjgg0TwEtD1sGoDxqPDGrIXgo45H0yHknT0f9A0yteASsweYZtDyTuVlM4aSag=="],
+
+ "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.66.0", "", { "os": "linux", "cpu": "none" }, "sha512-OekL4XFiu7RPK0JIZi8VeHgtIXPREf42t8Cy/rKEsC+P3gcqDgNAAGiyuUOpdbG4wwbfue1q4CHcCO7spSve6w=="],
+
+ "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.66.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Ga1D0kj1SFslm34ThA/BdkUlyAYEnTsXyRC4pF0C5agZSwtGdHYWMTQWemUfBGp4RCG4QWXgdO+HmmmKqOtlBg=="],
+
+ "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.66.0", "", { "os": "linux", "cpu": "x64" }, "sha512-p5jfP1wUZe/IC3qpQO84n9DRnf9g3lKRtLBlQq23ykyrDglHcVx7sWmVTlPuU6SBw8mNnPzyOn022G3XZHnlww=="],
+
+ "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.66.0", "", { "os": "linux", "cpu": "x64" }, "sha512-vUB/sYlYZorDL1ZD+o9mRv7zbsykrrFRtmgS6R8musZqLtrPRQn1gc1eGpuX+sfdccz42STl/AqldY6XRb2upQ=="],
+
+ "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.66.0", "", { "os": "none", "cpu": "arm64" }, "sha512-yde+6p/F59xRkGR9H1HfngWRif1QRJjynZK349l+UI0H6w9hL3G8/AVaTHFyTtLVQ56qtNbX2/5Dc77n1ovnOg=="],
+
+ "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.66.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-O9GLucgoTdmOrbBX+EjzNe7o/Ze5TFOvXcib6bzUOtBOmj6cV+zw18NgB+cGKAkDw1Pdqs8vGkfHbbsLuDtXWg=="],
+
+ "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.66.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-m3Pjwc2MfTcom4E4gOv7DyuGyt7OfGNCbmqDHd+N7EzXmP+ppHuudm2NjcA3AjV5TSeGxaguVF4SbTKHe1USYA=="],
+
+ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.66.0", "", { "os": "win32", "cpu": "x64" }, "sha512-/DbBvw8UFBhja6PqudUjV4UtfsJr0Oa7jUjWVKB0g86lj/VwnPrkngn0sFql3c9RDA0O16dh7ozsXb6GjNAzBQ=="],
+
+ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
+
+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
+
+ "@stryker-mutator/api": ["@stryker-mutator/api@9.6.1", "", { "dependencies": { "mutation-testing-metrics": "3.7.3", "mutation-testing-report-schema": "3.7.3", "tslib": "~2.8.0", "typed-inject": "~5.0.0" } }, "sha512-g8VNoFWQWbx0pdal3Vt8jVCZW+v3sc3gi94iI0GVtVgUGTqphAjJF6EAruPTx0lqvtonsaAxn5TD36hcG1d6Wg=="],
+
+ "@stryker-mutator/core": ["@stryker-mutator/core@9.6.1", "", { "dependencies": { "@inquirer/prompts": "^8.0.0", "@stryker-mutator/api": "9.6.1", "@stryker-mutator/instrumenter": "9.6.1", "@stryker-mutator/util": "9.6.1", "ajv": "~8.18.0", "chalk": "~5.6.0", "commander": "~14.0.0", "diff-match-patch": "1.0.5", "emoji-regex": "~10.6.0", "execa": "~9.6.0", "json-rpc-2.0": "^1.7.0", "lodash.groupby": "~4.6.0", "minimatch": "~10.2.4", "mutation-server-protocol": "~0.4.0", "mutation-testing-elements": "3.7.3", "mutation-testing-metrics": "3.7.3", "mutation-testing-report-schema": "3.7.3", "npm-run-path": "~6.0.0", "progress": "~2.0.3", "rxjs": "~7.8.1", "semver": "^7.6.3", "source-map": "~0.7.4", "tree-kill": "~1.2.2", "tslib": "2.8.1", "typed-inject": "~5.0.0", "typed-rest-client": "~2.3.0" }, "bin": { "stryker": "bin/stryker.js" } }, "sha512-WMgnvf+Wyh/yiruhNZwc8w8DlzmmjXhPjSn5MR8RhAXzlnWji8TQrUYgBUkHk9bEgSaIlB3KZHm37iiU5Q2cLQ=="],
+
+ "@stryker-mutator/instrumenter": ["@stryker-mutator/instrumenter@9.6.1", "", { "dependencies": { "@babel/core": "~7.29.0", "@babel/generator": "~7.29.0", "@babel/parser": "~7.29.0", "@babel/plugin-proposal-decorators": "~7.29.0", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/preset-typescript": "~7.28.0", "@stryker-mutator/api": "9.6.1", "@stryker-mutator/util": "9.6.1", "angular-html-parser": "~10.4.0", "semver": "~7.7.0", "tslib": "2.8.1", "weapon-regex": "~1.3.2" } }, "sha512-5K8wH4Pthly25c2uKKik4Dfcoeou7sbJdFS6u3QIYHlulgFVDJwtEMWTZGkZfs7IiUEXIDNa0keRACq5jn5AvA=="],
+
+ "@stryker-mutator/util": ["@stryker-mutator/util@9.6.1", "", {}, "sha512-Lk/ALVctJjFv1vvwR+CFoKzDCWvsBlq7flDUnmnpuwTrGbm156EdZD1Jjq4o8KdOap0ezUZqQNE9OAI1m2+pUQ=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
+
"@types/accepts": ["@types/accepts@1.3.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="],
"@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
- "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
+ "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
"@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
@@ -186,13 +559,13 @@
"@types/keygrip": ["@types/keygrip@1.0.6", "", {}, "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="],
- "@types/koa": ["@types/koa@2.15.0", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g=="],
+ "@types/koa": ["@types/koa@2.15.2", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-CB+iyjjh1uS5N6/CKwXvw0qA7USMS2WVc4Tjf660yCjhdvqzNr8gdFcIawB41zGGptOQ+d1fnpaQWIIUXYxR3w=="],
"@types/koa-compose": ["@types/koa-compose@3.2.9", "", { "dependencies": { "@types/koa": "*" } }, "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA=="],
- "@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="],
+ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
- "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="],
+ "@types/qs": ["@types/qs@6.15.1", "", {}, "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw=="],
"@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
@@ -208,13 +581,13 @@
"@zipbul/cookie": ["@zipbul/cookie@workspace:packages/cookie"],
- "@zipbul/core": ["@zipbul/core@0.1.1", "", { "dependencies": { "@zipbul/baker": "^0.1.0", "@zipbul/common": "0.1.1", "@zipbul/logger": "0.1.1", "dotenv": "^16.4.5", "exponential-backoff": "^3.1.2" } }, "sha512-D1zBxaNB0YDDn2sgPMxsB3Zz5SxH780zTAbURDFKxKeLWXxJIsGusHwYoMRzszDTBi4OpRLLaDqyENQ4dNHCPw=="],
+ "@zipbul/core": ["@zipbul/core@0.1.3", "", { "dependencies": { "@zipbul/baker": "^0.1.0", "@zipbul/common": "0.1.1", "@zipbul/logger": "0.1.1", "dotenv": "^16.4.5", "exponential-backoff": "^3.1.2" } }, "sha512-Q+2BwP+ix7hHPsfGOMQFEarQTnTbeKji67wI/VlEXMfrgv9aiZvEp7UXFsCUM7/TwlgUDwNWYlucF1p72Fnjkw=="],
"@zipbul/cors": ["@zipbul/cors@workspace:packages/cors"],
"@zipbul/helmet": ["@zipbul/helmet@workspace:packages/helmet"],
- "@zipbul/http-adapter": ["@zipbul/http-adapter@0.1.1", "", { "dependencies": { "http-status-codes": "^2.3" }, "peerDependencies": { "@zipbul/baker": "^0.1.0", "@zipbul/common": "0.1.1", "@zipbul/core": "0.1.1", "@zipbul/logger": "0.1.1" } }, "sha512-xM2sqWgRSF+D2kQVBmtTea/vxN/E9h7g3/G/c3oVhLApGhBKogu9fcjD/4vp/04qgKSI8eKkEIK8jZi7aXz+dA=="],
+ "@zipbul/http-adapter": ["@zipbul/http-adapter@0.1.3", "", { "dependencies": { "@zipbul/router": "^0.2.2", "@zipbul/shared": "^0.0.11", "http-status-codes": "^2.3" }, "peerDependencies": { "@zipbul/baker": "^0.1.0", "@zipbul/common": "0.1.1", "@zipbul/core": "0.1.3", "@zipbul/logger": "0.1.1" } }, "sha512-07Ayhgq+bdtXfdloGTfMk31TINyAR5e6nzAHVIWtmUM69BLriwF1eSmcU8UfB7PGWZ404R8ceRh8akhs01SZWw=="],
"@zipbul/logger": ["@zipbul/logger@0.1.1", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-shnaZ5WA5Q/RkIcqDluK/SB88KCXPtv1h3dCx5gQMvRBNC0LnBocVP9aBAdAaiwlOqLqrEH2hAm6u0BAL0voVw=="],
@@ -230,59 +603,109 @@
"@zipbul/shared": ["@zipbul/shared@workspace:packages/shared"],
+ "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
+
+ "angular-html-parser": ["angular-html-parser@10.4.0", "", {}, "sha512-++nLNyZwRfHqFh7akH5Gw/JYizoFlMRz0KRigfwfsLqV8ZqlcVRb1LkPEWdYvEKDnbktknM2J4BXaYUGrQZPww=="],
+
"ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
+
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.32", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg=="],
+
"better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="],
+ "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
+
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
- "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
+ "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
+
+ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
+
+ "bunup": ["bunup@0.16.31", "", { "dependencies": { "@bunup/dts": "^0.14.53", "@bunup/shared": "0.16.28", "chokidar": "^5.0.0", "coffi": "^0.1.37", "lightningcss": "^1.30.2", "picocolors": "^1.1.1", "tinyexec": "^1.0.2", "tree-kill": "^1.2.2", "zlye": "^0.4.4" }, "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"], "bin": { "bunup": "dist/cli/index.js" } }, "sha512-gWspdmLyso6DQwuNCbUL+hUrHST+8B/vl6woLryJfndjfRpdSKRKtS9wNbKCRPztY1VcubUjcIh6sCM8F3MYlQ=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
+ "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="],
+
+ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
"chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
- "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
+ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
+
+ "cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="],
+
+ "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
+
+ "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="],
"cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="],
+ "coffi": ["coffi@0.1.37", "", { "dependencies": { "strip-json-comments": "^5.0.3" } }, "sha512-ewO5Xis7sw7g54yI/3lJ/nNV90Er4ZnENeDORZjrs58T70MmwKFLZgevraNCz+RmB4KDKsYT1ui1wDB36iPWqQ=="],
+
+ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
+
+ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
+
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
+ "des.js": ["des.js@1.1.0", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg=="],
+
"detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="],
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "diff-match-patch": ["diff-match-patch@1.0.5", "", {}, "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="],
+
"dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
"dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="],
+ "dpdm": ["dpdm@4.2.0", "", { "dependencies": { "chalk": "^5.6.2", "fs-extra": "^11.3.3", "glob": "^13.0.0", "ora": "^9.1.0", "tslib": "^2.8.1", "typescript": "^5.9.3", "yargs": "^18.0.0" }, "bin": { "dpdm": "lib/bin/dpdm.js" } }, "sha512-Vq862fZ9UE66rlr2VcMhU8ZstTH3ItqmniLSCtAeg6T2AYeB2oD3Z6lGjiFDjyUvxLbfLyBBNWagCLMehpmo5g=="],
+
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
+ "electron-to-chromium": ["electron-to-chromium@1.5.361", "", {}, "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA=="],
+
+ "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
"enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
- "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
+ "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+ "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
+
"exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
"extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="],
- "fast-check": ["fast-check@4.5.3", "", { "dependencies": { "pure-rand": "^7.0.0" } }, "sha512-IE9csY7lnhxBnA8g/WI5eg/hygA6MGWJMSNfFRrBlXUciADEhS1EDB0SIsMSvzubzIlOBbVITSsypCsW717poA=="],
+ "fast-check": ["fast-check@4.8.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg=="],
"fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
@@ -292,22 +715,50 @@
"fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="],
+ "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="],
+
+ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="],
+
+ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
+
+ "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="],
+
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+ "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
+
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
- "find-my-way": ["find-my-way@9.5.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ=="],
+ "find-my-way": ["find-my-way@9.6.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ=="],
"find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
+ "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],
+
"fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
+
+ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
+
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
+ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="],
+
+ "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="],
+
+ "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
+
"glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
@@ -318,48 +769,106 @@
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+ "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
- "hono": ["hono@4.12.3", "", {}, "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg=="],
+ "hono": ["hono@4.12.23", "", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="],
"http-status-codes": ["http-status-codes@2.3.0", "", {}, "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="],
"human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
+ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
+
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
- "ioredis": ["ioredis@5.10.0", "", { "dependencies": { "@ioredis/commands": "1.5.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-HVBe9OFuqs+Z6n64q09PQvP1/R4Bm+30PAyyD4wIEqssh3v9L21QjCVk4kRLucMBcDokJTcLjsGeVRlq/nH6DA=="],
+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+
+ "ioredis": ["ioredis@5.10.1", "", { "dependencies": { "@ioredis/commands": "1.5.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA=="],
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+ "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
+
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
+
"is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],
+ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
+
"is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
+
+ "js-md4": ["js-md4@0.3.2", "", {}, "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="],
+
+ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
"js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+
+ "json-rpc-2.0": ["json-rpc-2.0@1.7.1", "", {}, "sha512-JqZjhjAanbpkXIzFE7u8mE/iFblawwlXtONaCvRqI+pyABVz7B4M1EUNpyVW+dZjqgQ2L5HFmZCmOCgUKm00hg=="],
+
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
"jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
+ "knip": ["knip@6.14.2", "", { "dependencies": { "fdir": "^6.5.0", "formatly": "^0.3.0", "get-tsconfig": "4.14.0", "jiti": "^2.7.0", "minimist": "^1.2.8", "oxc-parser": "^0.130.0", "oxc-resolver": "^11.19.1", "picomatch": "^4.0.4", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.16", "unbash": "^3.0.0", "yaml": "^2.9.0", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-Vg3JhIINjZew1I7qAFI4UHemW1mc4azP/BxJvsq9eGDfxpGO7oVCuD/bsWkog9TO/ZwwJeAeOMFZ1kd9jnY9+Q=="],
+
"koa-compose": ["koa-compose@4.1.0", "", {}, "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="],
"koa-tree-router": ["koa-tree-router@0.13.1", "", { "dependencies": { "@types/koa": "^2.15.0", "koa-compose": "^4.1.0" } }, "sha512-MFsDRupP6crtCVgt+kZmg8jgeFZqkr3iumZcIzXfMoSsI4NfhnHVnUb+4ANdgH50QmFmk03ez3Vt8X+FE6Rj6g=="],
+ "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
+
+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
+
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
+
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
+
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
+
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
+
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
+
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
+
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
+
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
+
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
+
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
+
"locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
"lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="],
+ "lodash.groupby": ["lodash.groupby@4.6.0", "", {}, "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw=="],
+
"lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="],
"lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
+ "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="],
+
+ "lru-cache": ["lru-cache@11.5.0", "", {}, "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA=="],
+
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"memoirist": ["memoirist@0.4.0", "", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="],
@@ -368,16 +877,58 @@
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
+ "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="],
+
+ "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
+
+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+
+ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
+
"mitata": ["mitata@1.0.34", "", {}, "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+ "mutation-server-protocol": ["mutation-server-protocol@0.4.1", "", { "dependencies": { "zod": "^4.1.12" } }, "sha512-SBGK0j8hLDne7bktgThKI8kGvGTx3rY3LAeQTmOKZ5bVnL/7TorLMvcVF7dIPJCu5RNUWhkkuF53kurygYVt3g=="],
+
+ "mutation-testing-elements": ["mutation-testing-elements@3.7.3", "", {}, "sha512-SMeIPxngJpfjfNYctFpYQQtlBlZaVO0aoB3FKdwrI8Ee/2bkyUuCZzAOCLv1U9fnmfA37dPFq0Owduoxs2XgGQ=="],
+
+ "mutation-testing-metrics": ["mutation-testing-metrics@3.7.3", "", { "dependencies": { "mutation-testing-report-schema": "3.7.3" } }, "sha512-B8QrP0ZomErzTPNlhrzKWPNBln+3afwBZPHv0Q7N8wZZTYxMptzb/Gdm3ExXVmioVYrtZAtsDs7W/T/b2AixOQ=="],
+
+ "mutation-testing-report-schema": ["mutation-testing-report-schema@3.7.3", "", {}, "sha512-BHm3MYq+ckO+t5CtlG8zpqxc75rdJCkxVlE+fGuGJM3F7tNCQ/OW2N+TQVHN3BHsYa84+BFc6g3AwDYkUsw2MA=="],
+
+ "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
+
+ "node-releases": ["node-releases@2.0.46", "", {}, "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ=="],
+
+ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
+
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
+ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
+
+ "ora": ["ora@9.4.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.2", "string-width": "^8.1.0" } }, "sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ=="],
+
"outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
+ "oxc-minify": ["oxc-minify@0.93.0", "", { "optionalDependencies": { "@oxc-minify/binding-android-arm64": "0.93.0", "@oxc-minify/binding-darwin-arm64": "0.93.0", "@oxc-minify/binding-darwin-x64": "0.93.0", "@oxc-minify/binding-freebsd-x64": "0.93.0", "@oxc-minify/binding-linux-arm-gnueabihf": "0.93.0", "@oxc-minify/binding-linux-arm-musleabihf": "0.93.0", "@oxc-minify/binding-linux-arm64-gnu": "0.93.0", "@oxc-minify/binding-linux-arm64-musl": "0.93.0", "@oxc-minify/binding-linux-riscv64-gnu": "0.93.0", "@oxc-minify/binding-linux-s390x-gnu": "0.93.0", "@oxc-minify/binding-linux-x64-gnu": "0.93.0", "@oxc-minify/binding-linux-x64-musl": "0.93.0", "@oxc-minify/binding-wasm32-wasi": "0.93.0", "@oxc-minify/binding-win32-arm64-msvc": "0.93.0", "@oxc-minify/binding-win32-x64-msvc": "0.93.0" } }, "sha512-pwMjOGN/I+cfLVkSmECcVHROKwECNVAXCT5h/29S4f0aArIUh3CQnix1yYy7MTQ3yThNuGANjjE9jWJyT43Vbw=="],
+
+ "oxc-parser": ["oxc-parser@0.130.0", "", { "dependencies": { "@oxc-project/types": "^0.130.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.130.0", "@oxc-parser/binding-android-arm64": "0.130.0", "@oxc-parser/binding-darwin-arm64": "0.130.0", "@oxc-parser/binding-darwin-x64": "0.130.0", "@oxc-parser/binding-freebsd-x64": "0.130.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.130.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.130.0", "@oxc-parser/binding-linux-arm64-gnu": "0.130.0", "@oxc-parser/binding-linux-arm64-musl": "0.130.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.130.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.130.0", "@oxc-parser/binding-linux-riscv64-musl": "0.130.0", "@oxc-parser/binding-linux-s390x-gnu": "0.130.0", "@oxc-parser/binding-linux-x64-gnu": "0.130.0", "@oxc-parser/binding-linux-x64-musl": "0.130.0", "@oxc-parser/binding-openharmony-arm64": "0.130.0", "@oxc-parser/binding-wasm32-wasi": "0.130.0", "@oxc-parser/binding-win32-arm64-msvc": "0.130.0", "@oxc-parser/binding-win32-ia32-msvc": "0.130.0", "@oxc-parser/binding-win32-x64-msvc": "0.130.0" } }, "sha512-X0PJ+NmOok8qP3vK9uaW431ngkdM9UPEK7KG466urtIL2+EYTEgbZK2yqe2MWKJKBjRlFweP/pJPx0x9muMEVw=="],
+
+ "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
+
+ "oxc-transform": ["oxc-transform@0.93.0", "", { "optionalDependencies": { "@oxc-transform/binding-android-arm64": "0.93.0", "@oxc-transform/binding-darwin-arm64": "0.93.0", "@oxc-transform/binding-darwin-x64": "0.93.0", "@oxc-transform/binding-freebsd-x64": "0.93.0", "@oxc-transform/binding-linux-arm-gnueabihf": "0.93.0", "@oxc-transform/binding-linux-arm-musleabihf": "0.93.0", "@oxc-transform/binding-linux-arm64-gnu": "0.93.0", "@oxc-transform/binding-linux-arm64-musl": "0.93.0", "@oxc-transform/binding-linux-riscv64-gnu": "0.93.0", "@oxc-transform/binding-linux-s390x-gnu": "0.93.0", "@oxc-transform/binding-linux-x64-gnu": "0.93.0", "@oxc-transform/binding-linux-x64-musl": "0.93.0", "@oxc-transform/binding-wasm32-wasi": "0.93.0", "@oxc-transform/binding-win32-arm64-msvc": "0.93.0", "@oxc-transform/binding-win32-x64-msvc": "0.93.0" } }, "sha512-QCwM2nMAWf4hEBehLVA2apllxdmmWLb5M0in9HwC2boaaFbP0QntbLy4hfRZGur2KKyEBErZbH9S5NYX8eHslg=="],
+
+ "oxfmt": ["oxfmt@0.50.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.50.0", "@oxfmt/binding-android-arm64": "0.50.0", "@oxfmt/binding-darwin-arm64": "0.50.0", "@oxfmt/binding-darwin-x64": "0.50.0", "@oxfmt/binding-freebsd-x64": "0.50.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.50.0", "@oxfmt/binding-linux-arm-musleabihf": "0.50.0", "@oxfmt/binding-linux-arm64-gnu": "0.50.0", "@oxfmt/binding-linux-arm64-musl": "0.50.0", "@oxfmt/binding-linux-ppc64-gnu": "0.50.0", "@oxfmt/binding-linux-riscv64-gnu": "0.50.0", "@oxfmt/binding-linux-riscv64-musl": "0.50.0", "@oxfmt/binding-linux-s390x-gnu": "0.50.0", "@oxfmt/binding-linux-x64-gnu": "0.50.0", "@oxfmt/binding-linux-x64-musl": "0.50.0", "@oxfmt/binding-openharmony-arm64": "0.50.0", "@oxfmt/binding-win32-arm64-msvc": "0.50.0", "@oxfmt/binding-win32-ia32-msvc": "0.50.0", "@oxfmt/binding-win32-x64-msvc": "0.50.0" }, "peerDependencies": { "svelte": "^5.0.0" }, "optionalPeers": ["svelte"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-owwjTnhfM5aCOJhYeqDvk7iM504OeYFZpdRU7cxx7xtZMo4uVpjlryTUon+Cf76CugsvnqA32e6rC73pr1hXaw=="],
+
+ "oxlint": ["oxlint@1.66.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.66.0", "@oxlint/binding-android-arm64": "1.66.0", "@oxlint/binding-darwin-arm64": "1.66.0", "@oxlint/binding-darwin-x64": "1.66.0", "@oxlint/binding-freebsd-x64": "1.66.0", "@oxlint/binding-linux-arm-gnueabihf": "1.66.0", "@oxlint/binding-linux-arm-musleabihf": "1.66.0", "@oxlint/binding-linux-arm64-gnu": "1.66.0", "@oxlint/binding-linux-arm64-musl": "1.66.0", "@oxlint/binding-linux-ppc64-gnu": "1.66.0", "@oxlint/binding-linux-riscv64-gnu": "1.66.0", "@oxlint/binding-linux-riscv64-musl": "1.66.0", "@oxlint/binding-linux-s390x-gnu": "1.66.0", "@oxlint/binding-linux-x64-gnu": "1.66.0", "@oxlint/binding-linux-x64-musl": "1.66.0", "@oxlint/binding-openharmony-arm64": "1.66.0", "@oxlint/binding-win32-arm64-msvc": "1.66.0", "@oxlint/binding-win32-ia32-msvc": "1.66.0", "@oxlint/binding-win32-x64-msvc": "1.66.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-N4LLxYLd94KEBqXDMDM5f+2PUpItTjDLreXe2Gn5KhjhCK4Qp2YUXaBi8Yu325ryOgKwt22m45fpD7nPOn69Yw=="],
+
+ "oxlint-tsgolint": ["oxlint-tsgolint@0.22.1", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.22.1", "@oxlint-tsgolint/darwin-x64": "0.22.1", "@oxlint-tsgolint/linux-arm64": "0.22.1", "@oxlint-tsgolint/linux-x64": "0.22.1", "@oxlint-tsgolint/win32-arm64": "0.22.1", "@oxlint-tsgolint/win32-x64": "0.22.1" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg=="],
+
"p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="],
"p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
@@ -390,36 +941,54 @@
"package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
+ "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
+
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+ "path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
- "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
"pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="],
"prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
- "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="],
+ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
+
+ "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="],
+
+ "pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="],
- "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="],
+ "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="],
"quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+ "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
+
"read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],
+ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
"redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="],
"redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="],
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
"resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+
+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
+
"ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="],
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
@@ -428,11 +997,13 @@
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
- "safe-regex2": ["safe-regex2@5.0.0", "", { "dependencies": { "ret": "~0.5.0" } }, "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw=="],
+ "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
+
+ "safe-regex2": ["safe-regex2@5.1.1", "", { "dependencies": { "ret": "~0.5.0" }, "bin": { "safe-regex2": "bin/safe-regex2.js" } }, "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA=="],
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
- "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+ "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
@@ -440,7 +1011,7 @@
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
- "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
+ "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="],
"side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
@@ -450,28 +1021,100 @@
"slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
+ "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
"spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="],
"sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
"standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="],
+ "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="],
+
+ "stdin-discarder": ["stdin-discarder@0.3.2", "", {}, "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A=="],
+
+ "string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="],
+
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
+ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
+
+ "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="],
+
"term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="],
+ "tinyexec": ["tinyexec@1.2.2", "", {}, "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g=="],
+
+ "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
+
+ "tinypool": ["tinypool@2.1.0", "", {}, "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw=="],
+
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "ts-import-resolver": ["ts-import-resolver@0.1.23", "", { "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-282pgr6j6aOvP3P2I6XugDxdBobkpdMmdbWjRjGl5gjPI1p0+oTNGDh1t924t75kRlyIkF65DiwhSIUysmyHQA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tunnel": ["tunnel@0.0.6", "", {}, "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="],
+
+ "typed-inject": ["typed-inject@5.0.0", "", {}, "sha512-0Ql2ORqBORLMdAW89TQKZsb1PQkFGImFfVmncXWe7a+AA3+7dh7Se9exxZowH4kbnlvKEFkMxUYdHUpjYWFJaA=="],
+
+ "typed-rest-client": ["typed-rest-client@2.3.1", "", { "dependencies": { "des.js": "^1.1.0", "js-md4": "^0.3.2", "qs": "6.15.1", "tunnel": "0.0.6", "underscore": "^1.13.8" } }, "sha512-k4kX5Up6qA68D0Cby2AK+6+vM5k3qTxe+/3FqhnHRExjY5cfbOnzjQZbP/LXleF8hVoDvDqxlgk9KK83HoBZlQ=="],
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
- "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
+ "unbash": ["unbash@3.0.0", "", {}, "sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA=="],
+
+ "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="],
+
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
+
+ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
"universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+
+ "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="],
+
+ "weapon-regex": ["weapon-regex@1.3.6", "", {}, "sha512-wsf1m1jmMrso5nhwVFJJHSubEBf3+pereGd7+nBKtYJ18KoB/PWJOHS3WRkwS04VrOU0iJr2bZU+l1QaTJ+9nA=="],
+
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+ "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
+
+ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
+
+ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
+
+ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
+
+ "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="],
+
+ "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "zlye": ["zlye@0.4.4", "", { "dependencies": { "picocolors": "^1.1.1" }, "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-fwpeC841X3ElOLYRMKXbwX29pitNrsm6nRNvEhDMrRXDl3BhR2i03Bkr0GNrpyYgZJuEzUsBylXAYzgGPXXOCQ=="],
+
+ "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
+
+ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@inquirer/editor/@inquirer/external-editor": ["@inquirer/external-editor@3.0.0", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg=="],
+
"@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],
"@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
@@ -480,16 +1123,92 @@
"@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
- "@zipbul/router/@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="],
+ "@stryker-mutator/instrumenter/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+
+ "@zipbul/baker/@zipbul/result": ["@zipbul/result@0.1.7", "", {}, "sha512-gex+qPMQOChptBYoT7pDXtgcWaU0IB64XR8j/PFe/7q4eZVTGHYu2HjXxUB7ZBOtXJDy1rDXxymmB8wQP2U7CA=="],
+
+ "@zipbul/common/@zipbul/result": ["@zipbul/result@0.1.7", "", {}, "sha512-gex+qPMQOChptBYoT7pDXtgcWaU0IB64XR8j/PFe/7q4eZVTGHYu2HjXxUB7ZBOtXJDy1rDXxymmB8wQP2U7CA=="],
"@zipbul/router/fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="],
+ "@zipbul/router/oxfmt": ["oxfmt@0.51.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.51.0", "@oxfmt/binding-android-arm64": "0.51.0", "@oxfmt/binding-darwin-arm64": "0.51.0", "@oxfmt/binding-darwin-x64": "0.51.0", "@oxfmt/binding-freebsd-x64": "0.51.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.51.0", "@oxfmt/binding-linux-arm-musleabihf": "0.51.0", "@oxfmt/binding-linux-arm64-gnu": "0.51.0", "@oxfmt/binding-linux-arm64-musl": "0.51.0", "@oxfmt/binding-linux-ppc64-gnu": "0.51.0", "@oxfmt/binding-linux-riscv64-gnu": "0.51.0", "@oxfmt/binding-linux-riscv64-musl": "0.51.0", "@oxfmt/binding-linux-s390x-gnu": "0.51.0", "@oxfmt/binding-linux-x64-gnu": "0.51.0", "@oxfmt/binding-linux-x64-musl": "0.51.0", "@oxfmt/binding-openharmony-arm64": "0.51.0", "@oxfmt/binding-win32-arm64-msvc": "0.51.0", "@oxfmt/binding-win32-ia32-msvc": "0.51.0", "@oxfmt/binding-win32-x64-msvc": "0.51.0" }, "peerDependencies": { "svelte": "^5.0.0" }, "optionalPeers": ["svelte"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-l/AoAnaEOV7Q5/Z9kHOMDehVJnCgYN7wRoooWCTUMBMi16BJhLZqd9cmCnwcVFfVlzkt53zK2KLPFNp8vSsoDg=="],
+
+ "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
+ "cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "dpdm/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
"read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
- "@zipbul/router/@types/bun/bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
+ "string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
+ "typed-rest-client/qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="],
+
+ "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
+ "yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
"@zipbul/router/fast-check/pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="],
+ "@zipbul/router/oxfmt/@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.51.0", "", { "os": "android", "cpu": "arm" }, "sha512-Ni0sCqg5CIHaLIYFGj+ncbcumylvNC6FE4rfD0KfdmnWHbPJ+zev0qZCXKxy2hFVa0fYRK0yPzf5nzPbkZou7g=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.51.0", "", { "os": "android", "cpu": "arm64" }, "sha512-eu5lAZjuo0KAkp+M24EhDqfOwA8owQ8d7wyBlOUUGRbDLHpU3IRlDHp8Dif+YqGlxs6jra7yS6WQu/NkPhAxeg=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.51.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6LsUNIdURhhcIfIn8+xsOb61mSTa9msAHTeSGx9Jf4rsP/gN8PGCF+SKWPAQZbND2w/WBkqQ6303jqEEIXzMdQ=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.51.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-9aUMGmVxdHjYMsEAW1tNRoieTJXlVNDFkRvIR1J7LttJXWjVYCu2ekclLij2KJtxBxSQOYSHd12ME/adVGVbZg=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.51.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mkY1nhZTqYb+NHaAWxOCKISN6FwdrwMNsu17vTUA3wzUV2VJ+Paq15ZokRcsMU/2PUdHO73prxyeJpjXQ3MPpQ=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.51.0", "", { "os": "linux", "cpu": "arm" }, "sha512-wtFwNwE4+YCNuPaWoGDZeGsKvD6D1YSUNBJNn/rJBh7CrDBThFE+TBI5kY7vRW9rIOQRsbW2IpyyL3Du4Zqwiw=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.51.0", "", { "os": "linux", "cpu": "arm" }, "sha512-rnOaNx86G7iRKM6lsCIQMux0SMGNC/TEbFR+r7lpruJ12bnrIWgxd5w1PLqOvgR9r8ZJbpK/zfRKctJnh8/Jfg=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.51.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jOgDzSqWcICGRjsp4mc08FxKMN8vzP2Kgs4E0d2HUP99F+nJDQKklRV4Zuj+0gcBgjrzx2CbpqaIdUVPepCojA=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.51.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-KBUCdrH5bwVrAvI9gU/1S55oH6fzXjr++J/oVocdu7bYTks1l7DNNT+rLd/1TDdAEjObGwmfWamn7LC1m8A0DQ=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.51.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NapfjYsABFqTJ1Dn9Efq6sN5esaHconVKwVLbDGNQLrwpOx/g17mkwErHzU72PutL67nf3wNAkbq122H+zLxag=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.51.0", "", { "os": "linux", "cpu": "none" }, "sha512-5dlDt1dUZCVi6elIhiK1PWg9wpTzTcIuj0IZnSurvIoMrhOWqqTcc1dSTxcSkNaBZhfsNqRZdINI1zAgbKkJNQ=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.51.0", "", { "os": "linux", "cpu": "none" }, "sha512-pgdWUJn0S5nulyiVdlFV8DzCUnGXkU99W5PSkkmbaZW+LrZBPxpezun4G0DDHbQaVYuJeCuKsXsGKGo77CkUTQ=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.51.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-2XTFUe97CbDGAI8vjwDfZ1HdakO0XIADyJ24idEg64SC4/K4in/OisXVnrW4NMK7I6TgC7EqRhC0Ln/nKhAemA=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.51.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kQ1OuCqqt/yyf0ZN9VFxW1/JnlgJgii3Dr7pWf9vNBvrX1hv6g39/+mc5oGRHRGJFZtl3zsGDWR9c5N2B/gwBw=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.51.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ARTYqxHF475o96Gbn41hvSWSSRygPlRDXZZgZ9I2scU1y0qiWpCQyZCoefaQa0mwv+wwtZ+luS4YOzsRzM/izg=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.51.0", "", { "os": "none", "cpu": "arm64" }, "sha512-QiC1XrCl6a6BmqMzduO8hdIRMf1m44hCkt2Q68KWkTvUB/E7fd2iomyNh6KnnRca5w6eBrRAAtLFqTh+xjsjJA=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.51.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-NC/hJb9dtU23Zf8L7IVK95xnFjiQ7AfcLO2l5pb69TDEr958qxrtnB2CveeeNSCBFNIkgaTCfd/vHNSoG78l9g=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.51.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-2C45za4Rj36n8YIbhRL1PQbxmXJYf81WEcAgvj5I4ptRROG+A+81hREEN5bmCHADE1UfYaN312U6tkILoZZy6w=="],
+
+ "@zipbul/router/oxfmt/@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.51.0", "", { "os": "win32", "cpu": "x64" }, "sha512-73RqdAuVKQTkjZIDw08JaDHUM4lav5Qu+CaPwg4QbbA7k8o7LEW0p3UsfZ/F8dsO/pwVYh3RzFcanwLRTTahbQ=="],
+
+ "cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "dpdm/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "dpdm/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
+
"read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
+ "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
}
}
diff --git a/knip.json b/knip.json
new file mode 100644
index 0000000..fd5ddc9
--- /dev/null
+++ b/knip.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://unpkg.com/knip@latest/schema.json",
+ "workspaces": {
+ "packages/*": {
+ "entry": [
+ "index.ts",
+ "internal.ts",
+ "src/**/*.{spec,test}.ts",
+ "test/**/*.{spec,test}.ts",
+ "bench/**/*.{ts,bench.ts}"
+ ],
+ "project": ["**/*.ts"]
+ }
+ },
+ "ignore": [
+ "**/node_modules/**",
+ "**/dist/**",
+ "**/build/**",
+ "**/target/**"
+ ],
+ "ignoreDependencies": ["@commitlint/cli", "mitata"]
+}
diff --git a/knoldr/ULTIMATE.md b/knoldr/ULTIMATE.md
new file mode 100644
index 0000000..6a02827
--- /dev/null
+++ b/knoldr/ULTIMATE.md
@@ -0,0 +1,2730 @@
+# ULTIMATE.md: Bun/JSC Router Optimization Blueprint
+
+이 문서는 Bun 전용 라우터를 극한까지 최적화하기 위한 계획 문서다.
+기준은 추측이 아니라 `packages/router/bench/bun-technique-matrix.ts`, 기존 router end-to-end bench, 현재 코드 전수 검토, Bun 1.3.13 기준 로컬 실행 결과, Bun 1.3.x 공식 릴리스 노트, RFC 9110/RFC 3986/RFC 3629 기준을 교차 확인한 결과다.
+
+목표는 단순히 "TypedArray를 많이 쓰는 라우터"가 아니다. Bun은 JavaScriptCore(JSC) 기반이므로, 현재 근거상 가장 강한 가설은 JSC가 잘 최적화하는 object shape/property lookup을 활용하고, allocation/GC가 생기는 지점만 제거하는 hybrid 설계다.
+
+최상위 규모 목표는 **100,000 registered routes in a single router**이다. 이 문서의 모든 correctness, memory, build, match, cache, codegen, validation 전략은 100k routes에서 무너지지 않는 것을 기준으로 판단한다.
+
+단, 이 문서는 “모든 후보를 이미 끝까지 구현했다”는 선언이 아니다. 현재 확정된 기법, 기각된 기법, end-to-end 검증이 더 필요한 후보를 분리한다. 최종 최고 설계로 확정하려면 이 문서의 Verification Gate를 통과해야 한다.
+
+## 0. Document Finality Contract
+
+이 문서의 완성 기준은 “현재 구현이 이미 완벽하다”가 아니다. 완성 기준은 다음이다.
+
+- 구현자가 이 문서만 보고 어떤 결함을 먼저 고칠지 결정할 수 있어야 한다.
+- 어떤 최적화가 확정, 조건부, 기각인지 오해 없이 구분되어야 한다.
+- 성능/메모리 수치가 재현 범위를 넘어서 과장되지 않아야 한다.
+- 100k routes에서 최종 승인하려면 어떤 테스트, 벤치, profile을 통과해야 하는지 닫혀 있어야 한다.
+- 미검증 항목은 “모름”으로 남기지 않고, 검증 명령/측정 단위/승인 기준으로 변환되어야 한다.
+- 보안/표준 정책은 secure/default와 compat/unsafe의 경계가 명확해야 한다.
+
+구현 언어/런타임 스코프 (Implementation language/runtime scope):
+
+- Implementation language: **TypeScript only**, executing on Bun JSC.
+- No native bindings (no N-API/FFI).
+- No WebAssembly hot path or build artifact.
+- No transpilation to other JS runtimes (Node/Deno) is targeted; cross-runtime compatibility is explicitly out-of-scope.
+- All performance and memory primitives are JS/TS built-ins or Bun stdlib (`Object.create(null)`, `Map`, `Int32Array`, `URLPattern`, `Bun.hash`, `Bun.serve`, `Bun.nanoseconds`, etc.).
+- External diagnostic tooling (`bun --cpu-prof`, `bun --heap-prof`, Linux `perf`, `valgrind`) may be used for measurement-only purposes; the router source code never depends on them at runtime.
+
+문서 내 용어의 의미:
+
+- `Confirmed`: 현재 코드/벤치/표준으로 사실 확인된 내용.
+- `Provisional`: 방향성은 강하지만 end-to-end gate 전까지 최종 채택하지 않는 내용.
+- `Candidate`: 실험 대상. 기본 설계가 아니다.
+- `Rejected`: 현재 재현 근거상 채택하지 않는 내용.
+- `Gate`: 구현 완료 또는 enterprise/extreme claim 전에 반드시 통과해야 하는 검증.
+- `build()` / `seal()`: `build()` is the public API boundary; `seal()` is the internal snapshot-validation operation. When this document says `seal()`, it means the internal work performed during public `build()`.
+
+최종 claim 금지 조건:
+
+- single-run microbench만으로 “최고”, “완벽”, “엔터프라이즈급”이라고 쓰지 않는다.
+- cache-hot 반복 조회만으로 router match path 전체 성능이라고 말하지 않는다.
+- static-only external baseline을 dynamic/param/wildcard 성능으로 일반화하지 않는다.
+- native JS RegExp guard를 ReDoS 완전 방지로 표현하지 않는다.
+- heap/RSS delta 한 번으로 retained memory 최종값이라고 말하지 않는다.
+- 구현되지 않은 strict/security policy를 현재 품질로 주장하지 않는다.
+
+---
+
+## 1. 재현 근거
+
+실행 명령:
+
+```sh
+bun packages/router/bench/bun-technique-matrix.ts
+```
+
+주요 결과:
+
+| 항목 | 결과 |
+| ---------------------------------------------------------- | ----------------------------------------: |
+| method null-proto object lookup | 1.12 ns/op |
+| method switch dispatch | 2.10 ns/op |
+| method Map.get | 7.80 ns/op |
+| method bitmask availability | 2.18 ns/op |
+| bitmap+popcount rank | 4.95 ns/op |
+| method bool array availability | 2.69 ns/op |
+| method Set availability | 3.43 ns/op |
+| method Set availability | 9.66 ns/op |
+| terminal direct handler index | 2.07 ns/op |
+| terminal array method lookup | 2.41 ns/op |
+| terminal tagged fast path | 2.39 ns/op |
+| terminal tagged poly path | 2.18 ns/op |
+| direct object static hit (small key set, JSC IC fast path) | 3.44 ns/op |
+| direct object static hit (100k key set, post-IC) | **27.71 ns/iter** (§5.3 B) |
+| `Map` static hit (100k key set) | **13.87 ns/iter** (§5.3 B — 1.99× faster) |
+| length bucket static hit | 5.49 ns/op |
+| packed key lookup hit | 25.50 ns/op |
+| open-address hash lookup hit | 18.59 ns/op |
+| fanout4 object lookup | 4.02 ns/op |
+| fanout16 object lookup | 3.08 ns/op |
+| fanout64 object lookup | 3.27 ns/op |
+| fanout64 array scan | 54.82 ns/op |
+| Uint32Array indexed read | 3.02 ns/op |
+| DataView getUint32 | 3.59 ns/op |
+| TextEncoder.encode per match | 47.04 ns/op |
+| Bun.hash string | 71.58 ns/op |
+| String#indexOf slash | 4.46 ns/op |
+| manual slash scan | 1.36 ns/op |
+| string length read | 2.35 ns/op |
+| toLowerCase unchanged ascii | 2.70 ns/op |
+| manual lowercase unchanged ascii | 17.54 ns/op |
+| build-time specialized equality | 1.57 ns/op |
+| cache key concat lookup | 11.37 ns/op |
+| per-method cache path lookup | 4.19 ns/op |
+| throw/catch validation | 55.94 ns/op |
+| issue-array validation | 3.33 ns/op |
+| substring param allocation | 38.47 ns/op |
+| offset-only param accounting | 2.66 ns/op |
+| object nodes 500k approx delta | rss +33.80 MB, heap +37.72 MB |
+| Int32Array 500k\*8 approx delta | rss +18.38 MB, heap +0 MB |
+
+Measurement footnotes:
+
+- `substring param allocation` returns a string, while `TextEncoder.encode` returns a `Uint8Array`; those two rows reflect separate hot-path allocation costs and must not be treated as a direct same-output comparison.
+- The object/Int32Array memory rows include allocator/page behavior, not just raw payload. `Int32Array 500k*8` means 500,000 rows with 8 `Int32` slots each: 4,000,000 elements \* 4 bytes = 15.26 MiB raw element payload. The measured RSS delta is larger because of runtime allocation overhead and page accounting.
+- The object allocation probe can show heap delta larger than RSS delta because GC timing, allocator arenas, and OS page accounting are not synchronized in the single-process measurement.
+
+해석:
+
+- Bun/JSC에서는 null-prototype object property lookup이 매우 강하다.
+- Fanout microbench rows are not monotonic (`fanout4` can be slower than `fanout16`) because JSC inline-cache state, branch prediction, and benchmark noise matter at single-digit ns/op scale; use them as directional candidate evidence only.
+- HTTP method 입력은 문자열을 null-proto object로 숫자 code로 바꾸는 것이 가장 빠르다.
+- method availability, allowed-methods, terminal multi-method 판정은 bitmask가 bool array와 Set보다 빠르다.
+- `Map`, `switch`, naive SoA/linear scan, packed hash, open-address hash는 이 workload에서 object lookup을 이기지 못했다.
+- `TypedArray`는 raw indexed read와 memory density에는 유리하지만, child lookup 전체를 대체하면 자동으로 빨라지지 않는다.
+- hot path에서 `Bun.hash`, `TextEncoder`, `DataView`, `throw/catch`는 기각한다.
+- slash 탐색은 microbench 실행마다 `indexOf('/')`와 manual scan의 승패가 흔들렸다. 따라서 manual scan 기본 채택은 금지하고, 실제 segment walker end-to-end에서만 결정한다.
+- case normalization은 manual uppercase pre-scan보다 `toLowerCase()` 직접 호출이 빨랐다.
+- allocation 제거는 확실히 중요하다. param substring 생성보다 offset 기반 전달이 훨씬 빠르다.
+
+주의:
+
+- 위 표는 primitive 선택 근거다. 실제 router 전체에서 code size, JIT tier-up, route distribution, cache cardinality, first-match latency까지 증명하지는 않는다.
+- 단일 ns/op 실행값은 절대값으로 고정하지 않는다. 최소 3회 반복 median/p75/p99와 ranking 안정성으로 판단한다.
+
+---
+
+## 2. Bun 1.3.x Research Inputs
+
+공식 Bun 1.3.x 포스트 전체를 확인한 결과, 라우터에 직접 반영할 근거는 다음이다.
+
+Pinned local runtime for measurements:
+
+- Bun `1.3.13`
+- Node compatibility runtime reports `v24.3.0`
+- Platform `linux x64`
+- All ns/op and memory numbers in this document are local results from this environment unless otherwise stated.
+- Release-note inputs are design hints only. Local benchmark/profile gates override release-note inference.
+
+| Source | Relevant fact | Router decision |
+| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| Bun 1.3.13 | JavaScriptCore upgrade: string length folding, `String#indexOf` single-character fast path, SIMD case-insensitive comparison, GC bulk-copy improvements | string primitive와 JSC object fast path를 유지한다. 문자열을 byte buffer로 강제 변환하지 않는다. |
+| Bun 1.3.13 | Source maps moved to compact bit-packed binary format with in-place reads; lookup cost increased slightly while memory dropped | dense metadata는 packed/TypedArray로 옮기되, lookup 전체를 packed buffer로 대체하지 않는다. |
+| Bun 1.3.13 | Runtime memory allocator/libpas improvements reduce baseline memory | memory bench는 Bun version pinned 상태로만 비교한다. |
+| Bun 1.3.12 | Faster tier-up, `Array.isArray` intrinsic, faster single-character `String#includes`, register allocation improvements | small stable hot functions and monomorphic runtime tables are preferred. |
+| Bun 1.3.12 | URLPattern became up to 2.3x faster by removing temporary JS allocations | allocation-free matching is a proven Bun/JSC direction. Compare against URLPattern, but do not replace the router with URLPattern. |
+| Bun 1.3.7 | ARM64 compound boolean expressions compile better, reducing branch misprediction/code size | generated boolean chains are valid candidates when code size is bounded. |
+| Bun 1.3 | `Bun.serve()` has native routes with params/catch-all | benchmark against Bun native routes as an external baseline. |
+| Bun 1.3 | `request.cookies` parses lazily when accessed | params avoid eager object/string materialization where API compatibility permits it. |
+| Bun 1.3.2 / 1.3.7 / 1.3.9 | CPU and heap profiling flags/APIs exist | final optimization must be checked with `--cpu-prof`, `--cpu-prof-interval`, and `--heap-prof`, not only mitata. |
+
+External baselines required before claiming final superiority:
+
+- current router
+- Bun native `Bun.serve({ routes })`
+- `URLPattern`
+- popular userland routers where compatible
+
+All external baselines must include the 100k route profile where the baseline can reasonably support it. If a baseline cannot support 100k routes, document the failure mode instead of omitting it.
+
+External baseline limits:
+
+- Pin package version and adapter source in the result.
+- Timeout: 180s per 100k scenario unless a stricter timeout is documented.
+- Memory cap: process RSS must stay below 2 GiB unless the host benchmark profile explicitly allows more.
+- Failure classes: `build-timeout`, `first-match-timeout`, `memory-limit`, `unsupported-semantics`, `incorrect-result`, `adapter-error`.
+- A baseline that lacks equivalent param/wildcard/method semantics is reported as reference-only for that missing semantic area.
+
+---
+
+## 3. Current Implementation Facts
+
+현재 코드 기준 사실:
+
+- Static routes are compiled into per-method null-proto buckets and looked up by normalized full path. **Method sharding is justified by routing semantics (different methods on the same path), not by raw lookup speed**: §5.3 line 735 measurement shows sharded `32× ~3.1k` is 1.5× slower than unsharded 100k for both object and Map representations due to indexing overhead. The static-table representation itself (object vs `Map`) is Provisional pending Phase 5b — see §4 decision-state.
+- Dynamic routes are segment tries, not radix trees or char tries.
+- Static child lookup inside segment nodes uses null-proto object children.
+- Params are recorded into an `Int32Array` offset buffer during traversal.
+- Params are materialized by generated factories at return/cache time.
+- Method registry already supports custom method names and preserves case-sensitive identity.
+- Method registry has a default 32-method limit, which aligns with bitmask-based availability checks. This is a scoped performance cap, not an HTTP standard limit.
+- Validation is batch-oriented in `build()` / `seal()`, not fail-fast in `add()`.
+
+Current defects that must be fixed before performance work:
+
+- `optionalParamBehavior` is not passed from `Router` into `Registration.seal()`, so `omit` behavior can be ignored.
+- Dynamic match currently calls the params factory twice for one successful dynamic match: once for return params and once for cached params.
+- Method token validation is missing. Empty/invalid methods can be registered.
+- Registered route path validation is incomplete: query, fragment, control chars, malformed percent escapes, dot segments, and full RFC 3986 path policy are not enforced.
+- Static hit cache order is not proven optimal. The current emitted match checks miss/hit cache before static table; static-heavy workloads may prefer static table before hit cache.
+
+---
+
+## 4. Non-Final Areas
+
+아래 항목은 아직 “최고 방법”으로 확정하지 않는다. 반드시 100k end-to-end 재현 후 결정한다.
+
+- 100k hit/miss ns/op: current numbers are cache-hot repeated lookup snapshots, not cold static-table/tree-walk proof.
+- Static cache order: static-first is the provisional default; cache-first is allowed only if end-to-end p75/p99 proves it better for the selected workload.
+- Static table layout: method-first bucket vs path-first method array.
+- Codegen threshold: generated equality / generated walker의 route-count, source-size, compile-time 한계.
+- Terminal representation: current terminal arrays vs fast/poly tagged terminal.
+- Slash scanning: `indexOf('/')` vs manual scan vs generated scanner.
+- Lazy params materialization: API compatibility, allocation, cache behavior를 함께 검증해야 한다.
+- Dynamic traversal allocation: current walker still creates segment `substring()` values; removing or accepting this cost must be decided by end-to-end proof.
+- Static build/runtime duplication: build-only static structures and runtime static tables may both be retained; this must be measured and compacted if confirmed.
+- 100k mixed build bottleneck: wildcard/static conflict validation is a strong root-cause candidate, but phase-level instrumentation must prove it before implementation.
+- Perfect hash / bitmap / radix compressed trie: 현재 기본 설계가 아니라 P3 candidate only.
+- Strict malformed percent runtime policy: secure/default rejects or no-matches malformed/unsafe encoding; compat may preserve raw pass-through only when explicitly selected.
+- Fixed 100k ns/MiB targets: initial target bands are defined below; final release bands must be refreshed from 3-run gate data.
+
+Decision state:
+
+| Area | State | Reason | Next gate |
+| -------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
+| method dispatch via null-proto object | Confirmed | microbench에서 `Map`/`switch`보다 빠름 | 100k method mix regression |
+| method availability via bitmask | Confirmed within <=32 methods | `Set`/bool array보다 빠르고 32-method limit과 일치 | allowed-method/wrong-method tests and explicit >32 failure |
+| static full-path object table | **Confirmed workload-aware** (task 15 POC) | object hit 7.59 ns < Map hit 9.43 ns at production-realistic 8 method × 12,500 routes/bucket; §5.3 1.99× Map advantage applies only to unsharded single-table microbench. Map opt-in for miss/wrong-method/build/RSS-dominant workload | 30-run gate on `100k static` for hybrid threshold |
+| dynamic segment trie | Confirmed as baseline | current implementation and semantics fit route grammar | 100k param/wildcard profile |
+| full TypedArray/SoA router | Rejected | lookup workload에서 object lookup을 이기지 못함 | reopen only with end-to-end proof |
+| `Bun.hash` hot path | Rejected | measured string hash cost too high | none |
+| TextEncoder byte routing | Rejected | per-match encode allocation/cost too high | none |
+| DataView node table | Rejected | no speed advantage over TypedArray/object path | none |
+| open-address child hash | Rejected | object lookup faster in measured fanout | none |
+| static-first static lookup | Required default | current code path is being moved to static-first; candidate microbench only selects the candidate, and final adoption still requires fresh-process end-to-end p75/p99 proof | static-heavy + churn benchmark |
+| path-first static layout | Candidate | microbench promising, memory shape unproven | end-to-end memory and method semantics |
+| terminal tag fast/poly | Candidate | microbench delta small in per-method tree | end-to-end terminal/handler table proof |
+| manual slash scan | Candidate | microbench varies by run/path distribution | segment walker end-to-end proof |
+| lazy read-only params | Candidate | chosen direction for future allocation reduction; current immediate fix preserves immutable/cache-safe params semantics | correctness + mutation + perf test |
+| wildcard conflict index | Required | phase diagnostics and 50k stress identify prefix conflict scanning as the build-time blocker; implementation still must pass 100k gates | Phase 4 RED/GREEN and 100k mixed Guard |
+| wildcard/static/wildcard issue-kind symmetry | Required | same collision class must emit the same issue kind regardless of registration order | bidirectional route-unreachable fixtures |
+| regex sibling cap | Required | bounded conservative regex disjointness comparisons need `regex-sibling-limit` | 33+ same-segment regex siblings fixture |
+| total expansion cap | Required | per-route optional cap alone allows pathological total expanded route count | `expansion-total-limit` fixture |
+| compressed dynamic chains | Candidate | memory candidate, not speed baseline | 100k param heap object breakdown |
+
+---
+
+## 5. 100k Reproduction Results
+
+Latest local reproduction commands:
+
+```sh
+bun packages/router/bench/100k-verification.ts '100k static'
+bun packages/router/bench/100k-verification.ts '100k param'
+bun packages/router/bench/100k-verification.ts '100k mixed'
+bun packages/router/bench/100k-verification.ts '100k high-fanout'
+bun packages/router/bench/100k-verification.ts candidates
+bun packages/router/bench/100k-external-baselines.ts
+timeout 180s bun packages/router/bench/100k-bun-serve-baseline.ts 100000
+```
+
+Scope and trust level:
+
+- These are local single-run snapshots, not the final Verification Gate result.
+- `Build` in the tables means `router.add()` for all routes plus `router.build()`, not `build()` alone.
+- Build time and memory deltas are useful directionally because route arrays are prepared before router registration/build measurement.
+- Memory in single-run snapshot tables is process delta after explicit GC. Memory in fresh-process gate tables is process memory delta parsed from the scenario output and summarized by median.
+- Unit rule: benchmark memory output is `bytes / 1024 / 1024`; read historical `MB` labels in this document as MiB. New target tables use `MiB` explicitly. Per-route budgets are bytes/route.
+- Hit/miss ns/op values are single-run warmed probe min-max values.
+- Hit/miss ns/op values are cache-hot repeated lookups. They do not prove cold static-table, dynamic walker, cache-churn, or first-match latency.
+- Param/mixed hit numbers mostly prove cached result retrieval after the first match; they do not prove uncached dynamic traversal or params materialization cost.
+- First-match ns is printed by the harness, but the table below does not aggregate it and does not provide p75/p99.
+- Memory deltas are process deltas. Final claims require fresh-process 3-run median/p75/p99 and `rss`, `heapUsed`, and `arrayBuffers`.
+- `arrayBuffers` is currently omitted from the snapshot table; final gates must include it.
+- Current preflight checks only prove hit/miss existence unless a bench explicitly verifies exact value, params, and method semantics.
+
+Current router 100k results:
+
+| Shape | Add+build | Memory delta (MiB-style harness MB) | Single-run warmed hit probe min-max | Single-run warmed miss probe min-max | Verdict |
+| ---------------- | ----------: | ----------------------------------: | ----------------------------------: | -----------------------------------: | ------------------------------------------------------------------------------------------------------------------- |
+| 100k static | 307.61 ms | rss +184.45 MB, heap +75.69 MB | 17.66-26.59 ns/op | 15.81-16.64 ns/op | cache-hot match fast; last-route static hit is slower than best static probes; memory acceptable only provisionally |
+| 100k param | 795.21 ms | rss +692.66 MB, heap +373.01 MB | 17.07-17.39 ns/op | 15.19-15.94 ns/op | cache-hot match fast, memory too high |
+| 100k mixed | 21903.80 ms | rss +390.13 MB, heap +132.75 MB | 17.84-23.41 ns/op | 14.75-15.40 ns/op | cache-hot match fast, build unacceptable |
+| 100k high-fanout | 298.12 ms | rss +181.04 MB, heap +79.60 MB | 16.52-23.89 ns/op | 12.10-15.86 ns/op | cache-hot match fast, object lookup directionally holds |
+
+Memory unit note: historical `MB` labels in this table are MiB-style harness output, `bytes / 1024 / 1024`.
+
+External 100k static baselines: static-only, single-run, warmed-loop probe min-max:
+
+| Router | Add+build | Memory delta (MiB-style harness MB) | Single-run warmed hit probe min-max | Single-run warmed miss | Verdict |
+| ----------------- | ------------------: | ------------------------------------------: | ----------------------------------: | ---------------------: | ---------------------------------------------------------------------------------------------------- |
+| zipbul | 313.63 ms | rss +176.60 MB, heap +40.46 MB | 16.90-21.29 ns/op | 18.60 ns/op | balanced, not fastest static hit |
+| rou3 | 181.63 ms | rss +85.62 MB, heap +26.15 MB | 7.12-8.27 ns/op | 62.54 ns/op | static hit faster, miss slower |
+| hono-regexp | 94.69 ms | rss +51.41 MB, heap +27.66 MB | 5.38-6.45 ns/op | 33.66 ns/op | static hit faster, but lazy first-match compile and semantic parity must be measured |
+| hono-trie | 158.98 ms | rss +90.80 MB, heap +35.27 MB | 116.88-359.15 ns/op | 122.50 ns/op | slower match |
+| koa-tree-router | 69.73 ms | rss +55.45 MB, heap +28.04 MB | 73.30-275.75 ns/op | 39.44 ns/op | slower match |
+| memoirist | 33460.09 ms | rss +43.35 MB, heap +26.45 MB | 55.29-107.99 ns/op | 33.82 ns/op | build too slow |
+| find-my-way | 56856.08 ms | rss +334.93 MB, heap +135.21 MB | 162.98-329.09 ns/op | 104.07 ns/op | build and match too slow |
+| URLPattern linear | 831.38 ms | rss +452.08 MB | last-match 103.11 ms/op | not measured | not viable as N-pattern router; unit is ms/op, unlike ns/op rows above |
+| Bun.serve routes | build-timeout >180s | route object prep later measured separately | not available | not available | phase split below shows prep completes and `Bun.serve()` init does not complete within the 100k gate |
+
+External baseline caveats:
+
+- The external table is static-only. It must not be generalized to param, wildcard, mixed, or security semantics.
+- Adapters must be upgraded to verify exact value, params, wildcard capture, wrong method, and falsy values.
+- Lazy-build routers must include first-match compile time/memory or report it as a separate phase.
+- `Bun.serve` must be split into route object preparation, `Bun.serve()` initialization, and first request latency before any suitability conclusion.
+- `current router` and external `zipbul` memory values are not directly comparable until the harness, import path, GC timing, and route shape are unified.
+
+Candidate reproduction:
+
+| Candidate | Result | Decision |
+| ---------------------------- | ----------: | ------------------------------------------------ |
+| method-first static table | 2.63 ns/op | current shape remains viable |
+| path-first method array | 1.70 ns/op | must test end-to-end; promising for static table |
+| static-first then cache | 3.43 ns/op | likely better than cache-first for static-heavy |
+| cache-first then static | 3.80 ns/op | current order may be suboptimal for static-heavy |
+| miss-cache check then static | 3.91 ns/op | miss cache before static can hurt static-heavy |
+| `indexOf` segment scan | 29.11 ns/op | baseline |
+| manual segment scan | 22.97 ns/op | promising but must validate in walker end-to-end |
+
+Facts before implementation:
+
+- Current cache-hot repeated lookup is very fast at 100k for static, param, mixed, and high-fanout shapes.
+- Cold static-table path, dynamic walker path, high-cardinality cache churn, and first-match latency are not yet proven by the current 100k numbers.
+- 100k param memory is too high and must drive metadata/factory/terminal compaction.
+- 100k mixed build time is unacceptable. Wildcard/static conflict validation is a strong candidate root cause, but phase instrumentation must prove it.
+- Static-only hit is not best-in-class; `rou3` and `hono-regexp` are faster on static hit, so static table layout/order is a real optimization target.
+- URLPattern linear scanning is not a suitable N-pattern replacement in this harness. Bun native routes remain inconclusive until phase split is measured.
+
+### 5.1. Implementation Feasibility Reproduction
+
+These checks were run after the initial document review to decide whether the plan is implementable or still speculative.
+
+Commands:
+
+```sh
+bun packages/router/bench/100k-verification.ts '100k versioned-api'
+bun packages/router/bench/100k-verification.ts '100k wildcard-heavy'
+bun packages/router/bench/100k-gate-runner.ts
+bun packages/router/bench/100k-verification.ts wildcard-conflict-feasibility
+bun -e ""
+bun -e ""
+bun -e ""
+```
+
+100k added scenario results:
+
+| Shape | Add+build | Memory delta (MiB-style harness MB) | First hit range | Warmed hit probe min-max | Warmed miss probe min-max | Verdict |
+| ------------------- | ---------: | -----------------------------------------------------: | --------------: | -----------------------: | ------------------------: | ------------------------------------------------------------------- |
+| 100k versioned-api | 1066.19 ms | rss +532.89 MB, heap +125.22 MB, arrayBuffers +0.00 MB | 56.51-348.28 us | 18.48-24.39 ns/op | 15.58-18.29 ns/op | feasible, build above Aggressive target, first-hit must be profiled |
+| 100k wildcard-heavy | 546.06 ms | rss +424.37 MB, heap +196.13 MB, arrayBuffers +0.00 MB | 37.34-346.27 us | 17.71-18.49 ns/op | 15.81-16.50 ns/op | feasible, memory high, first-hit must be profiled |
+
+Wildcard/static conflict scaling:
+
+| Wildcards | Statics | Routes | Add+build | Verdict |
+| --------: | ------: | -----: | ----------: | --------------------------------- |
+| 1,000 | 1,000 | 2,000 | 84.12 ms | acceptable |
+| 5,000 | 5,000 | 10,000 | 1062.14 ms | already high |
+| 10,000 | 10,000 | 20,000 | 4096.85 ms | superlinear bottleneck reproduced |
+| 25,000 | 25,000 | 50,000 | 26280.32 ms | unacceptable |
+
+Interpretation:
+
+- `100k versioned-api` and `100k wildcard-heavy` are feasible to build and match in the current architecture.
+- The required 100k scenario coverage gap is now closed in the local harness, but the results are still single-run snapshots.
+- Disjoint wildcard/static scaling reproduces the same class of build blow-up as `100k mixed`. The wildcard conflict index/trie is no longer a speculative idea; it is the primary build-feasibility fix to implement and verify.
+- The conflict scaling check is not a full phase profiler. Final approval still requires internal phase timers around parse, optional expansion, static insert, dynamic insert, wildcard conflict check, snapshot build, and codegen.
+
+Fresh-process 30-run gate (RUNS=30, sample of 30 fresh `bun` processes per scenario, true median/p75/p99 from sorted distribution):
+
+| Shape | Build median / p75 / p99 | RSS median | Heap median | First median / p75 / p99 | Warmed hit median / p75 / p99 | Warmed miss median / p75 / p99 | Target interpretation |
+| ------------------- | -----------------------------------: | ---------: | ----------: | -----------------------------: | ----------------------------: | -----------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 100k static | 247.87 / 254.74 / 265.65 ms | 223.56 MiB | 90.30 MiB | 25,050 / 174,851 / 222,012 ns | 19.17 / 24.24 / 37.11 ns | 16.25 / 16.84 / 18.74 ns | build passes Aggressive (250 ms p75) but p99 fails; warmed hit p99 passes Aggressive; first-match p99 fails Guard 10us by 22x |
+| 100k param | 586.56 / 598.10 / 636.15 ms | 698.45 MiB | 126.20 MiB | 51,523 / 338,554 / 488,041 ns | 18.65 / 19.12 / 21.69 ns | 16.44 / 16.97 / 22.65 ns | build passes Aggressive; RSS fails Guard 390.63 MiB by 1.79x; warmed hit p99 passes Stretch; first-match p99 fails Guard by 49x |
+| 100k mixed | 20,993.67 / 21,186.12 / 23,715.17 ms | 486.32 MiB | 163.84 MiB | 193,929 / 215,303 / 286,707 ns | 18.92 / 20.71 / 22.63 ns | 15.08 / 15.69 / 17.73 ns | build fails Guard 3000 ms by 7.9x at p99; RSS fails Guard by 1.24x; warmed hit p99 passes Stretch; first-match p99 fails Guard by 29x |
+| 100k high-fanout | 263.30 / 267.49 / 285.74 ms | 209.68 MiB | 90.09 MiB | 31,779 / 172,213 / 302,059 ns | 18.80 / 30.25 / 50.31 ns | 16.28 / 17.11 / 24.04 ns | build passes Aggressive at median, p99 just fails; RSS passes Aggressive; warmed hit p99 passes Aggressive only; first-match p99 fails Guard by 30x |
+| 100k versioned-api | 741.51 / 761.11 / 787.60 ms | 475.50 MiB | 172.33 MiB | 97,013 / 333,336 / 432,776 ns | 20.42 / 23.12 / 26.63 ns | 16.97 / 18.28 / 19.64 ns | build passes Aggressive 750 ms median, p99 fails; RSS fails Guard; warmed hit p99 passes Aggressive; first-match p99 fails Guard by 43x |
+| 100k wildcard-heavy | 464.76 / 473.63 / 490.35 ms | 428.79 MiB | 193.90 MiB | 88,093 / 329,905 / 480,246 ns | 18.12 / 18.52 / 19.99 ns | 16.49 / 16.98 / 19.30 ns | build passes Aggressive; RSS fails Guard; warmed hit p99 passes Stretch; first-match p99 fails Guard by 48x |
+
+Interpretation:
+
+- The 30-run fresh-process gate is now executed for all six required 100k shapes (`static`, `param`, `mixed`, `high-fanout`, `versioned-api`, `wildcard-heavy`); `bun packages/router/bench/100k-gate-runner.ts` defaults to all six and `RUNS` env var controls the sample count.
+- p99 is now a true 30-sample percentile rather than the prior `max-of-3` proxy; this removes the §14.3 line 670 "tail latency excellence not proven" caveat at the partial-gate level for these six shapes.
+- `100k mixed` build p99 is the dominant remaining failure; it is gated by the static/wildcard conflict scan documented at lines 425–441 and is the primary target of §13 Phase 4.
+- `100k param` RSS p99 stays at 698.45 MiB, gated by segment node / terminal slot count documented at lines 466–478 and is the primary target of §13 Phase 7.
+- First-match p99 fails Guard 10 us across all shapes by 22x to 49x; this is the primary target of §13 Phase 6 codegen preflight + warmup strategy.
+- Warmed hit/miss p99 already meets Aggressive everywhere and Stretch on `mixed`, `param`, `wildcard-heavy`; primitive selection (object lookup, bitmask, offset params) is empirically validated.
+
+Earlier 3-run partial gate (preserved for traceability):
+
+| Shape | Build median / p75 / p99 (3-run, p99=max) | RSS median | Heap median | First p99 | Warmed hit p99 | Warmed miss p99 |
+| ------------------- | ----------------------------------------: | ---------: | ----------: | --------: | -------------: | --------------: |
+| 100k static | 271.80 / 291.89 / 291.89 ms | 220.06 MiB | 92.98 MiB | 206.11 us | 33.75 ns | 18.26 ns |
+| 100k param | 589.34 / 674.47 / 674.47 ms | 688.91 MiB | 128.82 MiB | 370.93 us | 19.39 ns | 17.31 ns |
+| 100k high-fanout | 246.64 / 255.55 / 255.55 ms | 210.07 MiB | 87.92 MiB | 203.65 us | 29.77 ns | 16.83 ns |
+| 100k versioned-api | 790.79 / 867.14 / 867.14 ms | 473.83 MiB | 171.57 MiB | 364.68 us | 27.54 ns | 19.61 ns |
+| 100k wildcard-heavy | 466.68 / 537.27 / 537.27 ms | 426.41 MiB | 200.28 MiB | 376.63 us | 18.51 ns | 17.47 ns |
+
+The 3-run row values agree with 30-run medians within 1–4% drift, confirming sample stability across run counts. `100k mixed` is now also covered by the 30-run gate (was missing from the 3-run table).
+
+Correctness RED checks:
+
+| Check | Current result | Verdict |
+| ------------------------------------------- | ---------------------------------------------------------- | -------------------------------------- |
+| empty method | accepted | defect reproduced |
+| space method `GET POST` | accepted | defect reproduced |
+| registration query `/a?b` | accepted | defect reproduced |
+| registration fragment `/a#b` | accepted | defect reproduced |
+| registration control char | accepted | defect reproduced |
+| registration dot segment `/a/../b` | accepted | defect reproduced |
+| malformed percent `/a/%ZZ` | accepted | defect reproduced |
+| `optionalParamBehavior: 'omit'` missing key | returns `id: undefined` | **superseded by task 7** |
+| params mutation then same-path match | second match returns original param and `sameParams=false` | current cache-safe semantics confirmed |
+
+**Task 7 RED test re-verification (`test/red-defects.test.ts`, 22 fixtures)**: the `optionalParamBehavior: 'omit'` row above is **outdated**. Current code (`builder/optional-param-defaults.ts` lines 16/24/41 + `pipeline/registration.ts` line 191 + `codegen/emitter.ts` factory body lines 458–467) correctly omits the missing optional key; `'in' params` returns `false` in omit mode and `true` (with `undefined` value) in `set-undefined` mode. Both semantics pass `bun test test/red-defects.test.ts -t "optionalParamBehavior"`. The remaining 18 of 22 fixtures (method validation 5 + path registration validation 8 + runtime secure scanner 5) still RED — those are the actual implementation targets for §13 Phase 1 + Phase 2. Params cache mutation safety is locked GREEN by the same RED suite.
+
+Implementation readiness after feasibility checks:
+
+- Implementation-ready: optional behavior pass-through, method token validation, registration path validation, wildcard conflict index/trie, params factory double-call removal with cache-safe params semantics.
+- Gate-evolved: §5.1 fresh-process **30-run** gate now covers all six required shapes including `100k mixed` (default scenario list updated in `packages/router/bench/100k-gate-runner.ts`); the earlier 3-run table is preserved for traceability with 1–4% drift vs 30-run medians.
+- Evidence-confirmed: exact internal 100k mixed phase timers confirm wildcard/static conflict scan as the dominant build bottleneck.
+- Evidence-confirmed: codegen telemetry confirms oversized source is generated before source-budget bail.
+- Evidence-confirmed: cache traversal probes, dynamic external baselines, Bun.serve 10k/100k phase split, Bun heap profile attempt, and 100k param internal object counters have been run.
+- Remaining truth boundary: full byte-accurate RSS attribution is not available from Bun heap snapshots. Optimization must be driven by measured internal object counters, fresh-process RSS gates, and before/after deltas.
+
+Additional pre-implementation measurements:
+
+Mixed phase proxy:
+
+| Proxy shape | Routes | Add+build | Interpretation |
+| --------------------- | ------: | ----------: | ----------------------------------------- |
+| mixed static-only | 25,000 | 65.55 ms | cheap alone |
+| mixed GET param-only | 25,000 | 121.38 ms | cheap alone |
+| mixed POST param-only | 25,000 | 84.26 ms | cheap alone |
+| mixed wildcard-only | 25,000 | 82.14 ms | cheap alone |
+| full 100k mixed | 100,000 | 38697.61 ms | blow-up appears only when shapes interact |
+
+Interpretation:
+
+- Full mixed build cost is not explained by individual shape insertion cost.
+- The interaction pattern strongly supports wildcard/static conflict scanning as the dominant pre-implementation bottleneck.
+- Internal diagnostics confirmed the same conclusion: full 100k mixed spent `39191.62 ms` in static/wildcard conflict checks, with `312,487,500` wildcard prefix scans.
+- Wildcard conflict index implementation is now mandatory before broader build refactors.
+- Current-router snapshot row above is a single-run non-diagnostics scenario. The 3-run table below is the same harness repeated. The internal diagnostics table is a separate instrumentation run and is intentionally slower.
+
+100k mixed same-harness 3-run closure:
+
+| Run | Add+build | RSS delta | Heap delta | First-hit max | Warmed hit max | Miss max |
+| --: | ----------: | ----------: | ----------: | ------------: | -------------: | ----------: |
+| 1 | 21263.44 ms | +480.14 MiB | +176.20 MiB | 259.40 us | 18.85 ns/op | 13.83 ns/op |
+| 2 | 20934.73 ms | +478.77 MiB | +166.17 MiB | 207.49 us | 18.91 ns/op | 13.39 ns/op |
+| 3 | 21330.79 ms | +476.19 MiB | +166.90 MiB | 274.15 us | 19.18 ns/op | 15.13 ns/op |
+
+Interpretation:
+
+- Same-harness 100k mixed build is stable around 21 seconds and fails the 3,000 ms Guard by roughly 7x.
+- The 38.7-40.3 second measurements are diagnostics/proxy runs with additional instrumentation and must not be mixed into the same statistical row.
+- The phase timer still proves the same root cause under diagnostics: static/wildcard conflict scanning dominates the inflated diagnostic run.
+
+Internal mixed diagnostics:
+
+| Metric | 100k mixed |
+| ------------------------ | ----------: |
+| total add+build | 40263.41 ms |
+| parse | 331.10 ms |
+| wildcard name conflict | 53.19 ms |
+| static/wildcard conflict | 39191.62 ms |
+| static insert | 77.73 ms |
+| optional expansion | 11.22 ms |
+| dynamic insert | 167.62 ms |
+| factory generation | 48.06 ms |
+| snapshot | 11.24 ms |
+| wildcard conflict checks | 24,999 |
+| wildcard prefix scans | 312,487,500 |
+
+Diagnostics residual note: listed phase timers account for the dominant measured phases, but their sum does not equal total add+build. The residual includes loop overhead, diagnostics accounting overhead, codegen/snapshot-adjacent work not separately listed, and general runtime/GC noise.
+
+Cache and traversal feasibility:
+
+| Probe | Result | Interpretation |
+| ------------------------------- | ------------: | -------------------------------------------------------------------- |
+| cache-hot dynamic same path | 18.15 ns/op | cache retrieval is excellent |
+| cache-churn dynamic unique-ish | 1090.62 ns/op | uncached/churn dynamic traversal is much slower than hot-loop values |
+| wrong-method dynamic unique-ish | 396.23 ns/op | wrong-method path needs separate gate |
+| 404 dynamic unique-ish | 551.66 ns/op | 404 path needs separate gate |
+
+Heap profile attempt:
+
+| Probe | Result |
+| ----------------------------- | ------------------------------- |
+| `bun --heap-prof 100k param` | heap snapshot generated |
+| scenario memory | rss +687.48 MB, heap +125.20 MB |
+| heap snapshot size | 368 KB |
+| heap snapshot total self size | 1.19 MB |
+| top self-size type | `code` 824,860 bytes |
+
+Interpretation:
+
+- Bun heap snapshot did not explain the 687 MB RSS delta.
+- RSS/object attribution remains unresolved and requires additional instrumentation beyond the current heap snapshot, such as internal object counters and retained structure accounting.
+- Internal diagnostics narrow the `100k param` retained-structure candidate set: `500,001` segment nodes, `200,001` static child maps, `200,000` param nodes, `100,000` terminals, and `100,000` terminal params-factory slots.
+- A corrected diagnostic run showed only `1` unique params factory function for the `100k param` shape. Therefore "100,000 params factories" is false for this shape; the memory target is the terminal slot array and segment tree objects, not duplicated factory functions.
+- The next memory implementation must start with segment tree/terminal-slot compaction, not generic RSS guessing.
+
+100k param internal diagnostics:
+
+| Metric | Value |
+| ------------------------------- | --------: |
+| routes | 100,000 |
+| segment nodes | 500,001 |
+| static child maps | 200,001 |
+| param nodes | 200,000 |
+| terminals | 100,000 |
+| params factory slots | 100,000 |
+| unique params factory functions | 1 |
+| parse | 174.38 ms |
+| dynamic insert | 128.47 ms |
+| factory generation | 35.56 ms |
+
+Dynamic external baselines:
+
+| Router | Scenario | Build | RSS delta | Hit latency | Miss latency | Verdict |
+| --------------- | ---------- | ------------: | ---------------------------: | ------------------: | -----------: | ---------------------------------------------------------------------------------------------------------------- |
+| zipbul current | 100k param | 863.79 ms | +679.93 MB | 18.16-19.34 ns/op | 17.68 ns/op | fastest warmed match in this dynamic external table; high RSS and first-match/profile gates still block approval |
+| rou3 | 100k param | 121.24 ms | +115.88 MB | 126.21-145.12 ns/op | 68.15 ns/op | much lower build/RSS, slower match |
+| hono-trie | 100k param | 207.73 ms | +215.83 MB | 422.88-683.47 ns/op | 106.58 ns/op | lower build/RSS, much slower match |
+| memoirist | 100k param | 64648.37 ms | +87.52 MB | 72.05-118.63 ns/op | 29.12 ns/op | low RSS, build too slow |
+| koa-tree-router | 100k param | 128.49 ms | +175.33 MB | 266.78-456.98 ns/op | 70.33 ns/op | lower build/RSS, slower match |
+| hono-regexp | 100k param | failed | +51.47 MB before first match | n/a | n/a | first match throws `SyntaxError: Invalid regular expression: regular expression too large` |
+| find-my-way | 100k param | >120s timeout | n/a | n/a | n/a | build did not complete within the stricter per-run timeout; external baseline policy allows up to 180s |
+
+Interpretation:
+
+- Current zipbul's warmed dynamic match latency is externally competitive, but RSS is not.
+- External routers prove the 100k param memory target can be far below current zipbul's RSS, but their warmed match/build trade-offs differ.
+- The implementation target is therefore not a full algorithm replacement by a generic external shape. It is segment/terminal memory compaction while preserving the current cache-hot match path.
+
+Codegen diagnostics:
+
+| Shape | Event | Source generated before bail | Emit time | Interpretation |
+| ------------------- | --------------------- | ---------------------------: | ------------------------: | ---------------------- |
+| 100k param | source-budget bail | 124,733,430 chars | 271.48 ms | preflight is mandatory |
+| 100k wildcard-heavy | source-budget bail | 72,436,417 chars | 116.14 ms | preflight is mandatory |
+| 100k versioned-api | source-budget bail x4 | ~19,486,210 chars per method | 57.84-82.54 ms per method | preflight is mandatory |
+
+Interpretation:
+
+- Current codegen pays large source construction cost before rejecting oversized walkers.
+- Codegen preflight must estimate size before source generation, not after.
+
+Bun.serve phase split:
+
+| Routes | Route object prep | `Bun.serve()` init | Memory delta (MiB-style harness MB) | Request latency | Verdict |
+| ------: | ----------------: | ------------------: | --------------------------------------: | -----------------------: | -------------------------------------------------- |
+| 10,000 | 6.31 ms | 13377.53 ms | rss +59.90 MB, heap +4.15 MB | 173.99-249.73 us/request | init already too slow at 10k |
+| 100,000 | 60.27 ms | build-timeout >180s | prep-only rss +64.88 MB, heap +28.39 MB | n/a | prep completes; init does not complete within gate |
+
+Interpretation:
+
+- Native `Bun.serve({ routes })` is not a viable replacement for this in-process 100k router profile unless Bun native route initialization changes substantially.
+- The 100k phase split confirms route object preparation is not the blocker. Because init never completed, the claim is limited to "init phase did not complete within the gate"; no init-internal memory/phase breakdown is available.
+
+Pre-implementation closure:
+
+| Check | Result | Decision |
+| --------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------ |
+| `bun test` | 557 pass, 5 fail | RED confirmed before implementation |
+| optional omit tests | 4 failures return missing optional as `undefined` | implementation must fix optional omit pass-through/cache behavior |
+| perf guard internal snapshot test | `snapshot.terminals` is undefined | test is stale against current snapshot shape and must be corrected to the real terminal metadata field |
+| `bun run build` | failed | current source has build-blocking type errors before optimization work |
+| build failure class | `MatchFn` is imported from `match-state` but not exported; `segment-compile.ts` also has a `string | undefined` argument error | fix type/export boundary before final green gate |
+
+Closure decision:
+
+- Pre-implementation feasibility checks are closed enough to start implementation.
+- "Perfect optimization" is not claimed. The bounded facts are: warmed match is already strong, RSS/build have measured bottlenecks, native `Bun.serve` is not viable for 100k in this profile, and the first implementation pass must be RED-GREEN against the listed defects and gates.
+- Every optimization must re-run the 100k fresh-process gate and compare build time, RSS, first-match, warmed hit, miss, wrong-method, and cache-churn numbers before being accepted.
+
+Review closure log:
+
+| Review issue | Closure |
+| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| MB/MiB ambiguity | Memory target equivalents now use `MiB`; historical harness `MB` labels are defined as MiB-style output. |
+| `Ready` ambiguity | Split into `Implementation-ready`, `Gate-partial`, and `Evidence-confirmed`. |
+| Missing 100k mixed 3-run | Same-harness 3-run added; diagnostics/proxy runs are explicitly separated from statistical rows. |
+| Wildcard 10x target missing derivation | 10x is derived from `26280.32 / 3000 = 8.76x` plus validation/snapshot headroom; this is a best-case proxy because the 50k disjoint stress and 100k mixed Guard are different workloads. |
+| Regex disjointness undefined | Secure/default uses conservative AST-only disjointness; unknown overlap rejects. |
+| Numeric regex range disjointness underspecified | Numeric range disjointness is explicitly unsupported until a dedicated range parser spec exists. |
+| `?` query vs optional decorator ambiguity | Registration parse order and boundary fixtures are specified. |
+| Codegen compile-time gate ambiguity | Preflight hard gates and post-compile observed telemetry gates are separated. |
+| 32-method limit justification | Defined as a scoped bitmask performance cap with explicit `method-limit` failure and enterprise scope `<= 32` methods. |
+| 64+ method support question | Added as a P3 measured fallback candidate using two `Uint32` masks, `BigInt`, or sparse method table. |
+| HEAD/OPTIONS standards caveat | Router-layer no-fallback policy now states that service-layer HEAD/OPTIONS behavior remains application/server responsibility. |
+| code-cache pressure proxy undefined | Proxy is defined as generated function count, source bytes, compile wall time, first-call latency, RSS delta, and profiling symptoms; not byte-accurate JSC code-cache occupancy. |
+| RSS attribution gap | Byte-accurate RSS attribution remains unavailable from Bun heap snapshots; implementation acceptance uses internal object counters plus fresh-process before/after RSS deltas. |
+| versioned-api/wildcard-heavy target gaps | Dedicated planning bands and final gate rows added. |
+| strict `?`/`#` delimiter policy | Runtime normalization now uses secure raw-`#` no-match and first-`?` query stripping. |
+| percent-decoding completeness | Single-decode/no-double-decode, overlong UTF-8 rejection, and mixed-case dot fixtures added. |
+| Phase 4 prefix-index spec gap | Prefix trie counters, regex sibling policy, complexity caveats, and pseudocode added. |
+| Phase 5 RED benchmark wording | Microbench row is candidate-selection evidence only; default adoption requires fresh-process end-to-end proof. |
+| maxExpandedRoutes surface wiring | Added to hard limits, options schema, defaults, Infinity rejection, issue kinds, and Phase 4 enforcement (see §7.2 security/options and §13 Phase 4 pseudocode). |
+| Match phase normalization sync | Section 9.2 and Phase 2 now mirror the section 7.2 path-policy ordering. |
+| Phase 4 route mutation contract | Pseudocode now validates with a staging plan before committing trie mutations for a route (see §13 Phase 4 `validateExpandedRoute`/`commitExpandedRoute`). |
+| RFC by-number traceability | Added RFC 3986 §3.3/§3.5/§6.2.2.1 and RFC 3629 §3/§10 citations. |
+| Wildcard/static issue-kind symmetry | Same collision class must emit the same issue kind regardless of registration order; wildcard/static reachability emits `route-unreachable`. |
+| Regex sibling release gate | `maxRegexSiblingsPerSegment` is included in target bands and correctness gate fixtures. |
+| Regex-sibling RED/GREEN audit | `regex-sibling-limit` has dedicated issue kind, RED fixture, GREEN criterion, target band, and correctness gate entry (see §7 issue kinds, §13 Phase 4 RED/GREEN, §14.2). |
+| Phase 4 control-flow cleanup | Dead-store/redundant pseudocode issues were removed through staged validation and commit-only mutation (see §13 Phase 4 `planEdge` and `commitEdge`). |
+| Subtree wildcard self-count audit | `subtreeWildcardCount` prose now matches the ancestor-inclusive commit loop (see §13 Phase 4 algorithm and `commitExpandedRoute`). |
+| Phase 2 scanner mirror | Phase 2 now uses the same six-step normalization wording as section 7.2. |
+| Subtree wildcard prose precision | Clarified that the prefix attachment node, not a separate wildcard node, receives `subtreeWildcardCount++`. |
+| §8.6 wildcard/regex/expansion policy rows | Added wildcard/static, wildcard/wildcard, regex-sibling, and expansion-total rows to the conflict policy table. |
+| Wildcard/wildcard issue-kind rationale | Documented `route-unreachable` because the later wildcard is fully covered by the prior wildcard's suffix space. |
+| Param-child duplicate wording | Replaced ambiguous duplicate/conflict wording with explicit `route-duplicate`. |
+| Expansion counter lifetime | `totalExpandedRoutes` is specified as a per-build/seal batch counter initialized to 0 before validating pending routes. |
+| Phase 4 helper contracts | Added `createNode`, `createRegexNode`, `rootFor`, `safeRegexDisjoint`, `sameRegexAst`, `optionalExpansions`, and `sameTerminalIdentity` contracts. |
+| Phase 4 node metadata | Added `regexAst` and `terminalMeta` to make regex conflict checks and terminal alias diagnostics implementable from the spec. |
+| Cache/options defaults | Added `cacheSize`, `optionalParamBehavior`, `path-encoded-control`, and `option-invalid` surfaces across schema/defaults/issues/gates. |
+| Expansion cap enforcement | Added per-route `maxOptionalExpansions` and global `maxExpandedRoutes` pseudocode emit sites. |
+| Alias-terminal handling | Same terminal identity now aliases successfully instead of emitting `route-duplicate`; differing identity emits `route-conflict`. |
+| Alias context guard | Alias success is limited to optional-expansion routes; ordinary duplicate `add()` still emits `route-duplicate`. |
+| Regex same-AST child reuse | Same-position regex params with identical safe-regex AST merge as the same regex child before disjointness checks. |
+| Runtime safety policy | Added runtime regex sibling priority, build/seal concurrency policy, immutable-snapshot concurrent match policy, and §14.2 fixtures. |
+| §0 implementation language scope | TypeScript only on Bun JSC explicitly stated; WASM, native bindings, cross-runtime targets removed from candidate set. |
+| §5.2 Profile Gate executed | `bun --cpu-prof` (mixed `checkStaticWildcardConflict` 91.12%), `bun --heap-prof` (1.19 MiB exposed of ~700 MiB RSS), JSC shape stability, freeze/clone, `new Function` telemetry, perfect hash POC — all six executed and inlined. |
+| §5.3 Tier-1 re-verification | mitata + `do_not_optimize` re-runs confirm Map 1.99× faster, freeze 6.1× slower, clone-on-hit preferred at ≥5 keys, first-call median 221 ns at 16 nodes (1차 27 us는 instrumentation noise — superseded). |
+| §5.4 Tier-2 follow-ups | Cuckoo hash + sealed/frozen + realistic walker measured. Cuckoo REJECT (2.8× slower under TS scope), sealed/frozen no measurable benefit, realistic walker 184.94 ns reference. |
+| Phase 3 lock-in | clone-on-hit (spread) chosen; Object.freeze rejected. §13 Phase 3 line 1834 and §8.3 line 1324 updated. |
+| Phase 4b/4c/5b added | New Phase 4b (segment-tree insertion for wildcard-heavy), Phase 4c (compileStaticRoute for high-fanout), Phase 5b (object vs Map static-table representation) inserted in §13. |
+| Phase 6 algorithm revised | Codegen budget tightened to ≤16 nodes (p99) / ≤32 (p75 with warmup) per §5.3 D; build-time first-call warmup + iterative fallback locked. |
+| §10 Cuckoo / Bun.hash REJECT | Both perfect-hash variants under TS scope empirically rejected; §10 prose updated. |
+
+### 5.2. Pre-implementation Profile Gate (§14.5 verification, executed)
+
+Six §14.5-required investigations were executed before any §13 implementation work. Scripts and outputs are reproducible:
+
+```sh
+bun --cpu-prof packages/router/bench/100k-verification.ts '100k mixed'
+bun --heap-prof packages/router/bench/100k-verification.ts '100k param'
+bun packages/router/bench/jsc-shape-stability.ts
+bun packages/router/bench/freeze-vs-clone.ts
+bun packages/router/bench/new-function-telemetry.ts
+bun packages/router/bench/perfect-hash-poc.ts
+```
+
+**1. CPU profile of `100k mixed` (`bun --cpu-prof`)**:
+
+| Top function | Samples | Share |
+| ---------------------------------------------------------- | --------------: | ---------: |
+| `checkStaticWildcardConflict` (`pipeline/registration.ts`) | 18,391 / 20,183 | **91.12%** |
+| `next` | 794 | 3.93% |
+| `insertIntoSegmentTree` | 116 | 0.57% |
+| `stringSplitFast` | 113 | 0.56% |
+| `gc` | 82 | 0.41% |
+
+The static/wildcard conflict scan dominates 91.12% of CPU time, confirming the §5.1 line 425–441 phase timer (39,191 ms / 312,487,500 scans) at the sample level. §13 Phase 4 wildcard prefix index is the correct target.
+
+**2. Heap profile of `100k param` (`bun --heap-prof`)**:
+
+| Top heap type | Self size | Share of dumped heap |
+| ------------------------ | -----------: | -------------------: |
+| `code:FunctionCodeBlock` | 565 KiB | 46.57% |
+| `object:ModuleRecord` | 123 KiB | 10.11% |
+| `object shape:Structure` | 96 KiB | 7.88% |
+| Total dumped heap | **1.19 MiB** | 100% |
+
+Bun heap snapshot exposes only 1.19 MiB out of the ~700 MiB process RSS for this scenario, confirming §5.1 line 387 truth boundary: byte-accurate RSS attribution is not available from Bun heap snapshots. The dumped heap shows JSC metadata (code blocks, structures), not user object payload. Internal object counters (segment nodes, terminal slots, factories) remain the authoritative attribution path.
+
+**3. JSC object shape / dictionary-mode evidence (`jsc-shape-stability.ts`)**:
+
+| Probe | ns/op |
+| ------------------------------------------ | -------------: |
+| sealed null-proto, 100k keys lookup | 27.93 |
+| dictionary-mode null-proto (post mutation) | 27.31 |
+| `Map` 100k get | 26.68 |
+| small null-proto, 4 keys (IC fast path) | 3.27 |
+| null-proto MISS lookup, 100k sealed | 11.25 |
+| 200-key structure transition (avg / max) | 441 / 5,584 ns |
+
+The §1 microbench "object lookup 1.12 ns" is valid for **small key sets where JSC inline cache (IC) succeeds**. At 100k keys the IC fast path is replaced by hash table lookup at ~27 ns, and `Map` is essentially equivalent (26.68 ns). Method dispatch (≤32 keys) and segment-trie child lookup (small fanout per node) retain the 1.12 ns IC fast path. Static full-path tables at 100k benefit only marginally over `Map`, and the dictionary-mode penalty after key churn is negligible (27.31 vs 27.93).
+
+**4. `Object.freeze` vs clone-on-hit cost (`freeze-vs-clone.ts`)**:
+
+| Option | ns/op | Notes |
+| --------------------------------------------- | --------: | --------------------------------- |
+| Fresh object literal `{...}` | 6.63 | factory baseline |
+| `Object.freeze({...})` per call | **40.76** | 6.1× slower — reject for hot path |
+| Clone-on-hit (spread `{...cached}`) | **12.77** | 1.93× slower — viable |
+| Proxy wrapper per call | 23.41 | 3.5× slower |
+| Read frozen `.id` | 2.14 | reading a frozen object is free |
+| Read mutable `.id` | 2.64 | reading a mutable object is free |
+| substring materialize from Int32Array offsets | 26.55 | factory step (2 params) |
+| substring + `Object.freeze` | 58.95 | 2.2× over plain factory |
+
+**Phase 3 decision locked**: cache-safe params semantics use **clone-on-cache-hit (spread)**, not `Object.freeze`. `Object.freeze` is rejected on the hot path due to 6.1× per-call cost. This supersedes the §13 Phase 3 line 1389 "frozen cached params or clone-on-cache-hit" two-option choice.
+
+**5. `new Function` compile/first-call/code-cache pressure (`new-function-telemetry.ts`)**:
+
+| Walker nodes | Source size | Compile time | First-call | Warmed | Notes |
+| --------------------------------------------------: | ----------: | -----------: | -----------: | --------: | ----------------------------------------------- |
+| 16 | 1.1 KiB | 0.02 ms | **27 us** | 60 ns | first-call already exceeds Guard 10 us |
+| 64 | 4.2 KiB | 0.11 ms | **97 us** | 100 ns | 9.7× over Guard |
+| 256 | 16.9 KiB | 0.18 ms | **350 us** | 429 ns | 35× over Guard |
+| 1,024 | 67.9 KiB | 0.43 ms | **1,276 us** | 1,742 ns | 127× over Guard |
+| 4,096 | 277.9 KiB | 1.34 ms | **6,144 us** | 20,622 ns | 614× over Guard |
+| Code-cache pressure proxy: 200 functions × 64 nodes | | | | | RSS delta +192 KiB total, **0.96 KiB/function** |
+
+`new Function` compile time itself is cheap (≤1.34 ms even at 4,096 nodes), but the **first-call latency is dominated by JIT tier-up and exceeds the §6 Guard `first-match p99 ≤ 10 us` for every walker size**. Even a 16-node walker costs 27 us first-call.
+
+**Phase 6 implication — Guard re-derivation required**: the §6 line 642 first-match Guard `<= 10 us` is unattainable by codegen alone. The viable strategies are (a) build-time first-call warmup that triggers JIT tier-up before the router is exposed to user traffic, (b) iterative non-codegen fallback for first-match path, or (c) a combined approach where codegen produces only the warmed hot path and an iterative walker serves first-match. Code-cache pressure at 0.96 KiB/function × 32 methods = ~30 KiB total; this is not a real budget concern.
+
+**6. Perfect hash + build-time `Bun.hash` POC (`perfect-hash-poc.ts`)**:
+
+| Option (100k key set) | Lookup ns/op | Build ns/key | Verdict |
+| -------------------------------------- | -----------: | -----------: | ------------------------------------------------------ |
+| null-proto object | 27.58 | 72.68 | baseline |
+| `Bun.hash` + open-address `Int32Array` | **113.69** | 112.95 | **4.1× slower lookup → reject perfect-hash candidate** |
+| **`Map`** | **15.53** | n/a | **1.78× faster lookup at 100k full-path scale** |
+
+The §10 line 1230 P3 "perfect hash" candidate is now empirically rejected: build-time `Bun.hash` plus open-address scan is 4.1× slower at lookup than the current null-proto object table. Build-time hash construction also costs 1.5× more than building the object table (113 vs 73 ns/key).
+
+**Surprise finding**: `Map` is 1.78× faster than the null-proto object at the 100k full-path scale. This contradicts the §1 line 65 "direct object static hit 3.44 ns/op" generalization for large maps. The §1 microbench reflects small key sets where JSC IC succeeds; at 100k keys, V8/JSC `Map` implementations win due to specialized hash table internals. Method-first sharding currently keeps each per-method bucket smaller (~3,125 routes per method on a balanced 32-method workload), where the gap may narrow, but the static table representation deserves a measured Phase 5b experiment: `per-method null-proto object` vs `per-method Map` end-to-end on `100k static`.
+
+**Profile gate closure**:
+
+- §14.5 line 2155 `bun --cpu-prof`: executed.
+- §14.5 line 2155 `bun --heap-prof`: executed; truth boundary reaffirmed.
+- §14.5 line 2168 JSC object shape evidence: executed; `1.12 ns` claim scoped to small key sets.
+- §14.5 line 2169 100k static buckets property lookup stability: executed; `Map` is 1.78× faster, demands Phase 5b decision.
+- §14.5 line 2170 `Object.freeze` vs clone cost: executed; `clone-on-hit` locked for Phase 3.
+- §14.5 line 2171 `new Function` compile/first-call/code-cache: executed; Phase 6 Guard requires non-codegen path or warmup.
+
+### 5.3. Tier-1 follow-up re-verification (mitata + dead-code-elim guard + distributions + variants)
+
+The §5.2 single-run microbench results were re-verified through six follow-ups using `mitata` for statistical accuracy, `do_not_optimize` to defeat dead-code elimination, and 100-sample distributions for tail behavior. New scripts: `bench/static-table-rerun.ts`, `bench/first-call-distribution.ts`, `bench/shape-and-freeze-variants.ts`.
+
+**B + A. `Map` vs null-proto object at 100k full-path scale (mitata, do_not_optimize, sharded and adversarial variants)**:
+
+| Probe | ns/iter (median) | p75 |
+| ------------------------------------------- | ---------------: | ----: |
+| null-proto object 100k | 27.71 | 28.73 |
+| sealed null-proto object 100k | 27.95 | 28.97 |
+| **`Map` 100k** | **13.87** | 17.23 |
+| sharded null-proto (32× ~3.1k) | 42.41 | 45.69 |
+| sharded `Map` (32× ~3.1k) | 25.11 | 29.13 |
+| collision-prone object (long shared prefix) | 33.89 | 34.80 |
+| collision-prone `Map` (long shared prefix) | 25.69 | 30.19 |
+| null-proto MISS (100k sealed) | 7.17 | 7.07 |
+| `Map` MISS (100k) | 8.63 | 8.54 |
+
+The §5.2 finding holds and is strengthened: **`Map` is 1.99× faster than null-proto object at 100k full-path scale** even with `do_not_optimize` defeating dead-code elimination. `Map` retains 1.32–1.90× advantage across diverse key distributions (short/long/shared-prefix/numeric/mixed-case). The dead-code-elimination suspicion is rejected.
+
+**Sharded vs unsharded surprise**: sharding into 32 buckets of ~3,125 keys each is **slower than the unsharded 100k table** (42 vs 28 ns for object, 25 vs 14 ns for `Map`). Indexing overhead (`i % SHARDS` + double dereference) outweighs the per-bucket IC benefit at this scale. This contradicts the §3 line 162 "Static routes are compiled into per-method null-proto buckets" assumption that method sharding alone improves lookup; the sharding is justified for routing semantics (different methods on the same path) but not for raw lookup speed.
+
+**MISS path**: null-proto object MISS (7.17 ns) is faster than `Map` MISS (8.63 ns). On a hot path with high miss rate, object retains a small edge.
+
+**End-to-end POC reversal at production-realistic shard size (task 15, `bench/poc-static-table-rep.ts`, 5-run fresh-process)**: The microbench reversal above measured `i % SHARDS` indexing as overhead. A production router does not pay that overhead because the method code is already a numeric value resolved before the static-table lookup (`tbl[methodCode][path]`, no modulo). When the harness mirrors that exact access pattern with **8 method × 12,500 routes/bucket** (production-realistic, not 32-shard adversarial), the result inverts:
+
+| Candidate | warmed hit ns | warmed miss ns | wrong-method ns | build ms | RSS MiB |
+| ------------------------------------------ | ------------------: | ----------------------: | -----------------------: | ---------------------: | -----------------: |
+| A1 per-method `Object.create(null)` | **7.59** | 16.26 | 21.22 | 19.1 | 14.1 |
+| A2 per-method `Map` | 9.43 (1.24× slower) | **8.44** (1.93× faster) | **11.91** (1.78× faster) | **6.7** (2.85× faster) | **9.6** (32% less) |
+| A3 single global `Map` (str composite key) | 73.65 | 64.56 | 65.56 | 13.2 | 13.9 |
+
+**Reconciled finding**: the §5.3 B 1.99× Map advantage holds for **unsharded 100k single-table lookup** but inverts for **per-method-shard hit path** that production routers actually use. A3 single-global-Map suffers 60–70 ns composite-key concatenation cost. **Static table representation is workload-aware**: hit-dominant API gateway → A1 object retained; miss/wrong-method/build/RSS optimization → A2 Map; A3 rejected. §13 Phase 5b decision matrix must encode this trade-off, not pick a single winner from the unsharded microbench alone.
+
+**E. JSC shape stability across diverse key distributions (`shape-and-freeze-variants.ts`)**:
+
+| Pattern | object 100k | Map 100k | Map advantage |
+| ------------- | ----------: | -------: | ------------: |
+| short | 27.08 | 12.73 | 2.13× |
+| long | 31.92 | 24.17 | 1.32× |
+| shared-prefix | 32.46 | 17.98 | 1.81× |
+| numeric | 29.41 | 15.50 | 1.90× |
+| mixed-case | 33.04 | 19.04 | 1.74× |
+
+Map advantage is robust across 5 key patterns (short, long, shared-prefix, numeric, mixed-case): 1.32× minimum, 2.13× maximum. The object representation does not degrade catastrophically on any pattern, but it is consistently slower than `Map` at this scale.
+
+**F. `Object.freeze` vs clone-on-hit with varying param count (`shape-and-freeze-variants.ts`)**:
+
+| Param count | fresh factory | `Object.freeze({...})` | clone-on-hit (spread) | clone vs fresh |
+| ----------: | ------------: | ---------------------: | --------------------: | ----------------------------: |
+| 2 | 11.90 ns | 44.42 ns | 14.11 ns | 1.19× slower |
+| 5 | 21.47 ns | 56.99 ns | 14.90 ns | **0.69× — faster than fresh** |
+| 10 | 41.36 ns | 80.57 ns | 21.90 ns | **0.53×** |
+| 20 | 88.56 ns | 137.43 ns | 26.70 ns | **0.30× (3.3× faster)** |
+
+**Phase 3 decision strengthens**: clone-on-hit is not merely "viable"; for routes with 5+ params it is faster than the fresh factory because the cached object is already constructed and only spread is required. At 20 params it is 3.3× faster than rebuilding the params object via factory. `Object.freeze` remains rejected (1.55× to 3.73× slower than fresh factory).
+
+**D. `new Function` first-call distribution (100 fresh compiles per node count, 10-call sequence)**:
+
+| Walker nodes | first med | first p75 | first p99 | first max | second med | 10th med |
+| -----------: | --------: | --------: | --------: | --------: | ---------: | -------: |
+| 16 | 221 ns | 311 | 6,447 | 22,919 | 205 | 199 |
+| 64 | 458 ns | 502 | 12,633 | 83,028 | 433 | 428 |
+| 256 | 1,552 ns | 1,589 | 14,857 | 276,427 | 1,514 | 1,511 |
+| 1,024 | 5,992 ns | 6,741 | 28,513 | 1,538,998 | 5,639 | 5,673 |
+
+The §5.2 #5 single-run result of 27 us first-call for a 16-node walker was **measurement instrumentation noise**. The 100-sample distribution shows first-call median **221 ns** for 16 nodes and **458 ns** for 64 nodes. p75 stays under 1 us through 64 nodes. Second and tenth call drop to ~200–460 ns and stabilize.
+
+**Phase 6 Guard re-derivation (corrected)**: the §6 line 642 first-match Guard `<= 10 us` is attainable for walker sizes up to 64 nodes at median and p75, but the p99 fails Guard at 64 nodes (12.6 us) and beyond. Strategies remain (a) per-method codegen budget capped near 32–48 nodes for the median/p75 path, (b) iterative fallback for routes that exceed the codegen size budget, (c) build-time first-call warmup that absorbs the JIT tier-up p99 outliers before the router is exposed to user traffic. Combined approach is recommended; pure codegen with unbounded walker size is not.
+
+**C. CPU profile across all six 100k shapes (other-than-mixed)**:
+
+| Scenario | Top hot function | Share |
+| -------------------------------------------------- | ---------------------------------------------------------- | ------------: |
+| `100k mixed` | `checkStaticWildcardConflict` (`pipeline/registration.ts`) | 91.12% |
+| `100k param` | `emitNode` (`codegen/segment-compile.ts`) | 27.1% |
+| `100k wildcard-heavy` | `insertIntoSegmentTree` (`matcher/segment-tree.ts`) | 18.5% |
+| `100k versioned-api` | `emitNode` | 19.0% |
+| `100k high-fanout` | `compileStaticRoute` (`pipeline/registration.ts`) | 14.0% |
+| `100k static` (sampled implicitly via mixed top-2) | `next` / `stringSplitFast` | 3.93% / 0.56% |
+
+The 91.12% `checkStaticWildcardConflict` cost is **scenario-specific to `100k mixed`**; other shapes spread their build cost across `emitNode`, `insertIntoSegmentTree`, `compileStaticRoute`, and `parseTokens` in the 14–27% range. `gc` is consistently 8–13% across shapes, so Phase 7 memory hygiene affects every shape uniformly.
+
+**Phase impact map by shape (corrected)**:
+
+- `100k mixed`: Phase 4 (wildcard prefix index) is the dominant fix.
+- `100k param` and `100k versioned-api`: Phase 6 (codegen preflight + warmup + iterative fallback) is the dominant fix.
+- `100k wildcard-heavy`: segment tree insertion path is the dominant fix; this is not currently called out as a numbered Phase and warrants a Phase 4b candidate.
+- `100k high-fanout`: `compileStaticRoute` cost suggests a Phase 4c candidate around static route compilation.
+- All shapes: Phase 7 GC/memory compaction matters at the 8–13% level.
+
+**Tier-1 follow-up closure summary**:
+
+- §5.2 single-run results were directionally correct in 5 of 6 cases.
+- **Corrected**: Phase 6 first-call cost (16-node median 221 ns, not 27 us); Guard 10 us is reachable for ≤32-node walkers at p75.
+- **Strengthened**: Map > object at 100k holds under mitata + do_not_optimize across 5 key distributions and adversarial collision-prone patterns.
+- **Strengthened**: clone-on-hit (spread) is faster than fresh factory at ≥5 params; this changes the Phase 3 decision from "viable" to "preferred".
+- **New**: sharding-into-32 makes lookup slower, not faster — caveat for any per-method optimization that argues from "smaller bucket = faster IC".
+- **Confirmed scoped**: 91.12% wildcard conflict bottleneck is specific to `100k mixed`; `100k param` / `versioned-api` need Phase 6 codegen rework, `wildcard-heavy` and `high-fanout` need new Phase 4b/4c candidates.
+
+### 5.4. Tier-2 follow-ups (Cuckoo hash, sealed/frozen, realistic walker)
+
+`bench/tier2-followups.ts` runs four further investigations under mitata + `do_not_optimize`:
+
+| Probe | Result | Decision |
+| ------------------------------------------------------------ | -------------: | ---------------------------------------- |
+| plain null-proto object lookup (100k) | 28.61 ns/iter | baseline |
+| `Object.preventExtensions` sealed lookup | 29.23 ns/iter | no measurable benefit over plain |
+| `Object.freeze` lookup | 28.02 ns/iter | no measurable benefit over plain |
+| `Map.get` | 14.87 ns/iter | **1.92× faster — third re-confirmation** |
+| Cuckoo hash (2 tables, TS-implemented djb2/FNV) | 80.26 ns/iter | **REJECT — 2.8× slower than object** |
+| realistic 64-route walker, 4 segments deep, codegen if-chain | 184.94 ns/iter | reference for Phase 6 walker shape |
+
+**Findings**:
+
+- **Cuckoo hash candidate (§10 line 1230 P3) is empirically rejected** under TypeScript implementation: manual djb2/FNV hash functions in JS are 2.8× slower than the JSC native hashing inside `Object` property lookup. Building a faster perfect hash in JS would require offloading hashing to `Bun.hash` (already rejected at 113 ns in §5.2 #6) or to native code (out-of-scope per §0 implementation language scope).
+- **Sealing or freezing the object provides no lookup-speed benefit** at the 100k scale (28.0–29.2 ns range; within measurement noise). The §13 Phase 7 "build-only structures dropped" invariant survives independently of `Object.freeze`; `freeze` should be retained only for caller-mutation safety on returned params (where applicable).
+- **Realistic walker shape (codegen if-chain on 4-segment 64-route trie) costs 184.94 ns per match** — substantially more than the §1 microbench small if-chain numbers, because per-segment `startsWith` + bounds checks dominate. This is the realistic baseline against which Phase 6 codegen size budget must be evaluated.
+
+### 5.5. Tier-3 status (out-of-scope confirmation)
+
+Per §0 implementation language scope (TypeScript only on Bun JSC, no WASM, no native bindings):
+
+- **WASM hot path**: out-of-scope. Removed from candidate list.
+- **AOT codegen via `Bun.build`**: already in use for the production bundle (`bun build index.ts internal.ts --outdir dist --target bun`). No additional AOT work changes the in-process router behavior; bundling is a packaging concern, not a routing-engine concern.
+- **Linux `perf` / `valgrind` for byte-accurate RSS attribution**: diagnostic tooling only, never linked into the router. Use is permitted for measurement at any time but is not a §13 implementation phase.
+- **`Bun.serve()` 100k native init internal phase split** (line 519: ">180s timeout"): requires either a Bun-internal instrumentation patch or a >600s harness run. Outside the §13 router-engine scope; treated as a Bun runtime measurement artifact.
+
+These items are deliberately not part of any §13 Phase to keep the router engine scope intact.
+
+---
+
+## 6. 100k Route Target
+
+100k route support is the primary design target.
+
+Required 100k shapes:
+
+- 100k static routes
+- 100k param routes
+- 100k mixed static/param/wildcard routes
+- 100k high-fanout routes
+- 100k versioned/API-like routes
+- 100k wildcard-heavy stress profile. If route semantics make a full 100k set invalid, the harness must report the largest valid count, invalidity reason, and substitute threshold.
+
+Previously missing from the local 100k harness, now added as single-run scenarios:
+
+- `versionedApiScenario()`: multi-method API shape such as `/api/v{0..49}/tenants/:tenant/users/:user/posts/{id}/comments/:comment`.
+- `wildcardHeavyScenario()`: wildcard stress shape such as `/files/group-{0..999}/bucket-{id}/*path`.
+- Enterprise/extreme approval is still blocked until these scenarios run through the fresh-process 3-run gate with median/p75/p99 and profile data.
+
+Guarantee meaning:
+
+- `add()+build()` must complete within the target band and no measured phase may show unbounded superlinear behavior.
+- Match latency must meet target-band p75/p99 for static hit, param hit, wildcard hit, 404 miss, and wrong method.
+- Retained memory must scale linearly enough to meet per-route target-band budgets.
+- Cache memory must remain bounded by configured `cacheSize`.
+- Optional expansion must remain capped and must not turn one registered route into unbounded runtime state.
+- Performance claims must be made at 100k, not inferred from 1k.
+
+Target-setting rule:
+
+- Do not claim final ns/MiB targets before full 100k end-to-end measurements.
+- First measure current router, Bun native routes, `URLPattern`, and compatible userland routers at 100k.
+- Then set three target bands:
+ - `Guard`: release-blocking minimum.
+ - `Aggressive`: expected target for the optimized implementation.
+ - `Stretch`: Bun/JSC extreme target.
+- A target band is valid only if it is backed by 100k measurements and profile data.
+
+Target band derivation formula:
+
+- `Guard` must be no worse than the current router on correctness and no worse than the current router by more than an explicitly approved regression budget on p75/p99 latency, build time, and retained memory.
+- `Aggressive` must beat the current router on at least one primary bottleneck without regressing any core route shape beyond the approved budget.
+- `Stretch` must approach or beat the fastest compatible external static baseline for static-only routes while preserving param/wildcard/security semantics that static-only baselines do not cover.
+- A memory target must be expressed as both absolute delta and per-route cost: `rss delta / route`, `heapUsed delta / route`, `arrayBuffers delta / route`.
+- A build target must include total build time and phase split. A total improvement is not accepted if it hides a new pathological phase.
+- A match target must include cache-hot, cold first hit, cache churn, wrong method, and miss. A single hot-loop number is not a target.
+
+Initial 100k planning bands:
+
+These are provisional planning budgets, not final release gates. They are strict enough to reject clearly bad results, but final release approval requires refreshed full-matrix data and profile evidence. If a metric is not measured by a fresh-process gate, status is `not approved`.
+
+| Metric at 100k routes | Guard | Aggressive | Stretch |
+| ------------------------------------------------------- | ------------------------------------: | ----------------------------------: | -----------------------------------------------------------------------: |
+| static add+build p99 | <= 500 ms | <= 250 ms | <= 100 ms |
+| param add+build p99 | <= 1,500 ms | <= 750 ms | <= 300 ms |
+| mixed add+build p99 | <= 3,000 ms | <= 1,000 ms | <= 400 ms |
+| high-fanout add+build p99 | <= 500 ms | <= 250 ms | <= 100 ms |
+| versioned-api add+build p99 | <= 1,500 ms | <= 750 ms | <= 300 ms |
+| wildcard-heavy add+build p99 | <= 1,500 ms | <= 750 ms | <= 300 ms |
+| first-match p99 (100k workload) | <= 10 us | **n/a — unattainable at 100k** | **n/a — unattainable at 100k** |
+| first-match p99 (≤16-node sub-workload, codegen+warmup) | <= 10 us | <= 3 us | <= 1 us (median; p99 reachable only with 30-run-confirmed warmup) |
+| warmed static hit p99 | <= 100 ns | <= 50 ns | <= 15 ns |
+| warmed dynamic hit p99 | <= 150 ns | <= 75 ns | <= 25 ns |
+| 404/wrong-method p99 | <= 150 ns | <= 75 ns | <= 25 ns |
+| cache churn p99 | <= 500 ns | <= 200 ns | <= 75 ns |
+| cacheSize default/effective cap | <= 1,000 per method unless configured | same | same |
+| max expanded routes per build | <= 200,000 | <= 150,000 if no compatibility need | <= 125,000 only under Bun/JSC extreme profile with no compatibility need |
+| max regex siblings per segment | <= 32 | <= 16 if no compatibility need | <= 8 if no compatibility need |
+| RSS delta per route | <= 4,096 B | <= 2,048 B | <= 1,024 B |
+| heapUsed delta per route | <= 2,048 B | <= 1,024 B | <= 512 B |
+| arrayBuffers delta per route | <= 512 B | <= 256 B | <= 128 B |
+| codegen observed compile p99 per method | <= 10 ms | <= 5 ms | <= 2 ms |
+| emitted source per generated walker | <= 128 KiB | <= 64 KiB | <= 32 KiB |
+| dominant 100k mixed build phase share | <= 60% | <= 40% | <= 25% |
+
+Measurement status:
+
+- `versioned-api` and `wildcard-heavy` now have explicit planning bands because they are required 100k shapes. Existing 3-run measurements show RSS and first-match failures, so they are not approved.
+- `codegen observed compile p99 per method` is not approved until a fresh-process gate records compile telemetry for every generated method.
+- `dominant 100k mixed build phase share` is evidence-confirmed in diagnostics but not release-approved until the optimized implementation passes the same metric.
+
+**first-match Aggressive 3 us / Stretch 1 us at 100k unattainable — proof**: §5.3 D 5-run distribution shows 64-node walker first p99 = 1,391–7,734 ns (median 2,838 ns), 256-node = 3,500–15,004 ns, 1024-node = 15,340–50,803 ns. 100k routes inevitably contain walkers >64 nodes; codegen+warmup serves only the ≤32-node hot subset. Iterative walker fallback for >32-node routes has stable per-segment cost ~26 ns × segment count, so a 200-segment walker (within `maxSegmentCount=256`) fails Aggressive at 5,200 ns and Stretch at 1,000 ns by definition. Aggressive/Stretch first-match bands are scoped to ≤16-node sub-workloads only (e.g. small static tables, single-segment param chains); the 100k workload band is Guard-only. AOT codegen via `Bun.build` (§5.5 line 839) is bundling, not routing-engine concern, and does not change runtime first-match.
+
+Absolute memory equivalents at 100k routes:
+
+| Metric | Guard | Aggressive | Stretch |
+| ------------------ | ------------: | ------------: | -----------: |
+| RSS delta | <= 390.63 MiB | <= 195.31 MiB | <= 97.66 MiB |
+| heapUsed delta | <= 195.31 MiB | <= 97.66 MiB | <= 48.83 MiB |
+| arrayBuffers delta | <= 48.83 MiB | <= 24.41 MiB | <= 12.21 MiB |
+
+Partial-gate statistics rule:
+
+- Current 3-run tables are `median / p75 / max-of-3`, where `p99` is effectively max-of-3.
+- Final release p99 requires a larger sample count or request-level benchmark distribution, not only three process runs.
+- 3-run results are sufficient to identify obvious failures, not to prove tail latency excellence.
+
+Theoretical lower-bound justification for Aggressive/Stretch warmed bands (Phase D analysis, Intel i7-13700K @ 5.45 GHz turbo, L1d 48 KiB / L2 2 MiB / L3 30 MiB):
+
+- 100k routes × avg 32 byte path = 3.2 MiB working set → exceeds L1d (48 KiB) and L2 (2 MiB), fits L3 (30 MiB). Cold-tier hit floor = L3 latency 40–50 cycles ≈ 7.3–9.2 ns.
+- JSC string-keyed object property lookup adds ~5–10 cycles hash + 3–5 cycles probe + 2–3 cycles cmp/branch = ~10–18 cycles ≈ 1.8–3.3 ns.
+- **Theoretical static-hit lower bound ≈ 11–15 ns** at 100k. Current zipbul warmed static p99 = 19.17 ns (§5.1 30-run) is 1.3–1.7× above floor.
+- Aggressive 50 ns = 2.6× floor (achievable with margin). Stretch 15 ns = identical to floor (achievable only by removing all JSC dispatch overhead, not by algorithm change — practical Stretch is "match the floor, no further optimization").
+- **Param-hit lower bound ≈ 16–22 ns** (static lower + 1 trie node load 4–7 ns + Int32Array offset write 1–2 ns). Current zipbul warmed param p99 = 18.65 ns already at floor. Stretch 25 ns confirmed reachable.
+- **First-match floor at 100k** dominated by JIT tier-up + first L3 miss + path traversal. Iterative walker for `maxSegmentCount=256` route ≈ 26 ns × 256 = 6.6 µs theoretical floor. ULT Guard 10 µs = floor + 50% margin (correct band). Aggressive 3 µs / Stretch 1 µs at 100k inherently below floor — confirmed unattainable per Phase A patch.
+- No remaining algorithmic blind spot within §0 TypeScript-on-JSC scope produces sub-floor performance. `structuredClone`-based clone-on-hit is the single Phase D candidate; effect estimated <2 ns delta vs spread, queued as Phase 3 sub-experiment with deferred priority.
+
+Provisional approval budgets until measured bands are produced:
+
+- correctness/security: zero known regression.
+- build: no new superlinear behavior in 10k -> 100k scaling.
+- memory: no unbounded cache growth; retained memory must stay within the per-route target band.
+- match: no candidate may be accepted from microbench alone; end-to-end p75/p99 must not regress on static, param, wildcard, miss, or wrong-method shapes.
+
+100k design implications:
+
+- Static full-path lookup must stay O(1)-like and cannot degrade with route count.
+- Dynamic route traversal must depend on path segment count, not total route count.
+- High fanout must not fall back to linear scan unless proven faster for that fanout distribution.
+- Generated code size must be bounded. Codegen that is fast at 1k but causes compile/tier-up/code-cache problems at 100k is rejected.
+- Memory compaction must focus on duplicated terminals, factories, optional expansion aliases, and dense metadata, not on replacing fast string object lookup with slower packed scans.
+- Build validation must batch errors but avoid retaining failed partial state.
+
+---
+
+## 7. Standards / Security Baseline
+
+### 7.1. HTTP Method
+
+Custom method는 지원해야 한다.
+
+표준 기준:
+
+- RFC 9110 defines HTTP `method = token`.
+- method token is case-sensitive.
+- standardized methods are conventionally uppercase US-ASCII, but custom methods are allowed.
+
+최종 정책:
+
+- Built-in defaults: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `OPTIONS`, `HEAD`.
+- Built-in methods count toward the 32-method limit.
+- Custom methods: allowed.
+- Method identity: case-sensitive. `GET` and `get` are different methods.
+- Method validation: US-ASCII RFC 9110 token grammar only. Regex form: `^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$`.
+- Allowed token characters: alnum plus `!`, `#`, `$`, `%`, `&`, `'`, `*`, `+`, `-`, `.`, `^`, `_`, `` ` ``, `|`, `~`.
+- Method limit: default profile supports up to 32 distinct registered method tokens for the bitmask fast path. This is an implementation/performance cap, not an HTTP standard limit.
+- More than 32 distinct methods must fail during `build()` with an explicit `method-limit` issue unless a future extended-method fallback is implemented and separately benchmarked.
+- P3 extended-method candidate: support `>32` methods through a measured fallback such as two `Uint32` masks, `BigInt` bitmask, or sparse method table. It is not part of the default enterprise claim until build/match/wrong-method benchmarks prove no material regression.
+- Method length limit: secure/default `maxMethodLength = 64` ASCII bytes.
+- Internal representation: string input -> numeric method code -> bitmask/table.
+- Default behavior must not uppercase/lowercase/normalize method names.
+- Compatibility normalization, if ever added, must be explicit opt-in and must not be part of the standards-compliant profile.
+- Runtime unknown method returns no-match or allowed-method miss; it must not throw.
+- No implicit HEAD fallback and no implicit OPTIONS response are generated by the router. This is a routing-layer policy, not a claim that HTTP services can ignore HEAD/OPTIONS semantics. Applications or the server integration layer must explicitly implement HEAD-as-GET-without-body or generated OPTIONS if they want those HTTP service behaviors.
+
+Security requirement:
+
+- Reject empty method.
+- Reject non-token characters.
+- Reject whitespace/control characters.
+- Reject Unicode method characters.
+- Reject methods longer than 64 ASCII bytes in secure/default mode.
+- Reject methods beyond 32 distinct registered names in the default bitmask profile.
+- Treat lowercase standard-looking methods such as `get` as distinct custom tokens, not as aliases for `GET`.
+- Do not register lowercase aliases for standard methods automatically.
+
+Operational requirement:
+
+- Real HTTP servers/proxies may reject lowercase or unknown methods before the router sees the request.
+- The router must preserve the method string it receives instead of guessing upstream normalization.
+- Application authors must register standard methods in uppercase when they want standard HTTP semantics.
+- Enterprise scope statement: enterprise/security claims apply to applications with `<= 32` distinct method tokens. If an application genuinely needs more, the router needs a measured extended-method representation before the claim applies.
+
+Current code status:
+
+- Custom method registration is already supported by `MethodRegistry`.
+- Current code lacks strict RFC token validation and currently allows invalid examples such as empty method names. This must be fixed before claiming enterprise-grade standards compliance.
+- Current tests that expect 1000-character methods to succeed must be revised or isolated under an unsafe/compat profile.
+- Current case-sensitive behavior is correct for standards compliance and must be preserved.
+
+### 7.2. URL / Path Character Policy
+
+등록 path는 URL 전체가 아니라 origin-form path pattern으로 취급한다.
+
+표준 기준:
+
+- RFC 3986 path segment is `*pchar`.
+- `pchar = unreserved / pct-encoded / sub-delims / ":" / "@"`.
+- Query and fragment are not part of registered route path.
+- RFC 3986 generic syntax (§3) separates path, query, and fragment; §3.3 defines path syntax, §3.4 defines query after `?`, and §3.5 defines fragment after `#`. For router policy, a raw `?` or `#` terminates path-pattern data and is rejected during registration.
+- RFC 3986 §3.5 defines fragment syntax and confirms it is not part of the path component.
+- RFC 3986 §6.2.2.1 makes percent-encoding hex digits case-insensitive for normalization purposes.
+- RFC 3629 §3 defines UTF-8 validity constraints; RFC 3629 §10 calls out overlong sequences as a security risk. Overlong encodings are invalid UTF-8 and must be rejected by secure/default validation.
+- WHATWG URL uses percent-encoding sets for URL parsing/serialization, but the router must not silently rewrite registered route patterns.
+
+Registration policy:
+
+- Registered route must start with `/`.
+- Registered route must not contain query `?` or fragment `#`.
+- Registered route must not contain ASCII control characters.
+- Secure/default registered route must be raw ASCII RFC 3986 path grammar. Raw non-ASCII, space, backslash, DEL, and C0 controls fail.
+- Non-ASCII literals must be represented as percent-encoded UTF-8.
+- Registered route must validate percent escapes: every `%` must be followed by two hex digits.
+- Secure/default registration validates percent-decoded bytes for UTF-8 correctness, encoded slash, encoded control, and dot-segment detection. Static route identity still stores the original non-canonical path string after policy validation.
+- Static path segments may contain RFC 3986 `pchar` minus router-grammar tokens that would be ambiguous in route patterns.
+- Route-pattern syntax must be parsed separately from raw RFC `pchar`. Characters such as `:`, `*`, `(`, `)`, `?`, `+` are restricted only where they create router grammar ambiguity.
+- Regex parentheses are valid route grammar only after a named param, e.g. `:id(\\d+)`. A regex-looking segment without a preceding `:name` is rejected as `path-invalid-pchar` in secure/default.
+- If `:`, `*`, `(`, `)`, or `+` must be literal, use percent-encoded form. Secure/default does not decode-normalize registration paths except for dot-segment detection.
+- Secure/default registration rejects interior empty segments such as `/a//b`. Root `/` is allowed.
+- Trailing slash handling is controlled by `trailingSlash: "strict" | "ignore"`; default is `"strict"`. In strict mode `/a` and `/a/` are distinct.
+- Interior empty segments such as `/a//b` and repeated trailing slashes such as `/a//` fail in both strict and ignore modes.
+- Secure/default registration rejects literal dot segments `.` and `..`.
+- Secure/default registration rejects percent-normalized dot segments: `%2e`, `%2E`, `.%2e`, `%2e.`, `%2e%2e`.
+- Optional decorators such as `:id?` are route grammar, not query syntax. Literal/query `?` in the registered path is rejected.
+- Registration parse order: first tokenize router grammar inside each path segment, so `:id?`, `:id+`, `:id(\\d+)`, and `:id+?` are recognized as decorators. After grammar tokenization, any remaining raw `?` byte outside a recognized decorator is rejected as query/ambiguity syntax.
+- Required boundary fixtures: `/:id?` accepted, `/users/:id?/posts` accepted if optional expansion is valid, `/a?b` rejected, `/literal%3F` accepted as a literal question mark segment, and `/:id%3F` treated as literal encoded data only if it does not form router grammar.
+
+Runtime policy:
+
+- Runtime `match()` accepts an origin-form request target or path string.
+- Runtime normalization order in secure/default:
+ 1. scan for raw `#`; if present anywhere in the input, return no-match and do not cache
+ 2. split query at the first raw `?`
+ 3. validate percent escapes and unsafe decoded bytes using a single percent-decoding pass for validation
+ 4. apply trailing slash policy to the same normalized key shape used at registration
+ 5. apply path case policy only in compat mode
+ 6. use the resulting path as the cache/static/dynamic lookup key
+- Runtime secure/default treats raw `#` anywhere in input as no-match. This is stricter than URI fragment stripping and aligns with the registration policy that query/fragment are not route-path data.
+- Percent decoding failures must be split by reason: malformed `%`, invalid UTF-8, encoded slash, encoded dot, encoded control character.
+- Encoded control bytes emit `path-encoded-control`. Raw C0/DEL bytes emit `path-control-char`.
+- Raw non-ASCII bytes emit `path-non-ascii`. ASCII characters outside RFC 3986 `pchar` minus router grammar tokens emit `path-invalid-pchar`.
+- Secure/default scans percent escapes before lookup. Every `%` must be followed by two hex digits.
+- Secure/default no-matches malformed `%`, invalid UTF-8, decoded C0/DEL control, decoded `/`, and decoded dot segments.
+- Static matching does not percent-decode canonicalize. `/users/A` and `/users/%41` are distinct static paths.
+- Secure/default performs exactly one validation decode pass. It must not double-decode `%252F` into `/`; `%252F` remains encoded percent data after one pass and is not treated as an encoded slash unless a future canonicalization profile explicitly opts in.
+- Invalid UTF-8 includes overlong encodings such as `%C0%AF`; those no-match in runtime and fail in registration.
+- Param/wildcard capture values are UTF-8 percent-decoded in secure/default only after the route matches safely.
+- Encoded slash `%2F` is always no-match in secure/default, including inside param/wildcard captures.
+- Encoded fragment `%23` is data, not a raw fragment delimiter. It is allowed only where percent-decoded `#` is safe for the selected segment/capture policy; raw `#` is always rejected/no-match.
+- Compat profile may preserve current raw pass-through malformed param behavior only when `profile: "compat"` is explicitly selected.
+- Malformed/unsafe runtime paths are not inserted into hit or miss cache in secure/default.
+- Registration/runtime trailing-slash key rule: registration and runtime both apply the same `trailingSlash` policy before lookup-key construction. In `ignore` mode, one trailing slash is removed from non-root paths for both registered patterns and runtime paths; repeated trailing slashes still fail as empty segments.
+
+Dot-segment rule:
+
+- Secure/default rejects/no-matches a segment if its percent-decoded form is exactly `.` or `..`.
+- `%2e`, `%2E`, `.%2e`, `.%2E`, `%2e.`, `%2E.`, `%2e%2e`, `%2E%2e`, `%2e%2E`, and `%2E%2E` are dot segments.
+- `.well-known`, `...`, `a..`, and `%2e%2e%2e` are not dot segments.
+
+Security requirement:
+
+- No silent acceptance of malformed `%`.
+- No control characters.
+- No path pattern ambiguity.
+- Regex safety must not overclaim. Native JS RegExp has no timeout guarantee.
+- Secure/default permits only a safe regex subset for param regex. It rejects backreference, lookaround, nested quantifier, ambiguous alternation under repetition, named capture, flags, and `.*` inside a repeated group.
+- Param regex is evaluated only against one segment with implicit `^(?:pattern)$`; it must never match `/`.
+- Compat may allow native RegExp best-effort guard, but compat regex mode cannot be used for enterprise/security claims.
+- Hard limits stay mandatory: `maxPathLength = 8192`, `maxSegmentLength = 1024`, `maxSegmentCount = 256`, `maxParams = 64`, `maxOptionalExpansions = 1024`, `maxExpandedRoutes = 200_000`, `maxRegexSiblingsPerSegment = 32`, `maxMethodLength = 64`, and bounded `cacheSize = 1000` by default.
+- `Infinity` and `Number.MAX_SAFE_INTEGER` are validation errors for every numeric limit listed above: `maxPathLength`, `maxSegmentLength`, `maxSegmentCount`, `maxParams`, `maxOptionalExpansions`, `maxExpandedRoutes`, `maxRegexSiblingsPerSegment`, `maxMethodLength`, and `cacheSize`.
+- Unbounded limits are allowed only with `unsafeAllowUnboundedLimits: true`, and that option invalidates enterprise/security claims.
+
+Secure regex subset implementation rule:
+
+- Allowed atoms: literal safe characters, escaped literals, character classes without nested classes, `\d`, `\w`, `\s`, `.`, and non-capturing groups `(?:...)`.
+- Allowed quantifiers: `?`, `*`, `+`, `{m}`, `{m,n}` only on atoms or non-repeated simple groups.
+- Rejected constructs: backreference, lookaround, named capture, capturing group, inline flags, nested quantifier, quantifier on alternation group, `.*` under any repeated group, and any pattern that can match `/`.
+- Validation algorithm must be deterministic and parser-based or conservative scanner-based. Unknown construct means `regex-unsafe`.
+- Fixtures must include allowed `\d+`, `[a-z0-9-]+`, `(?:foo|bar)` only if not repeated, and rejected `(a+)+`, `(a|aa)+`, `(?=a)`, `(?a)`, `(a)\1`, `(?:.*)+`.
+
+Regex route disjointness policy:
+
+- Secure/default never tries general regular-language disjointness. General regex disjointness is too complex for a deterministic build validator in this router.
+- `provably disjoint` means one of the conservative parser-known cases below; otherwise same-shape regex/plain or regex/regex ambiguity is rejected as `route-conflict`.
+- Allowed disjoint proof cases: non-overlapping literal-only alternatives and non-overlapping single-character classes at the same fixed position with equal fixed length.
+- Fixed numeric range disjointness is unsupported until a dedicated range parser spec exists. Before that parser exists, numeric-looking regex ranges must not be treated as proven disjoint.
+- Plain param `:id` overlaps every safe regex param at the same segment position because plain param accepts any non-slash segment. Therefore constrained regex vs plain param same shape is rejected by default.
+- Two identical regex ASTs at the same segment position are not aliases. They overlap and therefore emit `route-conflict` unless they are part of an already identical terminal alias case resolved later.
+- If the validator cannot prove disjointness cheaply from the safe-regex AST, it must reject. It must not construct large automata or rely on runtime sampling.
+
+Wildcard grammar:
+
+- `*name` is a trailing wildcard segment only. It captures the remaining suffix after the prefix node where it attaches.
+- `*name` uses the same identifier grammar as param names.
+- A wildcard segment is not allowed in the middle of a path and is passed to Phase 4 as `wildcardTail`, not as a normal `parts` segment.
+
+Profile policy:
+
+- Default profile is `secure`.
+- `secure`: strict method token, strict ASCII RFC path, strict percent scan, dot reject, finite limits, safe regex subset.
+- `compat`: may allow raw pass-through malformed params and native RegExp best-effort guard. Fragment literal handling remains disabled unless an explicit future option defines it. Method token validation and 32-method limit still apply.
+- `unsafe`: only explicit unsafe opt-outs such as unbounded limits. Unsafe profile cannot claim enterprise/security compliance.
+
+Current code status:
+
+- Leading `/`, empty segment, segment count, segment length, param count, duplicate param, regex safety are already checked.
+- Runtime match strips query.
+- Current registration path parser does not fully enforce RFC 3986 `pchar`, percent-escape validity, query/fragment rejection, control-character rejection, or dot-segment policy. These must be added before claiming full standards/security compliance.
+- Current registration does not enforce full-path `maxPathLength`; runtime and registration limits must be separated and tested.
+- Runtime malformed percent handling is strict in secure/default. Current raw pass-through on `decodeURIComponent` failure is compatibility-friendly but not strict-security behavior and belongs only in compat.
+- RFC `pchar` compliance and router pattern grammar are separate concerns. `:`, `*`, `(`, `)`, `?`, `+` restrictions are router ambiguity policy, not raw RFC `pchar` requirements.
+- Error reporting must carry actionable kind/reason and route index/path/method where applicable. `route-parse` and `segment-limit` alone are too coarse for enterprise validation.
+
+Validation error schema:
+
+```ts
+type RouterValidationError = {
+ kind: 'router-validation';
+ issues: RouterIssue[];
+};
+
+type RouterIssue = {
+ kind: RouterIssueKind;
+ reason: string;
+ routeIndex?: number;
+ path?: string;
+ method?: string;
+ segmentIndex?: number;
+ offset?: number;
+};
+```
+
+Required issue kinds:
+
+- `method-empty`
+- `method-invalid-token`
+- `method-too-long`
+- `method-limit`
+- `path-missing-leading-slash`
+- `path-query`
+- `path-fragment`
+- `path-control-char`
+- `path-non-ascii`
+- `path-invalid-pchar`
+- `path-malformed-percent`
+- `path-invalid-utf8`
+- `path-encoded-slash`
+- `path-encoded-control`
+- `path-dot-segment`
+- `path-empty-segment`
+- `path-too-long`
+- `segment-too-long`
+- `segment-count-limit`
+- `param-count-limit`
+- `param-duplicate`
+- `regex-unsafe`
+- `optional-expansion-limit`
+- `expansion-total-limit`
+- `regex-sibling-limit`
+- `route-duplicate`
+- `route-conflict`
+- `route-unreachable`
+- `option-invalid`
+
+Public options target schema:
+
+```ts
+type RouterOptions = {
+ profile?: 'secure' | 'compat' | 'unsafe';
+ trailingSlash?: 'strict' | 'ignore';
+ pathCaseSensitive?: boolean;
+ maxMethodLength?: number;
+ maxPathLength?: number;
+ maxSegmentLength?: number;
+ maxSegmentCount?: number;
+ maxParams?: number;
+ maxOptionalExpansions?: number;
+ maxExpandedRoutes?: number;
+ maxRegexSiblingsPerSegment?: number;
+ cacheSize?: number;
+ unsafeAllowUnboundedLimits?: boolean;
+ optionalParamBehavior?: 'omit' | 'set-undefined';
+};
+```
+
+Public API target:
+
+```ts
+type RouterPublicApi = {
+ add(method: string, path: string, value: T): void;
+ build(): RouterPublicApi;
+ match(method: string, path: string): MatchOutput | null;
+ allowedMethods(path: string): readonly string[];
+};
+```
+
+Compatibility mapping:
+
+- Existing `ignoreTrailingSlash: true` maps to `trailingSlash: 'ignore'`.
+- Existing `ignoreTrailingSlash: false` maps to `trailingSlash: 'strict'`.
+- Existing `caseSensitive: false` maps to `pathCaseSensitive: false` and is compat-only unless separately proven secure.
+- Default secure profile uses `trailingSlash: 'strict'`; preserving old behavior requires explicit compat/migration setting.
+- Public error class remains compatible with existing `RouterError` where possible. New batch validation errors use `kind: 'router-validation'` and carry `issues: RouterIssue[]`; internal issue schema uses the detailed `RouterIssueKind` list above.
+- Legacy external spelling from older code is handled only by a migration adapter; target spec and tests use `router-validation`.
+- Default numeric limits are: `maxMethodLength = 64`, `maxPathLength = 8192`, `maxSegmentLength = 1024`, `maxSegmentCount = 256`, `maxParams = 64`, `maxOptionalExpansions = 1024`, `maxExpandedRoutes = 200_000`, `maxRegexSiblingsPerSegment = 32`, and `cacheSize = 1000`.
+- Default `maxExpandedRoutes = 200_000`. This allows ordinary 100k route sets plus bounded optional expansion headroom, while rejecting pathological 100k \* 1024 expansion attempts before trie insertion.
+- Default `maxRegexSiblingsPerSegment = 32`. This caps conservative regex-disjointness comparisons at one segment position.
+- Default `cacheSize = 1000`. Runtime cache containers are lazy, per method, and bounded by this value.
+- Default `optionalParamBehavior = 'omit'` for the target secure API. Existing compatibility behavior that returns `undefined` keys must be requested explicitly with `optionalParamBehavior: 'set-undefined'` or a compat migration profile.
+- Numeric limit violations, unsupported secure/compat option combinations such as `profile: 'secure'` with `pathCaseSensitive: false`, and unsafe unbounded settings without `unsafeAllowUnboundedLimits: true` emit `option-invalid`.
+
+Wildcard method registration:
+
+- `add('*', path, value)` means all currently registered built-in/default methods plus custom methods registered before seal.
+- Custom methods registered before `seal()` participate in `*` expansion. Methods introduced after `seal()` require a new router/build and do not retroactively apply to an already sealed wildcard route.
+- `*` expansion is resolved during `seal()` into concrete method codes and participates in the same 32-method limit.
+- If `add('*', path, value)` expands to a `(method, path)` that was explicitly registered, default batch validation treats it as the same duplicate terminal policy as ordinary registration: `route-duplicate` unless it is an optional-expansion alias explicitly marked by `isOptionalExpansion`.
+
+---
+
+## 8. Design Principles
+
+### 8.1. JSC Object Fast Path First
+
+정적 child lookup과 method dispatch는 null-prototype object를 기본으로 둔다.
+
+이유:
+
+- 실제 재현에서 object lookup이 `Map`, `switch`, array scan, open-address hash보다 빨랐다.
+- JSC는 안정적인 object shape/property lookup을 강하게 최적화한다. 단, shape transition/dictionary-mode/freeze 영향은 end-to-end profile로 확인해야 한다.
+- 라우터의 child fanout은 대부분 sparse string key lookup이므로 TypedArray linear scan과 맞지 않는다.
+
+적용:
+
+- method code map: `Object.create(null)`
+- input method string -> numeric method code conversion
+- static route map: `Object.create(null)`
+- segment static children: `Object.create(null)`
+- build 이후 shape가 흔들리지 않도록 mutation phase와 sealed runtime phase를 분리한다.
+
+비트연산을 쓰지 않는 지점:
+
+- incoming method string dispatch 자체는 bit operation 대상이 아니다.
+- 문자열을 직접 bit로 바꿀 수 없으므로 `methodCodes[method]`가 먼저 필요하다.
+- 이 단계는 `switch`/`Map`보다 null-proto object lookup이 빠르다.
+
+### 8.2. Codegen Specialization Where It Actually Wins
+
+codegen은 유지한다. 단, 모든 것을 codegen으로 만들지 않고 source budget과 ambiguity guard를 둔다.
+
+채택:
+
+- wildcard prefix specialized walker
+- unambiguous segment walker
+- param factory generation
+- small generated decision trees only when code size and first-match latency are proven
+
+근거:
+
+- 일부 실행에서 small specialized equality가 generic object lookup보다 빨랐지만, 다른 실행에서는 동률 또는 역전됐다. 따라서 static equality codegen은 기본 채택이 아니라 route-count/code-size threshold가 있는 조건부 후보이다.
+- 기존 라우터도 codegen walker에서 param/wildcard 성능이 이미 강하다.
+
+주의:
+
+- 거대한 generated function은 instruction cache와 JIT compile cost를 악화시킬 수 있다.
+- route 수가 많으면 object lookup 기반 table dispatch가 더 안전하다.
+- Source budget만으로는 부족하다. 큰 tree 전체 source를 만든 뒤 포기하면 이미 build 비용을 지불한 상태가 된다.
+- 100k에서는 node count, fanout, estimated source bytes, compile-time telemetry로 codegen 진입 전에 bail-out 해야 한다.
+
+Initial codegen limits:
+
+| Limit | Guard |
+| ------------------------------------------------------------------------------------------------------------------------------------- | --------------: |
+| max generated source per walker | 128 KiB |
+| preferred generated source per walker | 64 KiB |
+| max generated source stretch target | 32 KiB |
+| max codegen candidate nodes per method (initial) | 4,096 |
+| **default codegen budget per §13 Phase 6 / 30-run × 100 sample distribution (task 28)** — p99 Guard 10us via codegen+mandatory-warmup | **≤ 256** nodes |
+| no-warmup p95-only cap (first-call p99 fails 10us at every count) | ≤ 64 nodes |
+| Aggressive 3us p99 (second-call) cap | ≤ 32 nodes |
+| Stretch 1us p99 — unattainable even with warmup | n/a |
+| **legacy ≤16 / ≤32 caps (5-run-derived, superseded by 30-run × 100 sample)** | obsolete |
+| legacy initial budget (not gate-passing) | 4,096 nodes |
+| max codegen candidate fanout | 64 |
+| max compile time per generated method | 10 ms |
+
+Fallback:
+
+- If any limit is exceeded, use object/table dispatch and iterative walker.
+- Bail-out must happen before generating the full source string.
+- Codegen telemetry must record method, node count, fanout max, estimated source bytes, actual source bytes, compile ms, and fallback reason.
+
+### 8.3. Allocation-Minimal Match Path
+
+API가 `{ value, params, meta }`를 반환하므로 성공 결과 객체와 params 객체 생성은 완전히 제거할 수 없다. 정확한 목표는 “miss/traversal 중 transient allocation 금지, success path에서 result/params를 최소 생성”이다.
+
+match traversal hot path에서는 다음을 금지한다.
+
+- `split`
+- `substring` 기반 param 객체 선생성
+- `TextEncoder.encode`
+- `Bun.hash`
+- `Map` key concat
+- `throw/catch`
+- transient object allocation
+
+Current gap:
+
+- Current dynamic walker still creates segment `substring()` values during traversal. This violates the ideal allocation-minimal target and must be measured/fixed or explicitly accepted as a compatibility/performance trade-off.
+
+채택:
+
+- segment boundary는 기본적으로 JSC string primitive(`indexOf`)와 현재 walker를 유지한다.
+- manual slash scan/codegen scanner는 end-to-end walker benchmark에서 이길 때만 채택한다.
+- params는 `Int32Array` offset buffer에 기록한다.
+- params object는 반환 직전 최소 1회만 생성하거나, API 호환 가능한 lazy materialization으로 지연한다.
+- Dynamic cache params semantics: per §5.2 #4 / §5.3 F lock-in, **clone-on-cache-hit (spread) is the chosen mechanism** so caller mutation cannot poison later cache hits. `Object.freeze` is rejected on the hot path (§5.2 #4 measured 6.1× slower at 2-key, 1.55× slower at 20-key). Future optimized direction is lazy read-only params, gated by API compatibility and p75/p99 proof.
+- cache는 method별 map으로 나누어 key concat을 제거한다.
+- case-insensitive mode는 manual uppercase pre-scan을 넣지 말고 `toLowerCase()` 기반을 기본으로 둔다.
+
+근거:
+
+- substring param allocation `38.47 ns/op`
+- offset-only param accounting `2.66 ns/op`
+- cache key concat `11.37 ns/op`
+- per-method cache path lookup `4.19 ns/op`
+- slash scan은 microbench 변동이 있어 end-to-end 결정 필요
+- `toLowerCase()` unchanged ASCII `2.70 ns/op`
+- manual lowercase pre-scan `17.54 ns/op`
+
+### 8.4. TypedArray Is a Memory Tool, Not the Default Lookup Tool
+
+TypedArray는 다음 영역에만 사용한다.
+
+- param offset buffer
+- terminal/handler metadata table only after end-to-end proof
+- compact handler indirection table
+- large immutable metadata table
+- method mask table
+- bit flags for node/terminal metadata
+- optional future packed snapshot export
+
+기각:
+
+- static child lookup의 전면 SoA linear scan
+- `DataView` 기반 node access
+- hot path hashing용 `Bun.hash`
+
+근거:
+
+- fanout64 object lookup `3.27 ns/op`
+- fanout64 array scan `54.82 ns/op`
+- open-address hash lookup `18.59 ns/op`
+- DataView `3.59 ns/op`, Uint32Array `3.02 ns/op`
+
+### 8.5. Int Buffer / Bit Operation Policy
+
+int buffer와 bit 연산은 필요하다. 단, 라우터의 주 lookup 엔진이 아니라 allocation과 metadata overhead를 줄이는 보조 엔진이다.
+
+채택:
+
+- `Int32Array` param offset buffer
+- terminal tag / method availability only when it reduces an actual table lookup in current per-method architecture
+- method mask
+- allowed-methods mask
+- route method availability mask
+- node flags
+- compact handler indirection
+- optional expansion alias metadata
+
+조건부:
+
+- bitmap/rank는 ASCII char-class prefilter나 method availability check에만 사용한다.
+- perfect hash/bitmap child table은 real route distribution에서 object lookup을 이긴다는 재현 없이는 채택하지 않는다.
+
+기각:
+
+- string child lookup의 naive int-buffer scan
+- packed hash key lookup
+- open-address hash lookup
+- `Bun.hash` 기반 hot path
+
+근거와 제한:
+
+- bitmap+popcount rank `4.95 ns/op`
+- method bitmask availability `2.18 ns/op`
+- method bool array availability `2.69 ns/op`
+- method Set availability `3.43 ns/op`
+- method Set availability `9.66 ns/op`
+- terminal direct handler index `2.07 ns/op`
+- terminal array method lookup `2.41 ns/op`
+- terminal tagged fast path `2.39 ns/op`
+- terminal tagged poly path `2.18 ns/op`
+- terminal direct/array/tag microbench 차이는 작다. 현재 per-method tree에서는 terminal tag 이득이 제한적일 수 있으므로 P1 확정 항목이 아니라 P3 measured experiment로 둔다.
+- fanout64 object lookup `3.27 ns/op`
+- fanout64 array scan `54.82 ns/op`
+- packed key lookup `25.50 ns/op`
+- open-address hash lookup `18.59 ns/op`
+- `Bun.hash` string `71.58 ns/op`
+
+### 8.6. Validation Must Be Batch + Issue Array
+
+라우트 등록은 pending list에 쌓고, `build()`에서 한번에 검증한다.
+
+채택:
+
+- `add()`는 user intent만 기록한다.
+- `build()`에서 duplicate/conflict/unreachable/regex/wildcard conflict를 전수 검증한다.
+- 실패 시 모든 문제 라우트를 issue array로 모아 하나의 `RouterError`로 보고한다.
+- build 실패는 라우터 sealed 전 실패이며, partially built runtime snapshot을 노출하지 않는다.
+
+근거:
+
+- throw/catch validation `55.94 ns/op`
+- issue-array validation `3.33 ns/op`
+
+Route precedence and conflict policy:
+
+| Pattern relation | Default policy |
+| ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| same method + same normalized pattern | reject `route-duplicate` |
+| static vs param at same segment | static wins at match time |
+| static vs regex param at same segment | static wins at match time |
+| constrained regex param vs plain param same shape | reject `route-conflict`; plain param overlaps every valid non-slash regex segment |
+| constrained regex param vs constrained regex param same shape | reject `route-conflict` unless the safe-regex AST proves disjointness by the conservative rules in section 7.2 |
+| constrained regex param same AST at same segment | merge as same regex child; duplicate terminal is still checked at terminal insertion |
+| param name differs but shape same, e.g. `/:a` and `/:b` | reject `route-duplicate` for same method |
+| param name same and shape same | merge as same `paramChild` edge; duplicate terminal is still checked at terminal insertion |
+| wildcard vs any longer route made unreachable by wildcard | reject `route-unreachable` |
+| wildcard vs static terminal at same prefix | reject `route-unreachable` in both registration orders |
+| wildcard vs wildcard at same prefix | reject `route-unreachable`; the later wildcard is fully covered by the prior wildcard's suffix space |
+| regex siblings beyond `maxRegexSiblingsPerSegment` | reject `regex-sibling-limit` |
+| per-route optional expansions beyond `maxOptionalExpansions` | reject `optional-expansion-limit` before expanded-route insertion |
+| total expanded routes beyond `maxExpandedRoutes` | reject `expansion-total-limit` before trie insertion |
+| optional expansion produces duplicate shape | alias terminal only if handler/method/options identical; otherwise reject conflict |
+| wrong method same path | `match()` returns no-match; `allowedMethods(path)` may expose method metadata from the static/dynamic terminal table |
+| `HEAD` vs `GET` | no implicit fallback; only registered method matches |
+| `OPTIONS` | no implicit generated response; only registered method matches |
+
+---
+
+## 9. Runtime Architecture Candidate
+
+### 9.1. Build Phase
+
+1. pending routes 수집
+2. path parse / normalize
+3. optional route expansion
+4. duplicate/conflict/unreachable validation
+5. static route table 생성
+6. dynamic segment tree 생성
+7. terminal table / param factory 생성
+8. codegen 가능한 walker만 specialization
+9. immutable runtime snapshot publish
+
+핵심 불변식:
+
+- build 실패 시 runtime snapshot 없음
+- build 성공 후 route mutation 금지
+- `build()`/internal `seal()` is single-threaded per router instance. Concurrent build/seal calls on the same instance synchronously fail with `RouterError('build-in-progress')` guarded by a per-instance non-reentrant flag.
+- After successful `build()`, any later `add()` throws `RouterError('router-sealed')`.
+- On `build()` failure, `totalExpandedRoutes`, method-code allocations made during that attempt, staged trie nodes, alias journals, and partial snapshot objects are discarded before throwing.
+- runtime table은 monomorphic shape 유지
+- validation error는 가능한 한 batch로 보고
+
+### 9.2. Match Phase
+
+1. method code를 null-proto object에서 조회
+2. method is never normalized
+3. secure/default path policy:
+ 1. raw `#` no-match with no cache
+ 2. query strip at first raw `?`
+ 3. percent/UTF-8/dot/encoded-slash validation
+ 4. trailing slash policy
+ 5. compat-only case policy
+ 6. lookup-key construction
+4. static table direct lookup first by default
+5. per-method miss/hit cache lookup when it is proven beneficial
+6. dynamic tree lookup
+7. terminal handler index resolve
+8. param offset으로 params materialize
+9. hit/miss cache 기록 only after the path policy accepts the input
+
+The path policy in step 3 is the same six-step normalization defined in section 7.2: raw `#` reject, raw `?` query strip, percent validation, trailing slash policy, compat-only case policy, and lookup-key construction.
+
+Path case policy:
+
+- Secure/default is path case-sensitive.
+- `pathCaseSensitive: false` is compat-only unless separately proven standards-safe.
+- Method case is never normalized in any profile.
+
+Cache order policy:
+
+- Default runtime order is static-first, then cache, then dynamic tree.
+- Static hit cache is disabled by default because the static table is already a direct lookup.
+- Dynamic hit cache and miss cache may remain enabled per method.
+- `cacheSize` bounds each per-method cache. The current implementation uses clock-sweep eviction for dynamic hit cache and FIFO eviction for miss cache, with no TTL. The target design keeps bounded eviction explicit and must not allow unbounded high-cardinality path retention.
+- Cache-first may become default only if dynamic-heavy p75/p99 improves by at least 10% while static p75/p99 regresses by no more than 5% and cache churn does not exceed Guard target.
+- Any cache key must avoid method+path string concatenation; use per-method cache tables.
+- After successful `seal()`, `match()` is safe for concurrent invocations because the runtime snapshot is immutable and cache containers are bounded runtime side structures. Concurrent mutation/build on the same router remains unsupported.
+
+Regex sibling runtime policy:
+
+- Secure/default build validation allows same-position regex siblings only when their safe-regex ASTs are proven disjoint, so multiple sibling matches should be unreachable.
+- If an unsafe/compat mode ever permits ambiguous regex siblings, runtime order is registration order and the mode cannot claim enterprise/security determinism.
+
+### 9.3. Terminal Representation
+
+terminal representation is a measured optimization candidate, not a blanket requirement.
+
+형태:
+
+- `tag >= 0`: fast terminal, lower bits are handler index
+- `tag < 0`: poly terminal, lower bits are terminal table reference
+
+method 처리:
+
+- API input: string method
+- hot path entry: `methodCodes[method]`로 numeric method code 변환
+- tree/cache/table index: numeric method code 사용
+- availability/allowed-methods/poly terminal: bitmask 사용
+
+목표:
+
+- 현재 per-method tree에서는 단일 method terminal tag 이득이 작을 수 있다.
+- multi-method/global-terminal architecture로 전환할 때만 fast/poly tag 이득이 커진다.
+- handler storage와 terminal storage를 분리해 duplicate optional expansion 비용 감소
+
+---
+
+## 10. Adaptive Child Strategy
+
+재현 결과 기준 기본값은 object lookup이다.
+
+| Fanout/Key 형태 | 전략 |
+| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| 일반 string segment | null-proto object |
+| 아주 작은 fixed static set and hot route | generated equality chain only after code-size/first-hit proof |
+| wildcard prefix only | generated prefix walker |
+| param-only chain | generated or iterative offset walker |
+| huge static full path table | **Workload-aware (task 15 POC, §5.3 reconciled)**: per-method `Object.create(null)` retained as default for hit-dominant API gateway workloads (object hit 7.59 ns < Map hit 9.43 ns at 8 method × 12,500 routes/bucket production-realistic shard); per-method `Map` opt-in for miss/wrong-method/build/RSS-dominant workloads (Map miss 8.44 ns vs object 16.26 ns / Map build 6.7 ms vs object 19.1 ms / Map RSS 9.6 MiB vs object 14.1 MiB). Single global Map with composite key (`methodCode:path`) REJECTED — 60–70 ns concat overhead. Sharding justified by routing semantics, NOT by raw lookup speed (§5.3 line 735 unsharded microbench shows opposite trade-off due to `i % SHARDS` indexing overhead, irrelevant to numeric methodCode dispatch). |
+| compact metadata only | TypedArray |
+| method availability | bit mask or compact integer tag |
+| ASCII char-class prefilter | bitmap only after route-distribution proof |
+
+기각된 전략:
+
+- fanout 기준 naive array scan
+- static child open-address hash
+- packed key lookup
+- `Bun.hash` hot path
+- TextEncoder byte route matching
+- DataView node table
+
+조건부 후보:
+
+- perfect hash 후보 중 두 변종은 §5.2 #6 / §5.4 G에서 empirically REJECTED: (a) `Bun.hash` + open-address `Int32Array` 113.69 ns/lookup (4.1× slower than null-proto object); (b) Cuckoo hash with TS-implemented djb2/FNV 80.26 ns/lookup (2.8× slower). 추가 perfect hash 변종은 §0 implementation language scope (TypeScript only, no native bindings) 안에서 위 두 결과보다 빨라야 candidate 자격이 유지된다.
+- bitmap/rank는 ASCII char-class prefilter에는 가능성이 있지만, string child lookup 대체 용도로는 현재 근거 부족이다.
+- radix/compressed trie는 기본 설계로 채택하지 않는다. Static full path는 object lookup이 이미 강하고, dynamic route는 segment trie이다. P3 memory experiment로만 둔다.
+- DFA/NFA는 기각한다. Regex tester와 segment grammar가 남아 있고, 현재 코드/벤치에서 object+segment trie를 이긴 근거가 없다.
+
+---
+
+## 11. Memory Strategy
+
+현재 사실:
+
+- object node 500k: heap 증가가 크다.
+- Int32Array 500k\*8 allocation probe: heap 증가는 없고 rss/arrayBuffers 쪽 증가를 별도로 봐야 한다. Raw payload is 15.26 MiB; measured RSS includes allocator/page effects.
+- 100k static build/runtime state may retain duplicated static structures unless explicitly dropped or compacted after snapshot publication.
+- 100k param memory is not driven by duplicated params factory functions in the measured shape: there are 100,000 factory slots but only 1 unique factory function. The remaining candidates are segment node object graph, staticChildren objects, terminal arrays/slots, handlers, generated source, and cache state.
+
+따라서 메모리 최적화 방향은 “전면 TypedArray 라우터”가 아니라 다음이다.
+
+1. runtime node object 수를 줄인다.
+2. duplicated terminal/handler/factory slots를 intern한다. Unique factory functions are already interned for the measured 100k param shape.
+3. optional expansion은 가능한 terminal aliasing으로 처리한다.
+4. param offsets, terminal tags, method masks 같은 dense metadata만 TypedArray로 이동한다.
+5. static full-path table은 object lookup을 유지한다.
+6. build-only indexes and validation journals are discarded after successful snapshot publication.
+7. dynamic segment tree memory is reduced only where profiles show object graph bloat: compressed static chains, suffix/template interning, terminal aliasing, or compact metadata tables.
+
+Build/runtime lifetime:
+
+- Prefix-index counters such as `subtreeTerminalCount` and `subtreeWildcardCount` are build-only validation data and must not be retained by the published runtime snapshot.
+- `methodCodes` is built per router snapshot. It is not module-global, and custom method codes do not leak across router instances or rebuild attempts.
+
+이 방향은 현재 근거상 가장 먼저 검증해야 할 메모리 최적화 경로다. object lookup의 JSC 최적화를 버리지 않고, 메모리 bloat가 큰 부속 데이터를 compact table로 옮기는 방식이기 때문이다. “최고 효율” 여부는 100k retained memory와 p75/p99 regression을 함께 통과해야 확정한다.
+
+---
+
+## 12. Implementation Priorities
+
+Implementation rule:
+
+- Do not optimize before the failing or bottleneck behavior is reproduced.
+- Every accepted change needs a RED checkpoint, GREEN implementation, and post-change bench/profile comparison when performance or memory is affected.
+- If a benchmark script is found to measure the wrong thing, fix the benchmark first and mark previous numbers obsolete.
+- If two optimizations conflict, preserve correctness/security first, then p75/p99 latency, then memory, then mean ns/op.
+- A microbench can select candidates, but only an end-to-end 100k gate can approve them.
+
+### P0: Correctness
+
+- `build()`에서 batch validation을 유지한다.
+- 100k target band and bench methodology must be finalized before any final performance claim.
+- `optionalParamBehavior`가 snapshot generation에 정확히 전달되어야 한다.
+- stale regression tests must be identified by file/symptom and updated to the current snapshot structure.
+- RFC 9110 method token validation을 추가한다.
+- RFC 3986 path character / percent-escape / control-character / query-fragment validation을 추가한다.
+- Runtime malformed percent strict policy를 정하고 테스트한다.
+- Dot segment and encoded dot segment policy를 정하고 테스트한다.
+- Secure/default profile에서는 unbounded `Infinity` limits를 금지하거나 explicit unsafe opt-out으로 격리한다.
+- 100k mixed build bottleneck을 재현 테스트로 고정하고 원인을 제거한다.
+- 100k mixed build must be phase-instrumented before optimization: parse, optional expansion, static insert, dynamic insert, wildcard conflict check, snapshot build, codegen.
+- Wildcard/static conflict validation moves from O(static \* wildcard-prefix) scan to indexed prefix/trie validation if phase instrumentation confirms it as the 100k mixed bottleneck.
+
+### P1: Hot Path
+
+- method object lookup 유지
+- static object lookup 유지
+- dynamic codegen walker 유지
+- offset param 유지
+- param factory 중복 호출 제거
+- params cache mutation semantics 확정: frozen, clone-on-hit, or lazy read-only.
+- dynamic traversal `substring()` allocation 제거 또는 end-to-end 근거 기반 수용
+- static hit cache order 재측정: cache-first vs static-first
+- static table layout 재측정: method-first vs path-first method array
+- per-method cache는 high-cardinality workload에서 이득/손해를 profile로 판단
+- codegen preflight 추가: node-count, fanout, source estimate, compile time telemetry.
+
+### P2: Memory
+
+- 100k param retained heap을 줄인다.
+- 100k param heap source를 object count로 분해한다: segment nodes, static child maps, terminals, factories, generated code, cache.
+- terminal handler aliasing
+- params factory interning is accepted only after re-measuring shapes where unique factories are not already 1. The measured `100k param` shape already has 1 unique factory function, so its target is factory slots/terminal metadata, not factory function identity.
+- optional expansion terminal 중복 제거
+- dense metadata TypedArray화
+- build-only static structures drop/compact
+- rollback/validation journal의 closure allocation을 typed journal or two-pass prevalidation로 대체할지 검증
+- dynamic static-chain compression, suffix/template interning은 measured memory experiment로만 채택
+
+### P3: Conditional Experiments
+
+- perfect hash only for proven huge static sets
+- lazy params object materialization
+- generated static equality only below code-size threshold
+- terminal tag fast/poly only if end-to-end shows benefit; not a default requirement
+- compact path-first static table plus method mask/handler slots vs method-first table
+- manual slash scan vs `indexOf` across path length/slash distributions
+- radix/compressed trie for dynamic static-chain memory only
+- route distribution based specialization
+
+### Required RED Reproducers Before Router Refactor
+
+| Reproducer | Must prove | Acceptable outcome |
+| -------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
+| optional behavior | `optionalParamBehavior: 'omit'` is ignored by current seal path | failing test before fix |
+| params factory double-call | one dynamic hit invokes factory twice or allocates twice | failing counter/allocation test before fix; GREEN requires factory invocation count == 1 per successful dynamic match |
+| invalid method token | empty/space/control/delimiter methods are accepted today | failing validation test before fix |
+| registration path policy | query/fragment/control/malformed percent/dot path accepted today | failing validation test before fix |
+| runtime strict percent | malformed/unsafe encoded runtime path behavior is currently compat/raw-pass-through | policy test documents current behavior before change |
+| 100k mixed build | phase split identifies dominant build phase | timing output with phase percentages; GREEN requires dominant phase share <= 60% Guard after optimization |
+| 100k param memory | heap profile identifies top retained object groups | object-count/retained-size report |
+| cache order | static-first vs cache-first measured on static-hot, static-cold, churn, miss | p75/p99 comparison |
+| static layout | method-first vs compact path-first measured with multi-method and wrong-method semantics | latency + memory comparison |
+| codegen preflight | large tree codegen cost is measured before/after preflight | source bytes + compile ms |
+
+---
+
+## 13. Implementation Blueprint
+
+This section is the build plan. It defines where each change goes, the algorithm to use, and the RED/GREEN proof required before moving on.
+
+### Phase 0: Bench And Test Infrastructure
+
+Goal:
+
+- Make current failures and performance bottlenecks reproducible without ad-hoc shell snippets.
+
+Files:
+
+- `packages/router/bench/100k-verification.ts`
+- `packages/router/bench/100k-gate-runner.ts`
+- new `packages/router/test/enterprise-validation.test.ts`
+- new `packages/router/test/cache-semantics.test.ts`
+
+Implementation:
+
+- Keep `100k-gate-runner.ts` as the fresh-process aggregation runner.
+- Add JSON output mode to the runner before final optimization work.
+- Add phase timer hooks around registration stages before changing wildcard conflict logic.
+- Add RED tests for method token, path policy, optional omit, params cache mutation, HEAD/OPTIONS, and route precedence.
+
+Exit criteria:
+
+- RED tests fail on current code for known defects.
+- `100k mixed` phase output identifies where time is spent.
+- Baseline gate output can be saved and compared after implementation.
+
+### Phase 1: Batch Validation And Security Profile
+
+Goal:
+
+- Implement secure/default validation without changing match hot path first.
+
+Files:
+
+- `packages/router/src/types.ts`
+- `packages/router/src/router.ts`
+- `packages/router/src/pipeline/registration.ts`
+- `packages/router/src/builder/path-parser.ts`
+- new `packages/router/src/builder/method-policy.ts`
+- new `packages/router/src/builder/path-policy.ts`
+- new `packages/router/src/builder/validation-issue.ts`
+
+Data model:
+
+```ts
+type RouterProfile = 'secure' | 'compat' | 'unsafe';
+
+type RouterIssue = {
+ kind: RouterIssueKind;
+ reason: string;
+ routeIndex?: number;
+ path?: string;
+ method?: string;
+ segmentIndex?: number;
+ offset?: number;
+};
+```
+
+Algorithm:
+
+- `add()` still records intent only.
+- `seal()` validates pending routes in one pass and collects `RouterIssue[]`.
+- Method validation runs before method code allocation.
+- Path raw-character validation runs before route grammar parsing.
+- Dot-segment validation runs on percent-decoded segment only for dot detection.
+- Regex policy validates param regex before `RegExp` construction.
+- If issues exist, throw one `RouterValidationError` containing all issues.
+
+Default values:
+
+- `profile = 'secure'`
+- `maxMethodLength = 64`
+- `maxPathLength = 8192`
+- `maxSegmentLength = 1024`
+- `maxSegmentCount = 256`
+- `maxParams = 64`
+- `maxOptionalExpansions = 1024`
+- `maxExpandedRoutes = 200_000`
+- `maxRegexSiblingsPerSegment = 32`
+- `cacheSize = 1000`
+- `optionalParamBehavior = 'omit'`
+
+RED tests:
+
+- invalid methods accepted today.
+- query/fragment/control/dot/malformed percent paths accepted today.
+- `Infinity` limits accepted in secure/default today where applicable.
+- unsafe regex constructs accepted today where applicable.
+
+GREEN criteria:
+
+- All invalid cases produce deterministic issue kinds.
+- Multiple invalid routes produce one batched error.
+- Valid custom methods such as `PROPFIND`, `PATCH+X`, `foo`, `get` still work.
+- Existing valid route grammar remains compatible under `compat` where needed.
+
+Performance risk:
+
+- Validation is build-time only. No match hot-path regression is allowed.
+
+### Phase 2: Runtime Secure Path Scanner
+
+Goal:
+
+- Enforce secure/default runtime percent, dot, fragment, control, and encoded slash policy before cache/static/dynamic lookup.
+
+Files:
+
+- new `packages/router/src/matcher/runtime-path-policy.ts`
+- `packages/router/src/codegen/emitter.ts`
+- `packages/router/src/pipeline/build.ts`
+- tests in `packages/router/test/runtime-path-policy.test.ts`
+
+Algorithm:
+
+- Run the scanner before cache lookup. Secure/default scanner order is the same six-step normalization defined in section 7.2: raw `#` reject with no cache, raw `?` query strip, percent/UTF-8/dot/encoded-slash validation, trailing slash policy, compat-only case policy (n/a in secure), and lookup-key return.
+- In secure/default, malformed or unsafe path returns no-match and is not recorded in hit/miss caches.
+- The scanner returns `{ ok: true, path }` or `{ ok: false, reason }`.
+- Param/wildcard percent decoding uses the same validated byte spans, avoiding a second unsafe decode path where practical.
+
+RED tests:
+
+- malformed `%`, invalid UTF-8, `%2F`, `%00`, `%2e`, fragment `#` currently do not follow secure/default policy.
+
+GREEN criteria:
+
+- All unsafe runtime inputs no-match in secure/default.
+- Compat preserves documented behavior only when explicitly selected.
+- Static, param, wildcard warmed p99 remain within Guard.
+
+Performance risk:
+
+- Scanner is on match hot path. It must be single-pass over the path and avoid allocation on valid ASCII paths.
+
+### Phase 3: Optional Param Behavior And Params Cache Semantics
+
+Goal:
+
+- Fix `optionalParamBehavior: 'omit'` and remove factory double-call without cache poisoning.
+
+Files:
+
+- `packages/router/src/router.ts`
+- `packages/router/src/pipeline/registration.ts`
+- `packages/router/src/codegen/emitter.ts`
+- `packages/router/src/builder/optional-param-defaults.ts`
+
+Algorithm:
+
+- Pass `routerOptions.optionalParamBehavior` into `registration.seal({ optionalParamBehavior })`.
+- Keep param factory keyed by behavior and present param set.
+- Replace double factory call with one materialization plus cache-safe storage.
+- **Locked implementation choice (per §5.2 #4 / §5.3 F)**: `clone-on-cache-hit (spread)`. The cached params object is stored once and every cache-hit returns `{...cached}`. `Object.freeze({...})` per call is rejected (40.76 ns vs 12.77 ns at 2-key; 137.43 ns vs 26.70 ns at 20-key — 1.55–3.73× slower across param counts). `clone-on-cache-store` alone is also rejected for safety. Lazy read-only params remain a Phase 3b candidate.
+- Do not store the same mutable params object that is returned to the caller.
+
+RED tests:
+
+- `omit` currently returns `id: undefined`.
+- params mutation followed by same-path lookup must keep original cached value across 1st, 2nd, and 3rd hit.
+
+GREEN criteria:
+
+- `omit` produces absent key.
+- `set-undefined` produces key with `undefined`.
+- caller mutation cannot change later cache hits.
+- dynamic hit p99 does not regress beyond Guard budget.
+
+Performance risk:
+
+- Freezing may be expensive on hot path.
+- Clone-on-hit may add allocation.
+- If both regress, implement lazy read-only params as Phase 3b.
+
+### Phase 4: Wildcard Conflict Index
+
+Goal:
+
+- Remove the reproduced O(static \* wildcard-prefix) build blow-up.
+
+Files:
+
+- `packages/router/src/pipeline/registration.ts`
+- new `packages/router/src/pipeline/wildcard-prefix-index.ts`
+- tests in `packages/router/test/route-conflict.test.ts`
+- bench in `packages/router/bench/100k-verification.ts`
+
+Data structure:
+
+```ts
+type WildcardPrefixIndex = Map;
+
+type PrefixTrieNode = {
+ literalChildren: Record;
+ paramChild: PrefixTrieNode | null;
+ paramName: string | null;
+ regexParamChildren: PrefixTrieNode[];
+ regexAst: SafeRegexAst | null;
+ wildcardName: string | null;
+ terminalMeta: RouteMeta | null;
+ subtreeTerminalCount: number;
+ subtreeWildcardCount: number;
+};
+```
+
+Algorithm:
+
+- Maintain one tokenized trie per method code.
+- Segment keys come from the same parsed/expanded/normalized route parts used for registration after secure/default policy validation.
+- The trie stores literal, param, regex-param, wildcard, and terminal edges.
+- When registering any route, check whether an ancestor wildcard already makes it unreachable.
+- When registering a wildcard route, check whether existing descendant terminals already exist below its prefix, independent of registration order.
+- Param prefix wildcard examples such as `/:tenant/files/*path` are represented by param edges, not stringified literal prefixes.
+- Optional-expanded routes are checked after expansion so aliases/conflicts are visible.
+- If any walked trie node has `wildcardName`, the route is unreachable/conflicting.
+- `paramChild` is a single shape edge by policy. A second same-position plain param with a different name is not a new edge; it emits `route-duplicate` for the same method.
+- `route-duplicate` covers same method plus structurally identical pattern shape, even when param names differ; it is not limited to byte-identical path strings.
+- `subtreeTerminalCount` is incremented on every visited ancestor, including the terminal node itself, at commit. Wildcard insertion reads this counter at any ancestor, including the prefix node, in O(1) without subtree enumeration.
+- Complexity for static/plain-param/wildcard prefix checks becomes O(segment count) per expanded route. Regex-param insertion adds sibling comparison cost O(regex siblings at that segment \* conservative AST comparison). `maxRegexSiblingsPerSegment = 32` prevents unbounded sibling comparison and emits `regex-sibling-limit` when exceeded. Optional expansion multiplies work by expanded route count and must be capped globally.
+- Pseudocode convention: `parts` excludes the trailing wildcard capture segment. `wildcardTail` is passed separately as `null | { name: string }`.
+- Batch validation convention: when `issue(...)` is emitted for a route, stop mutating the prefix index for that route but keep processing later routes so all independent issues can be collected.
+- Expansion counter convention: `totalExpandedRoutes` is a per-`build()`/`seal()` batch counter initialized to 0 before pending routes are validated. It is not module-level or router-lifetime state.
+- Expansion wrapper convention: `routeSpec` is a normalized pre-expansion route descriptor produced by Phase 1 path parsing. `optionalExpansions(routeSpec)` yields concrete expanded routes. Every yielded `ExpandedRoute.meta` must set `isOptionalExpansion = true` if and only if that concrete route was produced by optional-segment dropping; the all-present route and ordinary repeated `add()` calls keep `isOptionalExpansion = false`. `expandAndAdd` is invoked once per pending route during seal.
+- Expansion cap convention: `totalExpandedRoutes` increments before per-expanded-route validation. Routes that fail later validation still consume capacity because the cap protects build-time work, not only successful registrations.
+- Batch continuation convention: when `expandAndAdd` emits `expansion-total-limit`, batch validation records one consolidated `expansion-total-limit` issue for the batch and then skips further expanded-route insertion/counting for that overflowing batch segment to avoid issue spam. Independent non-expansion validation can still continue where safe.
+- Batch consolidation convention: `batchTotalLimitEmitted: boolean` is a per-`build()`/`seal()` flag initialized to `false`. The first `++totalExpandedRoutes > maxExpandedRoutes` condition emits one `expansion-total-limit` issue and sets the flag. Subsequent `expandAndAdd` invocations within the same batch return immediately without emitting additional `expansion-total-limit` issues. The flag and `totalExpandedRoutes` are both reset to initial values on `build()` failure cleanup.
+- Lazy node allocation convention: the reference pseudocode below allocates `plannedNode` eagerly inside `planEdge` for traversal clarity. Implementations may defer `createNode()`/`createRegexNode()` to `commitEdge` as a build-time optimization so that abandoned plans on validation failure incur zero allocator pressure. To reconcile the descent dependency at validation time, lazy implementations must either (a) reuse a single per-build transient placeholder node that carries empty `literalChildren`/`paramChild`/`regexParamChildren` and is never committed, or (b) thread `(parent, key, kind)` references through validation and resolve children via the parent rather than via the planned descendant. Either form is permitted; the observable semantics are identical and the §11 build-time efficiency invariant under high 100k mixed insertion volume must be preserved.
+- Issue metadata convention: `routeSpec.meta` carries the original pre-expansion route index/path/method. `routeMeta` carries the concrete post-expansion path plus the same original route index. Validation issues must expose both when useful: `path` is the original registered pattern, and `expandedPath` is optional diagnostic metadata for the concrete expanded route.
+- Wildcard count convention: when a wildcard route commits, `plan.visited` contains the root, every ancestor, and the prefix node where the wildcard attaches. Every visited node receives `subtreeWildcardCount++`, including the prefix attachment node itself; no separate wildcard anchor node is created.
+- Preserve existing wildcard name conflict checks.
+- Regex-param conflict handling uses the conservative disjointness policy from section 7.2. The prefix index must treat non-proven regex overlap as conflict; it must not attempt general regex automata construction.
+- Regex sibling limit has priority over regex overlap checks. If adding a regex sibling would exceed `maxRegexSiblingsPerSegment`, emit `regex-sibling-limit` before running AST disjointness, even if the same candidate would also overlap.
+- `terminalMeta` stores route index/path/method/handler/options identity for duplicate, alias, and conflict diagnostics. Build-only counters and validation trie state are discarded after snapshot publication as described in section 11.
+- `handlerId` is assigned by a build-scoped identity registry: `WeakMap