From e0b6d5f051fed166f3bb716b79b18f5f15fdbfc9 Mon Sep 17 00:00:00 2001 From: wan9chi Date: Fri, 30 Oct 2026 10:10:05 +0900 Subject: [PATCH 1/2] test(e2e): show that removing an empty folder a task made makes it miss Three cases for a task whose output folder holds an empty folder it made. In `empty_folder_in_output`, the task makes `out/empty`, writes `out/a.txt` and stats `out`, through `vtt fs`; in `empty_folder_in_output_globs`, the same task has the explicit `output` glob `out/**`, which matches `out/empty`. In `astro_empty_collections`, `astro build` (Astro 6, added to `packages/tools`) on a one-page site makes `.astro/collections` and leaves it empty, next to the `.d.ts` files it writes in `.astro`, and stats both folders. Today a folder holding an empty folder isn't rebuildable, since fspy doesn't record a mkdir as one, so removing it, as on a clean checkout, is a cache miss. On Windows, where a mkdir is recorded as a read, the empty folder is an input too, and vt names whichever removed input its parallel validation finds first, so the synthetic cases redact the miss reason. Astro needs Vite 7, so a scoped `astro>vite` override keeps the global `vite` override from handing it the Vite+ fork. esbuild and sharp, which Astro depends on, get their prebuilt binaries as optional dependencies, so their build scripts are skipped. The Astro case removes `.astro`, `dist`, `node_modules/.astro` and `node_modules/.vite/deps`, not all of `node_modules/.vite`, which holds the task cache too, and recreates nothing, as on a clean checkout. Several inputs are then missing, and vt names whichever its parallel validation finds first, so the next step redacts its miss reason. Co-Authored-By: Claude Opus 5.5 --- .../astro_empty_collections/package.json | 5 + .../astro_empty_collections/snapshots.toml | 32 + .../snapshots/astro_empty_collections.md | 30 + .../src/pages/index.astro | 4 + .../astro_empty_collections/vite-task.json | 8 + .../empty_folder_in_output/package.json | 4 + .../empty_folder_in_output/snapshots.toml | 57 + .../snapshots/empty_folder_in_output.md | 30 + .../snapshots/empty_folder_in_output_globs.md | 30 + .../empty_folder_in_output/vite-task.json | 14 + packages/tools/package.json | 1 + pnpm-lock.yaml | 3280 ++++++++++++++++- pnpm-workspace.yaml | 8 + 13 files changed, 3311 insertions(+), 192 deletions(-) create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/package.json create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/src/pages/index.astro create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/vite-task.json create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/package.json create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md create mode 100644 crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/vite-task.json diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/package.json b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/package.json new file mode 100644 index 000000000..b4a5cf06e --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/package.json @@ -0,0 +1,5 @@ +{ + "name": "astro-empty-collections", + "private": true, + "type": "module" +} diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml new file mode 100644 index 000000000..aa488bf69 --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml @@ -0,0 +1,32 @@ +[[e2e]] +name = "astro_empty_collections" +comment = """ +`astro build` (Astro 6) on a one-page site makes `.astro/collections` and `node_modules/.astro` and leaves them empty, writes `.astro/*.d.ts`, rewrites `dist/.prerender/*` and then removes the folder, stats `dist`, lists the project root, and Vite's dependency optimizer renames `node_modules/.vite/deps_temp_*` to `deps` and reads it back. +""" +ignore = true +steps = [ + [ + "vt", + "run", + "build", + ], + { argv = [ + "vtt", + "rm", + "-r", + ".astro", + "dist", + "node_modules/.vite/deps", + "node_modules/.astro", + ], comment = "remove Astro's outputs and caches, as on a clean checkout (vp's own cache is in `node_modules/.vite/task-cache`)" }, + { argv = [ + "vt", + "run", + "build", + ], comment = "several inputs are missing and vt names whichever it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + [ + "vtt", + "stat-file", + ".astro/collections", + ], +] diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md new file mode 100644 index 000000000..ff085705f --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md @@ -0,0 +1,30 @@ +# astro_empty_collections + +`astro build` (Astro 6) on a one-page site makes `.astro/collections` and `node_modules/.astro` and leaves them empty, writes `.astro/*.d.ts`, rewrites `dist/.prerender/*` and then removes the folder, stats `dist`, lists the project root, and Vite's dependency optimizer renames `node_modules/.vite/deps_temp_*` to `deps` and reads it back. + +## `vt run build` + +``` +$ ASTRO_TELEMETRY_DISABLED=1 astro build --silent +``` + +## `vtt rm -r .astro dist node_modules/.vite/deps node_modules/.astro` + +remove Astro's outputs and caches, as on a clean checkout (vp's own cache is in `node_modules/.vite/task-cache`) + +``` +``` + +## `vt run build` + +several inputs are missing and vt names whichever it finds first, so the miss reason is redacted + +``` +$ ASTRO_TELEMETRY_DISABLED=1 astro build --silent ○ cache miss: , executing +``` + +## `vtt stat-file .astro/collections` + +``` +.astro/collections: exists +``` diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/src/pages/index.astro b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/src/pages/index.astro new file mode 100644 index 000000000..1dea0c34a --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/src/pages/index.astro @@ -0,0 +1,4 @@ +--- +--- + +

hi

diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/vite-task.json b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/vite-task.json new file mode 100644 index 000000000..9d91cec8e --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/vite-task.json @@ -0,0 +1,8 @@ +{ + "tasks": { + "build": { + "command": "ASTRO_TELEMETRY_DISABLED=1 astro build --silent", + "cache": true + } + } +} diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/package.json b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/package.json new file mode 100644 index 000000000..c952514cb --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/package.json @@ -0,0 +1,4 @@ +{ + "name": "empty-folder-in-output", + "private": true +} diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml new file mode 100644 index 000000000..0ea1c883c --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml @@ -0,0 +1,57 @@ +[[e2e]] +name = "empty_folder_in_output" +comment = """ +The task makes `out/empty` and leaves it empty, writes `out/a.txt` and stats `out`, like a build tool that makes a folder for outputs it doesn't have this time. +""" +steps = [ + [ + "vt", + "run", + "build", + ], + { argv = [ + "vtt", + "rm", + "-r", + "out", + ], comment = "remove the output folder, as on a clean checkout" }, + { argv = [ + "vt", + "run", + "build", + ], comment = "on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + [ + "vtt", + "stat-file", + "out/empty", + ], +] + +[[e2e]] +name = "empty_folder_in_output_globs" +comment = """ +The same task with explicit `output` globs, `out/**`, which match `out/empty`. +""" +steps = [ + [ + "vt", + "run", + "build-globs", + ], + { argv = [ + "vtt", + "rm", + "-r", + "out", + ], comment = "remove the output folder, as on a clean checkout" }, + { argv = [ + "vt", + "run", + "build-globs", + ], comment = "on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + [ + "vtt", + "stat-file", + "out/empty", + ], +] diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md new file mode 100644 index 000000000..908de502c --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md @@ -0,0 +1,30 @@ +# empty_folder_in_output + +The task makes `out/empty` and leaves it empty, writes `out/a.txt` and stats `out`, like a build tool that makes a folder for outputs it doesn't have this time. + +## `vt run build` + +``` +$ vtt fs mkdir out/empty write out/a.txt hi stat out +``` + +## `vtt rm -r out` + +remove the output folder, as on a clean checkout + +``` +``` + +## `vt run build` + +on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted + +``` +$ vtt fs mkdir out/empty write out/a.txt hi stat out ○ cache miss: , executing +``` + +## `vtt stat-file out/empty` + +``` +out/empty: exists +``` diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md new file mode 100644 index 000000000..4bceac052 --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md @@ -0,0 +1,30 @@ +# empty_folder_in_output_globs + +The same task with explicit `output` globs, `out/**`, which match `out/empty`. + +## `vt run build-globs` + +``` +$ vtt fs mkdir out/empty write out/a.txt hi stat out +``` + +## `vtt rm -r out` + +remove the output folder, as on a clean checkout + +``` +``` + +## `vt run build-globs` + +on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted + +``` +$ vtt fs mkdir out/empty write out/a.txt hi stat out ○ cache miss: , executing +``` + +## `vtt stat-file out/empty` + +``` +out/empty: exists +``` diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/vite-task.json b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/vite-task.json new file mode 100644 index 000000000..b117e7959 --- /dev/null +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/vite-task.json @@ -0,0 +1,14 @@ +{ + "tasks": { + "build": { + "command": "vtt fs mkdir out/empty write out/a.txt hi stat out", + "cache": true + }, + "build-globs": { + "command": "vtt fs mkdir out/empty write out/a.txt hi stat out", + "cache": { + "output": ["out/**"] + } + } + } +} diff --git a/packages/tools/package.json b/packages/tools/package.json index 75b06c154..80f7d0102 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -17,6 +17,7 @@ "@playwright/browser-chromium": "catalog:", "@vitest/browser-playwright": "catalog:", "@voidzero-dev/vite-task-client": "workspace:*", + "astro": "catalog:", "bun": "catalog:", "cbor-edn": "catalog:", "cbor2": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7cef6b2c..ff5e8d67f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ catalogs: '@vitest/browser-playwright': specifier: 5.0.3 version: 5.0.3 + astro: + specifier: 6.4.8 + version: 6.4.8 bun: specifier: 1.4.2 version: 1.4.2 @@ -83,6 +86,7 @@ overrides: playwright: 1.63.0 vite: npm:@voidzero-dev/vite-plus-core@1.1.0 vite-task-tools>vite: 8.3.2 + astro>vite: ^7.3.2 importers: @@ -99,10 +103,10 @@ importers: version: 6.0.3 vite: specifier: npm:@voidzero-dev/vite-plus-core@1.1.0 - version: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)' + version: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)' vite-plus: specifier: 'catalog:' - version: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3) + version: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3) packages/tools: dependencies: @@ -120,10 +124,13 @@ importers: version: 1.63.0 '@vitest/browser-playwright': specifier: 'catalog:' - version: 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) + version: 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) '@voidzero-dev/vite-task-client': specifier: workspace:* version: link:../vite-task-client + astro: + specifier: 'catalog:' + version: 6.4.8(@types/node@25.0.3)(db0@0.4.2)(lightningcss@1.33.0)(rollup@4.67.4) bun: specifier: 'catalog:' version: 1.4.2 @@ -147,10 +154,10 @@ importers: version: 3.0.260903-beta oxfmt: specifier: 'catalog:' - version: 0.73.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) + version: 0.73.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) oxlint: specifier: 'catalog:' - version: 1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) + version: 1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) oxlint-tsgolint: specifier: 'catalog:' version: 7.0.2005 @@ -171,10 +178,10 @@ importers: version: 7.1.0-dev.20261001.1 vite: specifier: 8.3.2 - version: 8.3.2(@types/node@25.0.3) + version: 8.3.2(@types/node@25.0.3)(esbuild@0.27.7) vitest: specifier: 'catalog:' - version: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + version: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) devDependencies: '@types/cross-spawn': specifier: 'catalog:' @@ -192,21 +199,63 @@ packages: engines: {node: '>=20.11.0'} hasBin: true + '@astrojs/compiler@4.0.0': + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} + + '@astrojs/internal-helpers@0.10.0': + resolution: {integrity: sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==} + + '@astrojs/markdown-remark@7.2.0': + resolution: {integrity: sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==} + + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/telemetry@3.3.2': + resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.11': + resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} + '@babel/parser@7.29.12': + resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.11': + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} + engines: {node: '>=6.9.0'} + '@blazediff/core@1.10.0': resolution: {integrity: sha512-AOQff0zgR7cGsZL+4E7hVkmujoPUpm0J9xzWGWZj5wCjd3gmxESXAPfKyuzs93VdpQNFhHlBhfOjrcZ+XTERtQ==} + '@capsizecss/unpack@4.0.1': + resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} + engines: {node: '>=18'} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} + '@deno/darwin-arm64@2.9.6': resolution: {integrity: sha512-V8uO1Aolrl/yvdMb5lOtgtigs8YuZBjrOrgviVMiYkQ0swymFfzkae1wZak4Xi24t7vf7d/eiMb/7ryjjVm+tg==} cpu: [arm64] @@ -239,12 +288,324 @@ packages: cpu: [x64] os: [win32] + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@fastify/busboy@3.2.2': resolution: {integrity: sha512-yXSS27qPExaXeuLvMRMXOLtpipzfQYNjG3FkunDWKGfMYjKuhFXko9CVzqxm8jcF+lmtS9Fd89QNdh9XDjnbNg==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -255,6 +616,13 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + '@openai/codex@0.160.0': resolution: {integrity: sha512-kEtVGzjRAYAMOwJxN39bGcna7LT3IDQgq64NNJ/dDTfu4OzZaocJcyNb5/gGJ/IVF/Vj7oK7E2m3nmTan7lpjg==} engines: {node: '>=16'} @@ -296,6 +664,9 @@ packages: cpu: [x64] os: [win32] + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oven/bun-darwin-aarch64@1.4.2': resolution: {integrity: sha512-MXdZkP1featqxZ+/VTXWG1BVjM4OGBehVY2Q88EeUj/7L0UMeCGItmyPYTN+wxvlGJ6F66JEtzsw+GvQWewnag==} cpu: [arm64] @@ -1034,52 +1405,253 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/user-event@14.6.7': - resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} - engines: {node: '>=12', npm: '>=6'} + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} + engines: {node: '>=14.0.0'} peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@tsconfig/strictest@2.0.8': - resolution: {integrity: sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@rollup/rollup-android-arm-eabi@4.67.4': + resolution: {integrity: sha512-/v/pUAPOcwp+r1Hjjdg0cBV1TE89CzGKrKh2FgkIQw2QBcIMmVPOCSfuOZStCn4Xh/98HXfo/ht6ztcssctPNg==} + cpu: [arm] + os: [android] - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@rollup/rollup-android-arm64@4.67.4': + resolution: {integrity: sha512-6tmmB/P52Vt167FXXEw5auiEUgTtZz7aqUgWHqYXToIUE0HFDY6fTdAyeekjjsNk6O/8dtpSKtClxSj1mMneKQ==} + cpu: [arm64] + os: [android] - '@types/node@25.0.3': - resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + '@rollup/rollup-android-x64@4.67.4': + resolution: {integrity: sha512-8Z9Q4RmotVmuL4llOvqX814JNiOK1oqoBv+glG5KbpRfUiypqzz2/fxIzK4Pq129l4dT5a8Gszmpc0/XPYoFuQ==} + cpu: [x64] + os: [android] - '@typescript/typescript-darwin-arm64@7.1.0-dev.20261001.1': - resolution: {integrity: sha512-LKHKuZcqmrl2bVgAufg3nbajpzoqi8cZzTs4gFi2G9P818TzbVE0WqdttpeeS2kVtLRIgEzSAtz4cIYJVf2Tpw==} - engines: {node: '>=16.20.0'} + '@rollup/rollup-darwin-arm64@4.67.4': + resolution: {integrity: sha512-pnq6hssxTtwuRAl6Kdi/+IDY+b1IhkUetjhUkdLAAJCssjfqtL2Oqy/FXJVJFtAWOu1oRlArIvf0Yk1O92x2HQ==} cpu: [arm64] os: [darwin] - '@typescript/typescript-darwin-x64@7.1.0-dev.20261001.1': - resolution: {integrity: sha512-V5mCrDb+rwsd/FaL/9LVa7xi+SrfGdFMXTkKVSAPf7X/6W9IaVhgbI3ls2DJmwAJz+aj61mzWGrbCpscNyQ9lw==} - engines: {node: '>=16.20.0'} + '@rollup/rollup-darwin-x64@4.67.4': + resolution: {integrity: sha512-BeIrGZvHMVdJg/N+ohZfFywG/gF41684YhDj2wBvouj7m9ziP1tZDUNwzXRiDY+3WIKngaC4hiUBqVtBPGP5og==} cpu: [x64] os: [darwin] - '@typescript/typescript-linux-arm64@7.1.0-dev.20261001.1': - resolution: {integrity: sha512-mLp3CyqlvUIAaEBukoO3g2XDKrrp3nhSPhuiBJY0jgL3sNXBnDftT3HKpxwo9Vcob8Nm81STwpZqlaVu2Ac3JA==} - engines: {node: '>=16.20.0'} + '@rollup/rollup-freebsd-arm64@4.67.4': + resolution: {integrity: sha512-fRFX/oqNg/g780DKoS8RIfYcZD59Ru5O/bSeK1N7gQljBFrTxJY/q5EX4eMs5SrJf32VgVBVVYCdfPpzAwPPnQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.67.4': + resolution: {integrity: sha512-bSrBRopG1q+0RuOsW0NtYTtIODlvNA3T3ebx5WnQVdSxWIoXFmj+rZdHUHdSLgFdZ5M6VGmekYE7r4RMGQXjfg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.67.4': + resolution: {integrity: sha512-L8IvdrJVtl65g1ozwDSyjGPG+FmibhCdFUwmqTItJLw0S3+Oj4QzFs7rfgTUiK7rsPjkCLdG1/GApFxoynXFJQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.67.4': + resolution: {integrity: sha512-h7PcoQOzC31jshNpQ48J0akB9tsghjkSjSl5AZ6XsVGTxVsln7t7C4SQyw62tNVSaz2SeHgk4VT2ELbL17BSHQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.67.4': + resolution: {integrity: sha512-KSPuOBNHoOl7AsVjeY1KZci8+0up0U4TFAHU5IzBYN8P+Z6cB9DZq28+JQycZW7f6WLLa/tSzhV7Rdy95bVi+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.67.4': + resolution: {integrity: sha512-0E/mKmVk1PlQeQYygIwQm0jlwjANTzGSiNBMPrFx+rdFGFj/2Axh4p6XwcrystQIqXZVudTaGsdbDpzYgJ4wSA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.67.4': + resolution: {integrity: sha512-Fvw7dOSc2Sa9UOipRZVI0zOgdLCzsjVyD/6JuHXzUHTXFu7mMgmeX/0/bCVBIut1dz+nWz3pV4WpS/Qg0XVnxw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.67.4': + resolution: {integrity: sha512-jzxbVHaE7V3F+P0wEK7UydQtvv7Twfdtx58jI5/3VRx1jJxyrn+qFwfXmqjVFxPhBl+zjaRs+ZJMFJw7vdHaQA==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.67.4': + resolution: {integrity: sha512-fhtrzp9p4GjEJVaigaap9g6X9nP6xgJtKiLLXSDgpE18HXufA5aqfltGn+KAqMtVZReJZfOrXm//y5YSA9BWbA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.67.4': + resolution: {integrity: sha512-uynaF7IUHwAckV0S+yC1f5esy9gB+aqCBsPH5BOck32TYdCuAn2lVG5tvUcFnEsrviGEmRZxE1NHSOieUPYJEg==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.67.4': + resolution: {integrity: sha512-uaqRFdfb8eIa2bVHN/FE3ndCvR0zV2xv0AwjCfxrqSu6l6fp/54VhjfhslKlf2RIik9L1jwlt4E56PeVX6tQtQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.67.4': + resolution: {integrity: sha512-JZRow7kmxUDEASnxHuVG5itTm+nTXi9BQUABcVUnUEngC+OPwMrpx1uJ9hIA/v+IcAEBL52ktCSPXk5OJn9Jqg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.67.4': + resolution: {integrity: sha512-rdrh4e+Lq9fCNKoDPaCqeHXbQCe7yl77Ukl45tlSClwYdZ1gpFGZz1XLJdYtY++FRlfL5aHvb6/0n3GDW/Nxsw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.67.4': + resolution: {integrity: sha512-wL7MS4r0fYcxluF3ne2plofHZiB/LsqNCnyaUlyiKpAJLb6agPSFz7DEFCfkonWAZXMrLwCmC08b2ZEnEdJkog==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.67.4': + resolution: {integrity: sha512-4H0XHfd2VufGjX7NjUyeue78sD0bRIoKSGjGqO+F5nSvL6jN48NAU7esdmtFEYxZXwObLtt3MJ/kHS0jASMW3g==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.67.4': + resolution: {integrity: sha512-osRHQbE55pZpCLetpMsFmhkapyZnAUH73qRKMh+npi3boUom6u6hdaTTPSxlInXxwJHsn9r2uDhdz0V7Yoxx2A==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.67.4': + resolution: {integrity: sha512-95+exYEyOwrZePsE0czi4q7X5lxKPa21+lmyAZlwbYENITQ0Unk4HAQAFp/p+KhXBHBx9mUABXRYjOC5A1wY3Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.67.4': + resolution: {integrity: sha512-FOXOcKhNQpO4Po+Ynan6IbtM67SrXZbgpRJWVYwz53CT5veI7sVzDwVBmWS65N5Imv+wK3SVhIPAl+C5DXXNCg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.67.4': + resolution: {integrity: sha512-cklKh0gJOkAZQcWziQa3hrjxZKN+PCHZ7SPTyGJDAiBVr05ZXlEjGFCG7zFJMaVibxsmzAe1FimN4u/HBns9+Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.67.4': + resolution: {integrity: sha512-AegwxJPc9bvUp8fQtlsUHkFMOMkGylWU7glyL+YD4vwG+QaYoGXYLSsQoeTD7kvoLZrVlMWNVhTg1dedY5C1VQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.67.4': + resolution: {integrity: sha512-RJZnrwTWj7Iq2ooBwoGbDdC65tDwYawneGcAfFMJqVUrRZMcskka6nTkBpXR/47G7kzn3EW2qupExnaBy11vwg==} + cpu: [x64] + os: [win32] + + '@shikijs/core@4.6.0': + resolution: {integrity: sha512-bfd4OKgvoyXYiYmMRuleA656P4V7M/Du9lcTl38Ngm6KszMj7bq4J1IGZwSYR4c95Tv5UQALtYNWUwaI9UT3xw==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.6.0': + resolution: {integrity: sha512-K0oqxFoL+kEMdz89mHLFO15Tsbv3kFZ6WR1cXZKMvLSc+oqaM00A6pyga1qSeXB22dP0tTiSApRcGBaKWsEccg==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.6.0': + resolution: {integrity: sha512-aggd6Q7SuJOXNnsUbfG2XesxBJKBMAw/PDTUo9PyRjMaaJJ2dNrI+q0C+25ARXAK9yLHAlwxc9oRT2u68YKZ7w==} + engines: {node: '>=20'} + + '@shikijs/langs@4.6.0': + resolution: {integrity: sha512-1yMEX3oCVV54LUq/ovfpRkDQoYDkcvjSWFFa/YLUDMiSoRzMi2uxLJYbv41ahT8Lu9lFMaa7hecd3Q39trqUyg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.6.0': + resolution: {integrity: sha512-c54+TQEo9ToqgfL/AU8FpjnV09+GA9Oa7M5ROkkXteZfp5XzpAJGXjjvZQFQioJOwm/w/6Z3lIzQstAkl8coag==} + engines: {node: '>=20'} + + '@shikijs/themes@4.6.0': + resolution: {integrity: sha512-qHAVAs80RiGD+IRuH9G+JPDOEc9A/kHsng4EzCUCwB9bLzW6Z0y9WETh2YyCcADJBmfrIaJ1Jp7KBNP6FHkgtQ==} + engines: {node: '>=20'} + + '@shikijs/types@4.6.0': + resolution: {integrity: sha512-+ENG1adsKt/X7cRYw1Nl7BEpBmPOjmQ7bR/eGmHuMlT8gtOFf3KEi5l31DJYyAWhW6Y6bjP1plU7FmaxWGENFw==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.1.0': + resolution: {integrity: sha512-cVBuhDQjBZaNMTwBquYfPydrUP+E3hE6oYGasx8h6ZrODIM7/r+gxLDXdd66oszbrggZHEntdE6j+5gYIVyMWQ==} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/user-event@14.6.7': + resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@tsconfig/strictest@2.0.8': + resolution: {integrity: sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.10': + resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript/typescript-darwin-arm64@7.1.0-dev.20261001.1': + resolution: {integrity: sha512-LKHKuZcqmrl2bVgAufg3nbajpzoqi8cZzTs4gFi2G9P818TzbVE0WqdttpeeS2kVtLRIgEzSAtz4cIYJVf2Tpw==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.1.0-dev.20261001.1': + resolution: {integrity: sha512-V5mCrDb+rwsd/FaL/9LVa7xi+SrfGdFMXTkKVSAPf7X/6W9IaVhgbI3ls2DJmwAJz+aj61mzWGrbCpscNyQ9lw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-linux-arm64@7.1.0-dev.20261001.1': + resolution: {integrity: sha512-mLp3CyqlvUIAaEBukoO3g2XDKrrp3nhSPhuiBJY0jgL3sNXBnDftT3HKpxwo9Vcob8Nm81STwpZqlaVu2Ac3JA==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] @@ -1107,6 +1679,9 @@ packages: cpu: [x64] os: [win32] + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@vitest/browser-playwright@5.0.3': resolution: {integrity: sha512-rYBHwIFL/ZtI6dl0rbrAatScXCrvX+TL2BX2AGOigkC1Y6u3rIWw8KMQJJMS4drSa1ksMCmZU2wpgwdE7kqu3g==} peerDependencies: @@ -1508,13 +2083,42 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astro@6.4.8: + resolution: {integrity: sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bun@1.4.2: resolution: {integrity: sha512-TrSXo6HJfIEaczpb3kjX82I2pL47vK1QUNmHRCUdz9IzaOwa9lzOXSWwu2l18YHE3sNfGRapVLd4nNm+22vVVA==} cpu: [arm64, x64] @@ -1538,10 +2142,41 @@ packages: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} engines: {node: '>=18.7'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -1550,6 +2185,10 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1557,6 +2196,13 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -1566,6 +2212,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.17: resolution: {integrity: sha512-YG2kyfafNXKmu7e6k64yrj6whrw7m5sBIsOSXOlJ/72X3TQWRQuw8DhvXFDcBk8HF77PnTSygnm7xpYCTnFpow==} peerDependencies: @@ -1574,9 +2223,40 @@ packages: srvx: optional: true + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + db0@0.4.2: resolution: {integrity: sha512-OCBz+HiE8NgfQdlvvNrzdE+4RhmoAV3QnkxOhLU40bQH/N1msRwmPBvVyXmCUDmjhDl1+t4CFcSCccmi5jf+VQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -1588,13 +2268,43 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dts-resolver@3.0.0: resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} engines: {node: ^22.18.0 || >=24.0.0} @@ -1608,6 +2318,14 @@ packages: resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-runner@0.2.3: resolution: {integrity: sha512-S8EFBKyznRwPVwayK187cYjvnpgC92xy+q0BIF++V965pfjMVVRbQ/HoTYGA/1EHmZ7E68k6Heq+4WnvVhOL5w==} hasBin: true @@ -1615,9 +2333,24 @@ packages: es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -1625,6 +2358,18 @@ packages: exsolve@1.2.0: resolution: {integrity: sha512-h1pQPR9XoeSMdntRNCjyTznaume4UpfXrULBnlkZ2CUM/G5eSa+pBByGldO5uR8dxbPC+OuJXsPPNf+JZ81ADg==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1640,15 +2385,36 @@ packages: flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + get-tsconfig@5.0.0-beta.6: resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} engines: {node: '>=20.20.0'} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.8: resolution: {integrity: sha512-ENuKlF9kC6E6PrvY1PUyE0qkrnnPTIt2/v48uyEEfTVfgoiqBCE0uwwf++2XrWwT1gxjQBDLQ8PAsmZVniKvTw==} engines: {node: '>=20.19.0'} @@ -1662,9 +2428,45 @@ packages: ocache: optional: true + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.4: + resolution: {integrity: sha512-Yq7XlXor0Cpb71sI2E0zpv8QxQ5a6rfhDEETk4bcgrFX2SvJAY2PHocWwFtL6U9qyfiyByW3wZ6sZEfP2kW81g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-html@9.0.6: + resolution: {integrity: sha512-1SZUxCN3TtJAE7e2BQN2MBHsoZ1gnmi9GoCP5Di59CSWptIezSAW09yDZyVbanb78V9eCwrKqdQsjtfVTxYHWA==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-text@4.0.3: + resolution: {integrity: sha512-5yrlWOvGFs6CqHriUpSsNrjzT/Tdo+IOQudbznxOn8K5qblp18MJyzOg8IgDOKQ8MYgQcJA7SusuCjSpDr8mSA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.3: + resolution: {integrity: sha512-1ALZXSmCGmW3h8AMz4R4+QKSKFi7sNgXLVwmwB8FYVtl1CwQ3WDkSAEY/d5tp1g/vbQgq2s1WlHgfO3jbw1TsA==} + hookable@6.1.2: resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + httpxy@0.5.6: resolution: {integrity: sha512-iqc3nOxvNb5FxbhJozt8wNmHgjlmk4zzba512jMEXVwHCEBCbGAj49eGfy5PI8ts3/LFSFq8siiSNqwfY1AlfQ==} @@ -1672,12 +2474,45 @@ packages: resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} engines: {node: ^22.18.0 || >=24.0.0} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -1752,47 +2587,230 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.2: resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + markdown-table@3.1.0: + resolution: {integrity: sha512-xpeSCdM+B+6P3ncfgaB7FoDbtJ30xAe6Z18TGT7AgXJsHqCElCICZovQqdRMm7kHgpTyYv36EupqewoFFSB8vw==} - nf3@0.3.24: - resolution: {integrity: sha512-HxLK4bo+5jNsEETZp4w3tJblHOA9MCBY14IN9nZJJV8JDxt9yNIYxuBuLMjTAR5GFa3HL61+8VQDUrXv3/C8fw==} + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - nitro@3.0.260903-beta: - resolution: {integrity: sha512-54gANPi62O8rfMvepiJUVuIzEIinYfpeHbebywlLxvVTgIYXDwSvpaU9Id+0sJOBjBx0wC1/CVYXJkH7SY+l0g==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true + mdast-util-find-and-replace@3.0.4: + resolution: {integrity: sha512-z4B5c6jrnJ1ltOQemhWYPBSAo6y42Z8Gt2yEgfgNTMcLSU59B8bfj8Z8AnAlJrBGLnqkdAUZ7jdDEqQw3KuipQ==} - node-forge@1.4.0: - resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} - engines: {node: '>= 6.13.0'} + mdast-util-from-markdown@2.1.0: + resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} - obug@2.2.1: - resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} - engines: {node: '>=12.20.0'} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - obug@3.0.0: - resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} - engines: {node: '>=12.20.0'} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - ocache@0.3.1: - resolution: {integrity: sha512-qeBrhQ0ly6tgXsakgNwLx6diRUppJZIcV5OjVGa5yp9HzztutkaGDDXJqVMo1fKWz5fNDtTp3iPU2fuhHf0+Lg==} + mdast-util-gfm-strikethrough@2.0.1: + resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==} - oxfmt@0.72.0: - resolution: {integrity: sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g==} + mdast-util-gfm-table@2.0.1: + resolution: {integrity: sha512-fiIjPrAy4kz68/eFbPHhsiWDGHhqUSVoU1XsfLM5DsEPXw7MxgiVVyulUggFRckVWeT1KXQXkg5vm3kv4oMSOA==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.2.2: + resolution: {integrity: sha512-ELNT5jYDUdx0B/hlUSSAiAEtvqkY3Oriwkp1KEYseF1Ccu4MnKkmE5yK3oE3WGT/Pq8VTE+XwP0GLL5pafY8yA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.2: + resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nf3@0.3.24: + resolution: {integrity: sha512-HxLK4bo+5jNsEETZp4w3tJblHOA9MCBY14IN9nZJJV8JDxt9yNIYxuBuLMjTAR5GFa3HL61+8VQDUrXv3/C8fw==} + + nitro@3.0.260903-beta: + resolution: {integrity: sha512-54gANPi62O8rfMvepiJUVuIzEIinYfpeHbebywlLxvVTgIYXDwSvpaU9Id+0sJOBjBx0wC1/CVYXJkH7SY+l0g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + + ocache@0.3.1: + resolution: {integrity: sha512-qeBrhQ0ly6tgXsakgNwLx6diRUppJZIcV5OjVGa5yp9HzztutkaGDDXJqVMo1fKWz5fNDtTp3iPU2fuhHf0+Lg==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + oxfmt@0.72.0: + resolution: {integrity: sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1854,6 +2872,27 @@ packages: vite-plus: optional: true + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} + engines: {node: '>=20'} + + p-queue@9.3.5: + resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==} + engines: {node: '>=20'} + + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} + + package-manager-detector@1.9.0: + resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1861,9 +2900,16 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.7: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} @@ -1900,15 +2946,78 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.3: + resolution: {integrity: sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + rolldown-plugin-dts@0.28.8: resolution: {integrity: sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -1936,6 +3045,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup@4.67.4: + resolution: {integrity: sha512-Lsv3oKcz5jgOQJej/p7nfwbVEdAbDT+z6OPf/SCdI+nF+q2ENp0pTKT35ZwXAmH8g45mfrIiJeEyAqKYSYoL9Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rou3@0.9.2: resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} @@ -1943,6 +3057,19 @@ packages: resolution: {integrity: sha512-ySeaQkSrua+ut9g+65I7FHqOFBaY8tV0FmccXItoq0q21se32Q3u4YiW7/RqXSosWgYJaaKwRHXy3BST9PeCNQ==} engines: {node: '>=20.19.0'} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + semver@7.8.6: + resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1951,14 +3078,28 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@4.6.0: + resolution: {integrity: sha512-imjLsVHgPuWhvpU3P+zOekvMYqnel7QmKsFC4Sn0fCuAvaaalBsxwKEsrU8Ko5BdFnZA6Go/8a0RzahS634UgA==} + engines: {node: '>=20'} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + smol-toml@1.9.1: + resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} + engines: {node: '>= 18'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + srvx@1.0.8: resolution: {integrity: sha512-ngFS/J6St4PJfHRHGjr78xkPPtbyXtdMOLNE4x/XZunEK3OhV7aGUWMHf9WTUEy6wm1U0W4okkd82ZFFWRVQTw==} engines: {node: '>=20.16.0'} @@ -1967,10 +3108,25 @@ packages: std-env@4.3.0: resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + svgo@4.1.0: + resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} + engines: {node: '>=16'} + hasBin: true + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinybench@6.2.0: resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} engines: {node: '>=20.0.0'} + tinyclip@0.1.15: + resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} @@ -1995,6 +3151,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tsdown@0.23.3: resolution: {integrity: sha512-yAju1F5b7GDEPCLl4ewM3g54lq0NyyYpFnK2lh/ax7/uznmsn4wBOS9/49pI3cGvxtj2LoOjBUtzaT17UEQkhQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -2029,6 +3191,9 @@ packages: unrun: optional: true + tslib@2.9.1: + resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==} + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -2039,15 +3204,120 @@ packages: engines: {node: '>=16.20.0'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + engines: {node: '>=22.19.0'} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.5: + resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.1.0: + resolution: {integrity: sha512-vKXxz6O38sKDj1mtx/k2cWvkkFBuYGx6uGrlzBkVeWCRF/F8sdI0j3Wbkz/5rVNRRuVc8UrgRdbCxNhmYXgP3w==} + + unist-util-visit@5.2.0: + resolution: {integrity: sha512-fpsYs/VVoZxfGY9/j3FQpZmN8wdLJaV1Pt38AaJNZu9uKIHcFU3halCdBveEq1HGKO1OEfJY65w1zvoFV1b3qQ==} + + unstorage@1.17.6: + resolution: {integrity: sha512-gjKtcmn/KwZuJZO9o2sc0esAQnhmTw0LviDHwevTXbJMYs0dRTp8ZEEWXHU0vTpzbN3cA0yxlTeyXssMp3zDqw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + unstorage@2.0.0-beta.0: resolution: {integrity: sha512-VeTY+zQ3ozrNtIFBRQRuSwanHdpuRH+4t/ZzchZIVQO8/oKq2xl7fJ9c+z76tWJDW/BEXSEuzpHOxqoAl6B64A==} @@ -2055,6 +3325,15 @@ packages: resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} engines: {node: '>=18.12.0'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-plus@1.1.0: resolution: {integrity: sha512-khkRlY70qqbBV0QmF9QKXSrhxIRYftb1H05AJMowMoq7iouchmAoXYeReZ8pKKMOadqrWVxFa3S9BA2m7w59iA==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -2071,6 +3350,46 @@ packages: playwright: optional: true + vite@7.3.7: + resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@8.3.2: resolution: {integrity: sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2114,6 +3433,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@5.0.3: resolution: {integrity: sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} @@ -2155,6 +3482,13 @@ packages: jsdom: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2177,6 +3511,17 @@ packages: utf-8-validate: optional: true + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + yuku-ast@0.19.0: resolution: {integrity: sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==} engines: {node: '>=14.18.0'} @@ -2191,62 +3536,322 @@ packages: yuku-codegen@0.9.5: resolution: {integrity: sha512-zGUVyDpSK4b6c9B0yyxi2P0wujn1XZTbG9dCb7d6gyAoP63EMgyLzUwPUvwxPG5jgYqhlI7w+S3oCyapqGr4PA==} - yuku-core@0.19.0: - resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} - engines: {node: '>=14.18.0'} + yuku-core@0.19.0: + resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} + engines: {node: '>=14.18.0'} + + yuku-parser@0.19.0: + resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} + engines: {node: '>=14.18.0'} + + yuku-parser@0.9.5: + resolution: {integrity: sha512-IBnAdNVMswWbJcM7woPluOudectJzFjJ1N8jVRxP9Uq4CIv5hZdBIcdmtRbFDYF/Ph2j2gVup4YJ4N9mh0jYFA==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@anthropic-ai/sandbox-runtime@0.0.78': + dependencies: + '@pondwader/socks5-server': 1.0.10 + commander: 12.1.0 + node-forge: 1.4.0 + zod: 3.25.76 + + '@astrojs/compiler@4.0.0': {} + + '@astrojs/internal-helpers@0.10.0': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + js-yaml: 4.3.2 + picomatch: 4.0.7 + retext-smartypants: 6.2.0 + shiki: 4.6.0 + smol-toml: 1.9.1 + unified: 11.0.5 + + '@astrojs/markdown-remark@7.2.0': + dependencies: + '@astrojs/internal-helpers': 0.10.0 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.3 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.3 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.2.0 + unist-util-visit-parents: 6.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/telemetry@3.3.2': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + is-wsl: 3.1.1 + which-pm-runs: 1.1.0 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.29.11': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.12': + dependencies: + '@babel/types': 7.29.11 + + '@babel/runtime@7.29.7': {} + + '@babel/types@7.29.11': + dependencies: + '@babel/helper-string-parser': 7.29.11 + '@babel/helper-validator-identifier': 7.29.7 + + '@blazediff/core@1.10.0': {} + + '@capsizecss/unpack@4.0.1': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.5.1': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.8.1': + dependencies: + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@deno/darwin-arm64@2.9.6': + optional: true + + '@deno/darwin-x64@2.9.6': + optional: true + + '@deno/linux-arm64-glibc@2.9.6': + optional: true + + '@deno/linux-x64-glibc@2.9.6': + optional: true + + '@deno/win32-arm64@2.9.6': + optional: true + + '@deno/win32-x64@2.9.6': + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.9.1 + optional: true + + '@epic-web/invariant@1.0.0': {} + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@fastify/busboy@3.2.2': {} + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true - yuku-parser@0.19.0: - resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} - engines: {node: '>=14.18.0'} + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true - yuku-parser@0.9.5: - resolution: {integrity: sha512-IBnAdNVMswWbJcM7woPluOudectJzFjJ1N8jVRxP9Uq4CIv5hZdBIcdmtRbFDYF/Ph2j2gVup4YJ4N9mh0jYFA==} + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true -snapshots: + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true - '@anthropic-ai/sandbox-runtime@0.0.78': - dependencies: - '@pondwader/socks5-server': 1.0.10 - commander: 12.1.0 - node-forge: 1.4.0 - zod: 3.25.76 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true - '@babel/helper-validator-identifier@7.29.7': {} + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true - '@babel/runtime@7.29.7': {} + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true - '@blazediff/core@1.10.0': {} + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true - '@deno/darwin-arm64@2.9.6': + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@deno/darwin-x64@2.9.6': + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@deno/linux-arm64-glibc@2.9.6': + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@deno/linux-x64-glibc@2.9.6': + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@deno/win32-arm64@2.9.6': + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.11.3 optional: true - '@deno/win32-x64@2.9.6': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@epic-web/invariant@1.0.0': {} + '@img/sharp-win32-ia32@0.34.5': + optional: true - '@fastify/busboy@3.2.2': {} + '@img/sharp-win32-x64@0.34.5': + optional: true '@jridgewell/resolve-uri@3.1.2': {} @@ -2257,6 +3862,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@openai/codex@0.160.0': optionalDependencies: '@openai/codex-darwin-arm64': '@openai/codex@0.160.0-darwin-arm64' @@ -2284,6 +3892,8 @@ snapshots: '@openai/codex@0.160.0-win32-x64': optional: true + '@oslojs/encoding@1.1.0': {} + '@oven/bun-darwin-aarch64@1.4.2': optional: true @@ -2651,6 +4261,132 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@rollup/pluginutils@5.5.1(rollup@4.67.4)': + dependencies: + '@types/estree': 1.0.10 + estree-walker: 2.0.2 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.67.4 + + '@rollup/rollup-android-arm-eabi@4.67.4': + optional: true + + '@rollup/rollup-android-arm64@4.67.4': + optional: true + + '@rollup/rollup-android-x64@4.67.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.67.4': + optional: true + + '@rollup/rollup-darwin-x64@4.67.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.67.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.67.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.67.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.67.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.67.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.67.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.67.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.67.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.67.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.67.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.67.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.67.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.67.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.67.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.67.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.67.4': + optional: true + + '@shikijs/core@4.6.0': + dependencies: + '@shikijs/primitive': 4.6.0 + '@shikijs/types': 4.6.0 + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.6 + + '@shikijs/engine-javascript@4.6.0': + dependencies: + '@shikijs/types': 4.6.0 + '@shikijs/vscode-textmate': 10.1.0 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.6.0': + dependencies: + '@shikijs/types': 4.6.0 + '@shikijs/vscode-textmate': 10.1.0 + + '@shikijs/langs@4.6.0': + dependencies: + '@shikijs/types': 4.6.0 + + '@shikijs/primitive@4.6.0': + dependencies: + '@shikijs/types': 4.6.0 + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.6.0': + dependencies: + '@shikijs/types': 4.6.0 + + '@shikijs/types@4.6.0': + dependencies: + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.1.0': {} + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.7 @@ -2679,14 +4415,34 @@ snapshots: dependencies: '@types/node': 25.0.3 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.9': {} + '@types/estree@1.0.10': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 '@types/node@25.0.3': dependencies: undici-types: 7.16.0 + '@types/unist@3.0.3': {} + '@typescript/typescript-darwin-arm64@7.1.0-dev.20261001.1': optional: true @@ -2708,13 +4464,15 @@ snapshots: '@typescript/typescript-win32-x64@7.1.0-dev.20261001.1': optional: true - '@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3)': + '@ungap/structured-clone@1.4.0': {} + + '@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3)': dependencies: - '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3) - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) playwright: 1.63.0 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) transitivePeerDependencies: - bufferutil - msw @@ -2722,37 +4480,37 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3)': + '@vitest/browser-playwright@5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3)': dependencies: - '@vitest/browser': 5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) - '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)) + '@vitest/browser': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) + '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) playwright: 1.63.0 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-preview@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3)': + '@vitest/browser-preview@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.7(@testing-library/dom@10.4.1) - '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3) - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-preview@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3)': + '@vitest/browser-preview@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.7(@testing-library/dom@10.4.1) - '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) transitivePeerDependencies: - bufferutil - msw @@ -2760,12 +4518,12 @@ snapshots: - vite optional: true - '@vitest/browser-preview@5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3)': + '@vitest/browser-preview@5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.7(@testing-library/dom@10.4.1) - '@vitest/browser': 5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + '@vitest/browser': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) transitivePeerDependencies: - bufferutil - msw @@ -2773,17 +4531,17 @@ snapshots: - vite optional: true - '@vitest/browser@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3)': + '@vitest/browser@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) '@vitest/ui': 5.0.3(vitest@5.0.3) '@vitest/utils': 5.0.3 magic-string: 1.4.2 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) ws: 8.22.0 transitivePeerDependencies: - bufferutil @@ -2791,17 +4549,17 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3)': + '@vitest/browser@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)) '@vitest/ui': 5.0.3(vitest@5.0.3) '@vitest/utils': 5.0.3 magic-string: 1.4.2 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) ws: 8.22.0 transitivePeerDependencies: - bufferutil @@ -2810,17 +4568,17 @@ snapshots: - vite optional: true - '@vitest/browser@5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3)': + '@vitest/browser@5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)) + '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) '@vitest/ui': 5.0.3(vitest@5.0.3) '@vitest/utils': 5.0.3 magic-string: 1.4.2 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) ws: 8.22.0 transitivePeerDependencies: - bufferutil @@ -2828,33 +4586,33 @@ snapshots: - utf-8-validate - vite - '@vitest/mocker@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))': + '@vitest/mocker@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.3 estree-walker: 3.0.3 magic-string: 1.4.2 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)' - '@vitest/mocker@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))': + '@vitest/mocker@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.3 estree-walker: 3.0.3 magic-string: 1.4.2 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)' + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)' optional: true - '@vitest/mocker@5.0.3(vite@8.3.2(@types/node@25.0.3))': + '@vitest/mocker@5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.3 estree-walker: 3.0.3 magic-string: 1.4.2 optionalDependencies: - vite: 8.3.2(@types/node@25.0.3) + vite: 8.3.2(@types/node@25.0.3)(esbuild@0.27.7) '@vitest/pretty-format@5.0.3': dependencies: @@ -2877,7 +4635,7 @@ snapshots: pathe: 2.0.3 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) '@vitest/utils@5.0.3': dependencies: @@ -2885,7 +4643,7 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.2.0 - '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)': + '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)': dependencies: '@oxc-project/runtime': 0.153.0 '@oxc-project/types': 0.153.0 @@ -2903,10 +4661,11 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-musl': 1.1.0 '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.1.0 '@voidzero-dev/vite-plus-win32-x64-msvc': 1.1.0 + esbuild: 0.27.7 fsevents: 2.3.3 typescript: 6.0.3 - '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)': + '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)': dependencies: '@oxc-project/runtime': 0.153.0 '@oxc-project/types': 0.153.0 @@ -2924,6 +4683,7 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-musl': 1.1.0 '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.1.0 '@voidzero-dev/vite-plus-win32-x64-msvc': 1.1.0 + esbuild: 0.27.7 fsevents: 2.3.3 typescript: 7.1.0-dev.20261001.1 optional: true @@ -3068,12 +4828,122 @@ snapshots: ansi-styles@5.2.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + aria-query@5.3.0: dependencies: dequal: 2.0.3 + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + assertion-error@2.0.1: {} + astro@6.4.8(@types/node@25.0.3)(db0@0.4.2)(lightningcss@1.33.0)(rollup@4.67.4): + dependencies: + '@astrojs/compiler': 4.0.0 + '@astrojs/internal-helpers': 0.10.0 + '@astrojs/markdown-remark': 7.2.0 + '@astrojs/telemetry': 3.3.2 + '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.8.1 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.5.1(rollup@4.67.4) + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 1.1.1 + devalue: 5.9.4 + diff: 8.0.4 + dset: 3.1.4 + es-module-lexer: 2.3.2 + esbuild: 0.27.7 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.3.0 + js-yaml: 4.3.2 + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + magicast: 0.5.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + obug: 2.2.1 + p-limit: 7.3.3 + p-queue: 9.3.5 + package-manager-detector: 1.9.0 + piccolore: 0.1.3 + picomatch: 4.0.7 + rehype: 13.0.2 + semver: 7.8.6 + shiki: 4.6.0 + smol-toml: 1.9.1 + svgo: 4.1.0 + tinyclip: 0.1.15 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + ultrahtml: 1.7.0 + unifont: 0.7.5 + unist-util-visit: 5.2.0 + unstorage: 1.17.6(db0@0.4.2) + vfile: 6.0.3 + vite: 7.3.7(@types/node@25.0.3)(lightningcss@1.33.0) + vitefu: 1.1.3(vite@7.3.7(@types/node@25.0.3)(lightningcss@1.33.0)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.6.7 + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + boolbase@1.0.0: {} + bun@1.4.2: optionalDependencies: '@oven/bun-darwin-aarch64': 1.4.2 @@ -3099,16 +4969,42 @@ snapshots: cbor2@1.12.0: {} + ccount@2.0.1: {} + chai@6.2.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + ci-info@4.4.0: {} + + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + commander@12.1.0: {} commander@9.5.0: {} + common-ancestor-path@2.0.0: {} + consola@3.4.2: {} convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} + + cookie@1.1.1: {} + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -3120,12 +5016,48 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + crossws@0.4.17(srvx@1.0.8): optionalDependencies: srvx: 1.0.8 + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@7.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + db0@0.4.2: {} + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + defu@6.1.7: {} deno@2.9.6: @@ -3139,14 +5071,48 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + detect-libc@2.1.2: {} + devalue@5.9.4: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.4: {} + dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + dts-resolver@3.0.0: {} empathic@2.1.0: {} + entities@4.5.0: {} + + entities@6.0.1: {} + env-runner@0.2.3: dependencies: crossws: 0.4.17(srvx@1.0.8) @@ -3156,14 +5122,61 @@ snapshots: es-module-lexer@2.3.2: {} + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.10 + + eventemitter3@5.0.4: {} expect-type@1.4.0: {} exsolve@1.2.0: {} + extend@3.0.2: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -3172,31 +5185,167 @@ snapshots: flatted@3.4.4: {} + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + fsevents@2.3.3: optional: true - get-tsconfig@5.0.0-beta.6: + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + h3@2.0.8(crossws@0.4.17(srvx@1.0.8))(ocache@0.3.1): + dependencies: + rou3: 1.0.0 + srvx: 1.0.8 + optionalDependencies: + crossws: 0.4.17(srvx@1.0.8) + ocache: 0.3.1 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.5 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.4 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.4: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.3 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.4.0 + hast-util-from-parse5: 8.0.4 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.2.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.6: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.3: + dependencies: + '@types/hast': 3.0.5 + + hast-util-whitespace@3.0.0: dependencies: - resolve-pkg-maps: 1.0.0 + '@types/hast': 3.0.5 - h3@2.0.8(crossws@0.4.17(srvx@1.0.8))(ocache@0.3.1): + hastscript@9.0.3: dependencies: - rou3: 1.0.0 - srvx: 1.0.8 - optionalDependencies: - crossws: 0.4.17(srvx@1.0.8) - ocache: 0.3.1 + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 hookable@6.1.2: {} + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.3.0: {} + httpxy@0.5.6: {} import-without-cache@0.4.1: {} + iron-webcrypto@1.2.1: {} + + is-docker@3.0.0: {} + + is-docker@4.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} js-tokens@4.0.0: {} + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsonc-parser@3.3.1: {} + lightningcss-android-arm64@1.33.0: optional: true @@ -3246,16 +5395,361 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + longest-streak@3.1.0: {} + + lru-cache@11.5.3: {} + lz-string@1.5.0: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + magic-string@1.4.2: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + magicast@0.5.5: + dependencies: + '@babel/parser': 7.29.12 + '@babel/types': 7.29.11 + source-map-js: 1.2.1 + + markdown-table@3.1.0: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.2.0 + + mdast-util-find-and-replace@3.0.4: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.1.0 + + mdast-util-from-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.3 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.4 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.2 + mdast-util-to-string: 4.0.0 + unist-util-visit: 5.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.1.0 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.1 + mdast-util-gfm-table: 2.0.1 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.2.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.2.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.2.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.2.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + micromark-core-commonmark@2.0.4: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-table@2.1.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.3 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.2 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-space@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.3 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-edit-map@1.0.0: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.3: {} + + micromark@4.0.3: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + transitivePeerDependencies: + - supports-color + mrmime@2.0.1: {} + ms@2.1.3: {} + nanoid@3.3.18: {} + neotraverse@0.6.18: {} + nf3@0.3.24: {} nitro@3.0.260903-beta: @@ -3274,15 +5768,45 @@ snapshots: unenv: 2.0.0-rc.24 unstorage: 2.0.0-beta.0 + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch-native@1.6.7: {} + node-forge@1.4.0: {} + node-mock-http@1.0.5: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + obug@2.2.1: {} obug@3.0.0: {} ocache@0.3.1: {} - oxfmt@0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3)): + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.12: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + oxfmt@0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3)): dependencies: tinypool: 2.2.0 optionalDependencies: @@ -3305,9 +5829,9 @@ snapshots: '@oxfmt/binding-win32-arm64-msvc': 0.72.0 '@oxfmt/binding-win32-ia32-msvc': 0.72.0 '@oxfmt/binding-win32-x64-msvc': 0.72.0 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3) - oxfmt@0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): + oxfmt@0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): dependencies: tinypool: 2.2.0 optionalDependencies: @@ -3330,10 +5854,10 @@ snapshots: '@oxfmt/binding-win32-arm64-msvc': 0.72.0 '@oxfmt/binding-win32-ia32-msvc': 0.72.0 '@oxfmt/binding-win32-x64-msvc': 0.72.0 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) optional: true - oxfmt@0.73.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): + oxfmt@0.73.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): dependencies: tinypool: 2.2.0 optionalDependencies: @@ -3356,7 +5880,7 @@ snapshots: '@oxfmt/binding-win32-arm64-msvc': 0.73.0 '@oxfmt/binding-win32-ia32-msvc': 0.73.0 '@oxfmt/binding-win32-x64-msvc': 0.73.0 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) oxlint-tsgolint@7.0.2003: optionalDependencies: @@ -3376,7 +5900,7 @@ snapshots: '@oxlint-tsgolint/win32-arm64': 7.0.2005 '@oxlint-tsgolint/win32-x64': 7.0.2005 - oxlint@1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3)): + oxlint@1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3)): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.87.0 '@oxlint/binding-android-arm64': 1.87.0 @@ -3398,9 +5922,9 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.87.0 '@oxlint/binding-win32-x64-msvc': 1.87.0 oxlint-tsgolint: 7.0.2003 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3) - oxlint@1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): + oxlint@1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.87.0 '@oxlint/binding-android-arm64': 1.87.0 @@ -3422,10 +5946,10 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.87.0 '@oxlint/binding-win32-x64-msvc': 1.87.0 oxlint-tsgolint: 7.0.2003 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) optional: true - oxlint@1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): + oxlint@1.91.0(oxlint-tsgolint@7.0.2005)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.91.0 '@oxlint/binding-android-arm64': 1.91.0 @@ -3447,14 +5971,44 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.91.0 '@oxlint/binding-win32-x64-msvc': 1.91.0 oxlint-tsgolint: 7.0.2005 - vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) + vite-plus: 1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1) + + p-limit@7.3.3: + dependencies: + yocto-queue: 1.2.2 + + p-queue@9.3.5: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.2 + + p-timeout@7.0.2: {} + + package-manager-detector@1.9.0: {} + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 path-key@3.1.1: {} pathe@2.0.3: {} + piccolore@0.1.3: {} + picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.7: {} playwright-core@1.63.0: {} @@ -3483,12 +6037,121 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + prismjs@1.30.0: {} + + property-information@7.2.0: {} + quansync@1.0.0: {} + radix3@1.1.2: {} + react-is@17.0.2: {} + readdirp@5.1.1: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.6 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.5 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.1.0 + micromark-util-types: 2.0.3 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.3: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.2.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.2.2 + unified: 11.0.5 + resolve-pkg-maps@1.0.0: {} + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.2.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + rolldown-plugin-dts@0.28.8(rolldown@1.2.15)(typescript@7.1.0-dev.20261001.1): dependencies: dts-resolver: 3.0.0 @@ -3524,30 +6187,135 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.15 '@rolldown/binding-win32-x64-msvc': 1.2.15 + rollup@4.67.4: + dependencies: + '@types/estree': 1.0.10 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.67.4 + '@rollup/rollup-android-arm64': 4.67.4 + '@rollup/rollup-android-x64': 4.67.4 + '@rollup/rollup-darwin-arm64': 4.67.4 + '@rollup/rollup-darwin-x64': 4.67.4 + '@rollup/rollup-freebsd-arm64': 4.67.4 + '@rollup/rollup-freebsd-x64': 4.67.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.67.4 + '@rollup/rollup-linux-arm-musleabihf': 4.67.4 + '@rollup/rollup-linux-arm64-gnu': 4.67.4 + '@rollup/rollup-linux-arm64-musl': 4.67.4 + '@rollup/rollup-linux-loong64-gnu': 4.67.4 + '@rollup/rollup-linux-loong64-musl': 4.67.4 + '@rollup/rollup-linux-ppc64-gnu': 4.67.4 + '@rollup/rollup-linux-ppc64-musl': 4.67.4 + '@rollup/rollup-linux-riscv64-gnu': 4.67.4 + '@rollup/rollup-linux-riscv64-musl': 4.67.4 + '@rollup/rollup-linux-s390x-gnu': 4.67.4 + '@rollup/rollup-linux-x64-gnu': 4.67.4 + '@rollup/rollup-linux-x64-musl': 4.67.4 + '@rollup/rollup-openbsd-x64': 4.67.4 + '@rollup/rollup-openharmony-arm64': 4.67.4 + '@rollup/rollup-win32-arm64-msvc': 4.67.4 + '@rollup/rollup-win32-ia32-msvc': 4.67.4 + '@rollup/rollup-win32-x64-gnu': 4.67.4 + '@rollup/rollup-win32-x64-msvc': 4.67.4 + fsevents: 2.3.3 + rou3@0.9.2: {} rou3@1.0.0: {} + sax@1.6.1: {} + + semver@7.8.6: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.6 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shiki@4.6.0: + dependencies: + '@shikijs/core': 4.6.0 + '@shikijs/engine-javascript': 4.6.0 + '@shikijs/engine-oniguruma': 4.6.0 + '@shikijs/langs': 4.6.0 + '@shikijs/themes': 4.6.0 + '@shikijs/types': 4.6.0 + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 + sisteransi@1.0.5: {} + + smol-toml@1.9.1: {} + source-map-js@1.2.1: {} + space-separated-tokens@2.0.2: {} + srvx@1.0.8: {} std-env@4.3.0: {} + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + svgo@4.1.0: + dependencies: + commander: 11.1.0 + css-select: 6.0.0 + css-tree: 3.2.1 + css-what: 7.0.0 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.1 + + tiny-inflate@1.0.3: {} + tinybench@6.2.0: {} + tinyclip@0.1.15: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: @@ -3563,6 +6331,10 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + tsdown@0.23.3(typescript@7.1.0-dev.20261001.1): dependencies: cac: 7.1.0 @@ -3588,6 +6360,9 @@ snapshots: - oxc-resolver - vue-tsc + tslib@2.9.1: + optional: true + typescript@6.0.3: {} typescript@7.1.0-dev.20261001.1: @@ -3600,39 +6375,128 @@ snapshots: '@typescript/typescript-win32-arm64': 7.1.0-dev.20261001.1 '@typescript/typescript-win32-x64': 7.1.0-dev.20261001.1 + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.1.0 quansync: 1.0.0 + uncrypto@0.1.3: {} + undici-types@7.16.0: {} + undici@8.12.3: {} + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.5: + dependencies: + css-tree: 3.2.1 + ohash: 2.0.12 + undici: 8.12.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.2.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.2.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.1.0 + + unstorage@1.17.6(db0@0.4.2): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.3 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + optionalDependencies: + db0: 0.4.2 + unstorage@2.0.0-beta.0: {} verkit@0.5.0: {} - vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3): + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3): dependencies: '@oxc-project/types': 0.153.0 '@oxlint/plugins': 1.79.0 - '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3) - '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3) - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3) + '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) '@vitest/pretty-format': 5.0.3 '@vitest/snapshot': 5.0.3 '@vitest/spy': 5.0.3 '@vitest/utils': 5.0.3 - oxfmt: 0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3)) - oxlint: 1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(playwright@1.63.0)(typescript@6.0.3)) + oxfmt: 0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3)) + oxlint: 1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/ui@5.0.3(vitest@5.0.3))(esbuild@0.27.7)(playwright@1.63.0)(typescript@6.0.3)) oxlint-tsgolint: 7.0.2003 - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)' - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)' + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) optionalDependencies: - '@vitest/browser-playwright': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3) + '@vitest/browser-playwright': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3) '@voidzero-dev/vite-plus-darwin-arm64': 1.1.0 '@voidzero-dev/vite-plus-darwin-x64': 1.1.0 '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.1.0 @@ -3676,24 +6540,24 @@ snapshots: - vue-tsc - yaml - vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1): + vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1): dependencies: '@oxc-project/types': 0.153.0 '@oxlint/plugins': 1.79.0 - '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) - '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)) + '@vitest/browser': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) + '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1))(vitest@5.0.3) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)) '@vitest/pretty-format': 5.0.3 '@vitest/snapshot': 5.0.3 '@vitest/spy': 5.0.3 '@vitest/utils': 5.0.3 - oxfmt: 0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) - oxlint: 1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) + oxfmt: 0.72.0(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) + oxlint: 1.87.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.1.0(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/ui@5.0.3)(esbuild@0.27.7)(playwright@1.63.0)(typescript@7.1.0-dev.20261001.1)) oxlint-tsgolint: 7.0.2003 - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)' - vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)) + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)' + vitest: 5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)) optionalDependencies: - '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) + '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) '@voidzero-dev/vite-plus-darwin-arm64': 1.1.0 '@voidzero-dev/vite-plus-darwin-x64': 1.1.0 '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.1.0 @@ -3738,7 +6602,20 @@ snapshots: - yaml optional: true - vite@8.3.2(@types/node@25.0.3): + vite@7.3.7(@types/node@25.0.3)(lightningcss@1.33.0): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.28 + rollup: 4.67.4 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + lightningcss: 1.33.0 + + vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -3747,12 +6624,17 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.0.3 + esbuild: 0.27.7 fsevents: 2.3.3 - vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)): + vitefu@1.1.3(vite@7.3.7(@types/node@25.0.3)(lightningcss@1.33.0)): + optionalDependencies: + vite: 7.3.7(@types/node@25.0.3)(lightningcss@1.33.0) + + vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3))(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -3763,20 +6645,20 @@ snapshots: tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3)' why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 25.0.3 - '@vitest/browser-playwright': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3) - '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@6.0.3))(vitest@5.0.3) + '@vitest/browser-playwright': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(playwright@1.63.0)(vitest@5.0.3) + '@vitest/browser-preview': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@6.0.3))(vitest@5.0.3) '@vitest/ui': 5.0.3(vitest@5.0.3) transitivePeerDependencies: - msw - vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)): + vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3(vitest@5.0.3))(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)) + '@vitest/mocker': 5.0.3(@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -3787,21 +6669,21 @@ snapshots: tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(typescript@7.1.0-dev.20261001.1)' + vite: '@voidzero-dev/vite-plus-core@1.1.0(@types/node@25.0.3)(esbuild@0.27.7)(typescript@7.1.0-dev.20261001.1)' why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 25.0.3 - '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) - '@vitest/browser-preview': 5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) + '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) + '@vitest/browser-preview': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) '@vitest/ui': 5.0.3(vitest@5.0.3) transitivePeerDependencies: - msw optional: true - vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)): + vitest@5.0.3(@types/node@25.0.3)(@vitest/browser-playwright@5.0.3)(@vitest/browser-preview@5.0.3)(@vitest/ui@5.0.3)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)) + '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -3812,16 +6694,20 @@ snapshots: tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.2(@types/node@25.0.3) + vite: 8.3.2(@types/node@25.0.3)(esbuild@0.27.7) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 25.0.3 - '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) - '@vitest/browser-preview': 5.0.3(vite@8.3.2(@types/node@25.0.3))(vitest@5.0.3) + '@vitest/browser-playwright': 5.0.3(playwright@1.63.0)(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) + '@vitest/browser-preview': 5.0.3(vite@8.3.2(@types/node@25.0.3)(esbuild@0.27.7))(vitest@5.0.3) '@vitest/ui': 5.0.3(vitest@5.0.3) transitivePeerDependencies: - msw + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -3830,6 +6716,12 @@ snapshots: ws@8.22.0: {} + xxhash-wasm@1.1.0: {} + + yargs-parser@22.0.0: {} + + yocto-queue@1.2.2: {} + yuku-ast@0.19.0: dependencies: '@yuku-toolchain/types': 0.19.0 @@ -3900,3 +6792,7 @@ snapshots: '@yuku-parser/binding-win32-x64': 0.9.5 zod@3.25.76: {} + + zod@4.6.7: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7a27719a8..31f5de12f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,10 @@ allowBuilds: '@playwright/browser-chromium': true bun: true deno: true + # Astro's dependencies. Their prebuilt binaries come as optional dependencies, + # so their build scripts aren't needed. + esbuild: false + sharp: false minimumReleaseAgeExclude: - vite-plus @@ -21,6 +25,7 @@ catalog: '@types/node': 25.0.3 '@playwright/browser-chromium': 1.63.0 '@vitest/browser-playwright': 5.0.3 + astro: 6.4.8 bun: 1.4.2 cbor-edn: 0.2.2 cbor2: 1.12.0 @@ -53,6 +58,9 @@ overrides: # override above routes vite to the Vite+ toolchain fork, which does not carry # the integration — so scope vite-task-tools' `vite` to a real upstream build. vite-task-tools>vite: 8.3.2 + # Astro 6 needs Vite 7, which the global override above would replace with + # the Vite+ fork. + astro>vite: ^7.3.2 peerDependencyRules: allowAny: - vite From 5cdc29efc2334958d6ca042a5d651e57b67cd576 Mon Sep 17 00:00:00 2001 From: wan9chi Date: Fri, 30 Oct 2026 10:24:47 +0900 Subject: [PATCH 2/2] feat(cache): let a hit rebuild empty folders the task made A task that makes a folder and leaves it empty, like `astro build` making `.astro/collections`, pinned the folder holding it as an input: fspy didn't record a mkdir as one (on Windows it was a read), so the empty folder wasn't rebuildable, and the archive held only files, so a hit couldn't recreate it. Removing the folder, as on a clean checkout, was a cache miss. fspy now records the path of a mkdir as a mkdir, a new access kind, before the call, so a failed call, like one finding the folder there already, is recorded too: - Unix preload: `mkdir` and `mkdirat`. - Linux seccomp supervisor, for static binaries: `mkdirat`, plus `mkdir` on x86_64. - Windows: `NtCreateFile` with `FILE_DIRECTORY_FILE` and `FILE_CREATE` or `FILE_OPEN_IF`, where `CreateDirectoryW` ends. These opens were recorded as reads; a mkdir isn't one on Unix either. `Rebuildable` takes the mkdirs that are empty folders after the run (`.DS_Store` aside) as rebuildable folders and climbs from them too, so a folder holding only such folders, rebuildable folders and files the task wrote is rebuildable. Each folder is listed once: a mkdir'd folder above a written path is decided while climbing, where an empty one counts as rebuildable, and only the other mkdirs are checked for being empty. A run without inferred reads skips the climb and checks every mkdir, for the archive. The archive gets directory entries for the empty folders, filtered by output exclusions and `ignoreOutput` like files: all of them with automatic output tracking, and otherwise those an `output` glob matches, since the glob walk yields files only. Restoring recreates them. A folder holding anything needs no entry, since what it holds recreates it. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 1 + crates/fspy/src/unix/syscall_handler/mod.rs | 2 + .../src/unix/syscall_handler/namespace.rs | 23 +- crates/fspy/tests/rust_std.rs | 18 ++ crates/fspy/tests/static_executable.rs | 8 + crates/fspy_e2e/src/main.rs | 1 + .../src/interceptions/namespace.rs | 29 ++- .../src/windows/detours/nt.rs | 25 +- crates/fspy_shared/src/ipc/mod.rs | 9 +- crates/fspy_test_bin/src/main.rs | 3 + crates/vt/docs/task-cache.md | 3 +- crates/vt/src/session/cache/archive.rs | 53 ++++- crates/vt/src/session/execute/cache_update.rs | 103 ++++++--- crates/vt/src/session/execute/fingerprint.rs | 80 ++++++- crates/vt/src/session/execute/rebuildable.rs | 218 +++++++++++++----- .../src/session/execute/tracked_accesses.rs | 8 + .../astro_empty_collections/snapshots.toml | 4 +- .../snapshots/astro_empty_collections.md | 7 +- .../empty_folder_in_output/snapshots.toml | 8 +- .../snapshots/empty_folder_in_output.md | 7 +- .../snapshots/empty_folder_in_output_globs.md | 7 +- 21 files changed, 467 insertions(+), 150 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af67b7935..e30d66312 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Changelog +- **Fixed** A cache hit now restores the empty folders a task made if they're among its outputs, like the `.astro/collections` folder that `astro build` leaves empty: with automatic output tracking that's every such folder, and with `output` globs, the ones they match. A folder holding only such folders and files the task wrote, like `.astro`, may now be missing, as on a fresh clone, and the next run is still a cache hit, which restores it if what it holds is among the task's outputs. Previously a hit left empty folders missing, and removing a folder holding one was a cache miss ([#917](https://github.com/voidzero-dev/vite-task/pull/917)). - **Fixed** A task's automatically tracked outputs now include the files it renames into place, like Vitest's `fsModuleCache` entries written under a temporary name, every file in a folder it renames into place, like Vite's dependency optimizer renaming `deps_temp_*` to `deps`, and the hard links it creates. The next run is a cache hit if they are missing, as on a fresh clone, and the hit restores them if they're among the task's outputs. Previously they weren't restored, and removing one that the task read back was a cache miss ([#916](https://github.com/voidzero-dev/vite-task/pull/916)). - **Changed** When a task lists a folder, the files it wrote there and the folders holding only such files no longer count as entries of the listing: the next run is a cache hit if they are missing, as on a fresh clone, and the hit restores them if they're among the task's outputs. For example, `tsc` with no `include` lists the package root, which holds its `lib` output folder; removing `lib` used to be a cache miss. The folder's other entries still count ([#915](https://github.com/voidzero-dev/vite-task/pull/915)). - **Changed** A task that checks or lists a folder holding only files it wrote, like `tsc` checking its `dist` output folder, is now a cache hit when the folder is missing, as on a fresh clone, and the hit restores the folder if its files are among the task's outputs. Previously the missing folder was a cache miss ([#914](https://github.com/voidzero-dev/vite-task/pull/914)). diff --git a/crates/fspy/src/unix/syscall_handler/mod.rs b/crates/fspy/src/unix/syscall_handler/mod.rs index 0a389380b..a84ccd853 100644 --- a/crates/fspy/src/unix/syscall_handler/mod.rs +++ b/crates/fspy/src/unix/syscall_handler/mod.rs @@ -105,6 +105,8 @@ impl_handler!( faccessat, faccessat2, + #[cfg(target_arch = "x86_64")] mkdir, + mkdirat, #[cfg(target_arch = "x86_64")] rename, renameat, renameat2, diff --git a/crates/fspy/src/unix/syscall_handler/namespace.rs b/crates/fspy/src/unix/syscall_handler/namespace.rs index dd7749aeb..8f8a73715 100644 --- a/crates/fspy/src/unix/syscall_handler/namespace.rs +++ b/crates/fspy/src/unix/syscall_handler/namespace.rs @@ -1,7 +1,9 @@ -//! Syscalls that put an existing file or folder at a new path without opening -//! it: rename and hard link. The new path of a rename is recorded as a rename -//! target, which may be a whole folder, and that of a hard link, always a -//! file, as a write. The source of a rename needs no record. +//! Syscalls that make an entry at a path without opening it: mkdir, and +//! rename and hard link, which put an existing file or folder at a new path. +//! The path of a mkdir is recorded as a mkdir, whether or not the folder is +//! there already; the new path of a rename as a rename target, which may be +//! a whole folder; and that of a hard link, always a file, as a write. The +//! source of a rename needs no record. use std::io; @@ -11,6 +13,19 @@ use fspy_shared::ipc::AccessMode; use super::SyscallHandler; impl SyscallHandler { + #[cfg(target_arch = "x86_64")] + pub(super) fn mkdir(&mut self, caller: Caller, (path,): (CStrPtr,)) -> io::Result<()> { + self.handle_path(caller, Fd::cwd(), path, AccessMode::Mkdir) + } + + pub(super) fn mkdirat( + &mut self, + caller: Caller, + (dir_fd, path): (Fd, CStrPtr), + ) -> io::Result<()> { + self.handle_path(caller, dir_fd, path, AccessMode::Mkdir) + } + #[cfg(target_arch = "x86_64")] pub(super) fn rename( &mut self, diff --git a/crates/fspy/tests/rust_std.rs b/crates/fspy/tests/rust_std.rs index e377588b2..d65ba9afb 100644 --- a/crates/fspy/tests/rust_std.rs +++ b/crates/fspy/tests/rust_std.rs @@ -138,6 +138,24 @@ async fn renamex_np_destination() -> anyhow::Result<()> { Ok(()) } +#[test(tokio::test)] +async fn mkdir() -> anyhow::Result<()> { + let tmp_dir = tempfile::tempdir()?; + fs::create_dir(tmp_dir.path().join("existing"))?; + let tmp_dir_str = tmp_dir.path().to_str().unwrap().to_owned(); + let accesses = track_fn!(tmp_dir_str, |tmp_dir_str: String| { + let tmp_dir = std::path::Path::new(&tmp_dir_str); + fs::create_dir(tmp_dir.join("new")).unwrap(); + // Fails, since the folder is there already; recorded anyway. + fs::create_dir(tmp_dir.join("existing")).unwrap_err(); + }) + .await?; + assert_contains(&accesses, tmp_dir.path().join("new").as_path(), PathAccess::Mkdir); + assert_contains(&accesses, tmp_dir.path().join("existing").as_path(), PathAccess::Mkdir); + + Ok(()) +} + #[test(tokio::test)] async fn metadata() -> anyhow::Result<()> { let tmp_dir = tempfile::tempdir()?; diff --git a/crates/fspy/tests/static_executable.rs b/crates/fspy/tests/static_executable.rs index eeb0f4a7c..ad7bfc8af 100644 --- a/crates/fspy/tests/static_executable.rs +++ b/crates/fspy/tests/static_executable.rs @@ -89,6 +89,14 @@ async fn openat2_readwrite() { assert_contains(&accesses, Path::new("/hello"), fspy::PathAccess::ReadWrite); } +#[test(tokio::test)] +async fn mkdir() { + // The mkdir fails, since `/hello` doesn't exist; the folder is recorded + // anyway. + let accesses = track_test_bin(&["mkdir", "/hello/world"], None).await; + assert_contains(&accesses, Path::new("/hello/world"), fspy::PathAccess::Mkdir); +} + #[test(tokio::test)] async fn rename_destination() { // The rename fails, since `/hello` doesn't exist; the destination is diff --git a/crates/fspy_e2e/src/main.rs b/crates/fspy_e2e/src/main.rs index 83ee21583..893c263bf 100644 --- a/crates/fspy_e2e/src/main.rs +++ b/crates/fspy_e2e/src/main.rs @@ -52,6 +52,7 @@ impl AccessCollector { PathAccess::RenameTarget(path) => { relative(path).map(|path| format!("{path}: RenameTarget")) } + PathAccess::Mkdir(path) => relative(path).map(|path| format!("{path}: Mkdir")), }; self.accesses.extend(line); } diff --git a/crates/fspy_preload_unix/src/interceptions/namespace.rs b/crates/fspy_preload_unix/src/interceptions/namespace.rs index 81ca4a359..c4e1fbf3c 100644 --- a/crates/fspy_preload_unix/src/interceptions/namespace.rs +++ b/crates/fspy_preload_unix/src/interceptions/namespace.rs @@ -1,17 +1,34 @@ -//! Calls that put an existing file or folder at a new path without opening -//! it: rename and hard link. The new path is recorded before the call, so a -//! failed call is recorded too: as a rename target for a rename, which may -//! move a whole folder, and as a write for a hard link, always to a file. The -//! source of a rename needs no record. +//! Calls that make an entry at a path without opening it: mkdir, and rename +//! and hard link, which put an existing file or folder at a new path. The +//! path is recorded before the call, so a failed call is recorded too: as a +//! mkdir for a mkdir, whose folder may be there already; as a rename target +//! for a rename, which may move a whole folder; and as a write for a hard +//! link, always to a file. The source of a rename needs no record. use fspy_shared::ipc::AccessMode; -use libc::{c_char, c_int}; +use libc::{c_char, c_int, mode_t}; use crate::{ client::{convert::PathAt, handle_open}, macros::intercept, }; +intercept!(mkdir: unsafe extern "C" fn(path: *const c_char, mode: mode_t) -> c_int); +unsafe extern "C" fn mkdir(path: *const c_char, mode: mode_t) -> c_int { + // SAFETY: path is a valid C string pointer provided by the caller of the interposed function + unsafe { handle_open(fspy_nostd::CStr::from_ptr(path.cast()), AccessMode::Mkdir) }; + // SAFETY: calling the original libc mkdir() with the same arguments forwarded from the interposed function + unsafe { mkdir::original()(path, mode) } +} + +intercept!(mkdirat: unsafe extern "C" fn(dirfd: c_int, path: *const c_char, mode: mode_t) -> c_int); +unsafe extern "C" fn mkdirat(dirfd: c_int, path: *const c_char, mode: mode_t) -> c_int { + // SAFETY: dirfd is -1 or a valid file descriptor, and path is a valid C string, provided by the caller of the interposed function + unsafe { handle_open(PathAt::borrow_raw(dirfd, path), AccessMode::Mkdir) }; + // SAFETY: calling the original libc mkdirat() with the same arguments forwarded from the interposed function + unsafe { mkdirat::original()(dirfd, path, mode) } +} + intercept!(rename: unsafe extern "C" fn(old: *const c_char, new: *const c_char) -> c_int); unsafe extern "C" fn rename(old: *const c_char, new: *const c_char) -> c_int { // SAFETY: new is a valid C string pointer provided by the caller of the interposed function diff --git a/crates/fspy_preload_windows/src/windows/detours/nt.rs b/crates/fspy_preload_windows/src/windows/detours/nt.rs index 574edae3f..10f10faf6 100644 --- a/crates/fspy_preload_windows/src/windows/detours/nt.rs +++ b/crates/fspy_preload_windows/src/windows/detours/nt.rs @@ -3,10 +3,11 @@ use std::mem::{offset_of, size_of, size_of_val}; use fspy_shared::ipc::{AccessMode, IpcPath, PathAccess}; use ntapi::{ ntioapi::{ - FILE_INFORMATION_CLASS, FILE_RENAME_INFORMATION, FileLinkInformation, - FileLinkInformationEx, FileRenameInformation, FileRenameInformationEx, - NtQueryDirectoryFile, NtQueryFullAttributesFile, NtQueryInformationByName, - PFILE_BASIC_INFORMATION, PFILE_NETWORK_OPEN_INFORMATION, PIO_APC_ROUTINE, PIO_STATUS_BLOCK, + FILE_CREATE, FILE_DIRECTORY_FILE, FILE_INFORMATION_CLASS, FILE_OPEN_IF, + FILE_RENAME_INFORMATION, FileLinkInformation, FileLinkInformationEx, FileRenameInformation, + FileRenameInformationEx, NtQueryDirectoryFile, NtQueryFullAttributesFile, + NtQueryInformationByName, PFILE_BASIC_INFORMATION, PFILE_NETWORK_OPEN_INFORMATION, + PIO_APC_ROUTINE, PIO_STATUS_BLOCK, }, ntpsapi::{ NtCreateUserProcess, PPS_ATTRIBUTE_LIST, PPS_CREATE_INFO, PS_ATTRIBUTE, @@ -161,6 +162,11 @@ unsafe fn read_process_image_attribute<'a>( None } +// An open that may create a directory, from `CreateDirectoryW` (`FILE_CREATE`) +// or a caller making it if it's missing (`FILE_OPEN_IF`), is recorded as a +// mkdir, like `mkdir` on Unix, rather than as the read its +// `FILE_LIST_DIRECTORY` access maps to. Listing the directory is recorded by +// `NtQueryDirectoryFile`. static DETOUR_NT_CREATE_FILE: Detour< unsafe extern "system" fn( file_handle: PHANDLE, @@ -192,8 +198,15 @@ static DETOUR_NT_CREATE_FILE: Detour< ea_buffer: PVOID, ea_length: ULONG, ) -> HFILE { - // SAFETY: intercepting file open to record access before forwarding to real function - unsafe { handle_open(desired_access, object_attributes) }; + if create_options & FILE_DIRECTORY_FILE != 0 + && matches!(create_disposition, FILE_CREATE | FILE_OPEN_IF) + { + // SAFETY: intercepting directory creation to record it before forwarding to real function + unsafe { handle_open(AccessMode::Mkdir, object_attributes) }; + } else { + // SAFETY: intercepting file open to record access before forwarding to real function + unsafe { handle_open(desired_access, object_attributes) }; + } // SAFETY: calling the original NtCreateFile with all original arguments unsafe { diff --git a/crates/fspy_shared/src/ipc/mod.rs b/crates/fspy_shared/src/ipc/mod.rs index 049b89e63..39a8c1ef4 100644 --- a/crates/fspy_shared/src/ipc/mod.rs +++ b/crates/fspy_shared/src/ipc/mod.rs @@ -21,6 +21,7 @@ pub enum AccessMode { ReadWrite, ReadDir, RenameTarget, + Mkdir, } impl AccessMode { @@ -32,6 +33,7 @@ impl AccessMode { Self::ReadWrite => PathAccess::ReadWrite(path), Self::ReadDir => PathAccess::ReadDir(path), Self::RenameTarget => PathAccess::RenameTarget(path), + Self::Mkdir => PathAccess::Mkdir(path), } } } @@ -48,6 +50,9 @@ pub enum PathAccess<'a> { /// The new path of a rename. What is there after the call, a file or a /// whole folder, was put there without being opened. RenameTarget(&'a IpcPath), + /// A folder made by `mkdir`, recorded whether or not the call succeeded, + /// so the folder may have been there already. + Mkdir(&'a IpcPath), } impl<'a> PathAccess<'a> { @@ -58,7 +63,8 @@ impl<'a> PathAccess<'a> { | PathAccess::Write(path) | PathAccess::ReadWrite(path) | PathAccess::ReadDir(path) - | PathAccess::RenameTarget(path) => iter::once(path), + | PathAccess::RenameTarget(path) + | PathAccess::Mkdir(path) => iter::once(path), } } @@ -70,6 +76,7 @@ impl<'a> PathAccess<'a> { PathAccess::ReadWrite(path) => PathAccess::ReadWrite(path.clone_in(bump)), PathAccess::ReadDir(path) => PathAccess::ReadDir(path.clone_in(bump)), PathAccess::RenameTarget(path) => PathAccess::RenameTarget(path.clone_in(bump)), + PathAccess::Mkdir(path) => PathAccess::Mkdir(path.clone_in(bump)), } } } diff --git a/crates/fspy_test_bin/src/main.rs b/crates/fspy_test_bin/src/main.rs index 55c312f76..23b022414 100644 --- a/crates/fspy_test_bin/src/main.rs +++ b/crates/fspy_test_bin/src/main.rs @@ -48,6 +48,9 @@ fn main() { "execve" => { let _ = std::process::Command::new(path).spawn(); } + "mkdir" => { + let _ = std::fs::create_dir(path); + } "rename" => { let _ = std::fs::rename(path, second_path()); } diff --git a/crates/vt/docs/task-cache.md b/crates/vt/docs/task-cache.md index e1963a2b3..e709dd2c0 100644 --- a/crates/vt/docs/task-cache.md +++ b/crates/vt/docs/task-cache.md @@ -197,7 +197,8 @@ Vite Task uses `fspy` to monitor file system access during task execution: │ • Check if file exists │ │ • If file: Hash contents with xxHash3 │ │ • If directory: Record structure │ -│ (skipped if it holds only files the task wrote; a │ +│ (skipped if it's an empty folder the task made, or │ +│ holds only files the task wrote and such folders; a │ │ listing leaves out such files and folders) │ │ • If missing: Mark as NotFound │ │ │ │ diff --git a/crates/vt/src/session/cache/archive.rs b/crates/vt/src/session/cache/archive.rs index c4c0fe6e6..accf96796 100644 --- a/crates/vt/src/session/cache/archive.rs +++ b/crates/vt/src/session/cache/archive.rs @@ -7,13 +7,15 @@ use std::{ use vt_path::{AbsolutePath, RelativePathBuf}; -/// Create a tar.zst archive from workspace-relative output paths. +/// Create a tar.zst archive from workspace-relative output paths and output +/// folder paths. /// /// A regular file is stored with its contents. A symbolic link is stored as a /// link with its target, never followed, so a link to a directory or a -/// dangling link round-trips as the task left it. Paths that no longer exist -/// are silently skipped (the task may delete temporary files during -/// execution). +/// dangling link round-trips as the task left it. A folder is stored without +/// its contents, so that extracting recreates it even when nothing is in it. +/// Paths that no longer exist are silently skipped (the task may delete +/// temporary files during execution). /// /// # Errors /// @@ -21,12 +23,27 @@ use vt_path::{AbsolutePath, RelativePathBuf}; pub fn create_output_archive( workspace_root: &AbsolutePath, output_files: &[RelativePathBuf], + output_folders: &[RelativePathBuf], archive_path: &AbsolutePath, ) -> anyhow::Result<()> { let file = File::create(archive_path.as_path())?; let encoder = zstd::Encoder::new(file, 0)?.auto_finish(); let mut builder = tar::Builder::new(encoder); + for rel_path in output_folders { + let metadata = match std::fs::symlink_metadata(workspace_root.join(rel_path).as_path()) { + Ok(m) => m, + Err(err) if err.kind() == io::ErrorKind::NotFound => continue, + Err(err) => return Err(err.into()), + }; + if metadata.is_dir() { + let mut header = tar::Header::new_gnu(); + header.set_metadata(&metadata); + header.set_cksum(); + builder.append_data(&mut header, rel_path.as_str(), io::empty())?; + } + } + for rel_path in output_files { let abs_path = workspace_root.join(rel_path); // Skip files that no longer exist (task may delete temp files between @@ -56,8 +73,8 @@ pub fn create_output_archive( Ok(()) } -/// Extract a tar.zst archive, restoring files and symbolic links relative to -/// workspace root. +/// Extract a tar.zst archive, restoring files, folders and symbolic links +/// relative to workspace root. /// /// Parent directories are created automatically. Existing files are overwritten. /// @@ -144,7 +161,7 @@ mod tests { let output = RelativePathBuf::new("output.txt").unwrap(); std::fs::write(dir.join(&output).as_path(), "built\n".repeat(1000)).unwrap(); let archive_path = dir.join("output.tar.zst"); - create_output_archive(&dir, &[output], &archive_path).unwrap(); + create_output_archive(&dir, &[output], &[], &archive_path).unwrap(); let archive = std::fs::read(archive_path.as_path()).unwrap(); check_output_archive(archive.as_slice()).unwrap(); @@ -187,7 +204,7 @@ mod tests { let files = ["dist/pkg/index.js", "dist/file.js", "dist/dependency", "dist/dangling"] .map(|path| RelativePathBuf::new(path).unwrap()); let archive_path = dir.join("output.tar.zst"); - create_output_archive(&dir, &files, &archive_path).unwrap(); + create_output_archive(&dir, &files, &[], &archive_path).unwrap(); fs::remove_dir_all(dir.join("dist")).unwrap(); extract_output_archive(&dir, &archive_path).unwrap(); @@ -216,7 +233,7 @@ mod tests { symlink(outside.path().to_str().unwrap(), &dir.join("link"), true); let files = ["link", "link/sentinel.txt"].map(|path| RelativePathBuf::new(path).unwrap()); let archive_path = dir.join("output.tar.zst"); - create_output_archive(&dir, &files, &archive_path).unwrap(); + create_output_archive(&dir, &files, &[], &archive_path).unwrap(); fs::write(&sentinel, "must remain unchanged").unwrap(); let restored = dir.join("restored"); @@ -224,4 +241,22 @@ mod tests { assert!(extract_output_archive(&restored, &archive_path).is_err()); assert_eq!(fs::read_to_string(&sentinel).unwrap(), "must remain unchanged"); } + + #[test] + fn extracting_recreates_empty_folders() { + let tmp = tempfile::TempDir::new().unwrap(); + let source = AbsolutePathBuf::new(tmp.path().join("source")).unwrap(); + let rel = |path: &str| RelativePathBuf::new(path).unwrap(); + std::fs::create_dir_all(source.join("out/empty").as_path()).unwrap(); + std::fs::write(source.join("out/a.txt").as_path(), "a").unwrap(); + let archive_path = AbsolutePathBuf::new(tmp.path().join("output.tar.zst")).unwrap(); + create_output_archive(&source, &[rel("out/a.txt")], &[rel("out/empty")], &archive_path) + .unwrap(); + + let target = AbsolutePathBuf::new(tmp.path().join("target")).unwrap(); + std::fs::create_dir_all(target.as_path()).unwrap(); + extract_output_archive(&target, &archive_path).unwrap(); + assert!(target.join("out/empty").as_path().is_dir()); + assert_eq!(std::fs::read_to_string(target.join("out/a.txt").as_path()).unwrap(), "a"); + } } diff --git a/crates/vt/src/session/execute/cache_update.rs b/crates/vt/src/session/execute/cache_update.rs index 7e2e721a6..46b1294ff 100644 --- a/crates/vt/src/session/execute/cache_update.rs +++ b/crates/vt/src/session/execute/cache_update.rs @@ -5,6 +5,7 @@ use std::{collections::BTreeMap, sync::Arc, time::Duration}; use rustc_hash::FxHashSet; use tokio_util::sync::CancellationToken; +use vt_glob::path::PathGlobSet; use vt_path::{AbsolutePath, RelativePathBuf}; use vt_plan::cache_metadata::{CacheMetadata, EnvValueHash}; use vt_server::Reports; @@ -34,9 +35,13 @@ struct TrackingOutcome { /// exclusions are applied. Empty when `output_config.includes_auto` is /// false. path_writes: FxHashSet, - /// What the task can rebuild, from every write and rename target fspy - /// recorded before output exclusions and `ignoreOutput` paths are applied, - /// with the files under a renamed folder in place of the folder. + /// `rebuildable`'s empty folders after output exclusions are applied, + /// archived as folders: all of them when `output_config.includes_auto`, + /// otherwise those a positive output glob matches. + empty_folders: FxHashSet, + /// What the task can rebuild, from every write, rename target and mkdir + /// fspy recorded before output exclusions and `ignoreOutput` paths are + /// applied, with the files under a renamed folder in place of the folder. rebuildable: Rebuildable, } @@ -196,13 +201,14 @@ pub(super) async fn update_cache( /// /// `path_reads` is gated on `input_config.includes_auto`, filtered by /// user-configured input negatives, and by tool-reported `ignoreInput` paths. -/// `rebuildable` takes every write and rename target unfiltered, since what -/// the task can rebuild doesn't depend on what is archived, and expands -/// renamed folders into the files under them. `path_writes` is its written -/// files filtered by user-configured output negatives and tool-reported -/// `ignoreOutput` paths, which decide what is archived. Accesses in the task -/// cache, the parent of the schema version folder `cache_dir`, are left out of -/// all three. +/// `rebuildable` takes every write, rename target and mkdir unfiltered, since +/// what the task can rebuild doesn't depend on what is archived, and expands +/// renamed folders into the files under them. `path_writes` and +/// `empty_folders` are its written files and empty folders filtered by +/// user-configured output negatives and tool-reported `ignoreOutput` paths, +/// which decide what is archived; `path_writes` is gated on +/// `output_config.includes_auto`. Accesses in the task cache, the parent of +/// the schema version folder `cache_dir`, are left out of all of them. #[cfg_attr( not(fspy), expect(clippy::missing_const_for_fn, reason = "the body is a no-op without fspy") @@ -224,8 +230,12 @@ fn observe_fspy( let cache_root = cache_dir.parent().unwrap_or(cache_dir); path_accesses.map(|raw| { let tracked = TrackedPathAccesses::from_raw(raw, workspace_root, cache_root); - let mut rebuildable = - Rebuildable::new(tracked.path_writes, tracked.rename_targets, workspace_root); + let mut rebuildable = Rebuildable::new( + tracked.path_writes, + tracked.rename_targets, + tracked.mkdirs, + workspace_root, + ); let filtered_path_reads: HashMap = // fspy can be attached for auto-output-only tasks. In that // mode reads must not become inferred inputs. @@ -244,31 +254,37 @@ fn observe_fspy( } else { HashMap::default() }; - let filtered_path_writes: FxHashSet = + let filter_outputs = |paths: &FxHashSet| { + let Some(fspy) = fspy else { + return FxHashSet::default(); + }; + paths + .iter() + .filter(|path| { + !fspy.output_negative_globs.is_match(path.as_str()) + && !is_ignored(path, ignored_output_rels) + }) + .cloned() + .collect() + }; + // Only fingerprints of the paths the task read ask about folders; + // without them, the archive still takes the empty folders the + // task made. + rebuildable = if filtered_path_reads.is_empty() { + rebuildable.with_empty_folders(workspace_root) + } else { + rebuildable.with_folders(workspace_root) + }; + TrackingOutcome { + path_reads: filtered_path_reads, // fspy can also be attached for auto-input-only tasks. In that // mode writes must not become auto outputs. - if metadata.output_config.includes_auto - && let Some(fspy) = fspy - { - rebuildable - .written() - .iter() - .filter(|path| { - !fspy.output_negative_globs.is_match(path.as_str()) - && !is_ignored(path, ignored_output_rels) - }) - .cloned() - .collect() + path_writes: if metadata.output_config.includes_auto { + filter_outputs(rebuildable.written()) } else { FxHashSet::default() - }; - // Only fingerprints of the paths the task read ask about folders. - if !filtered_path_reads.is_empty() { - rebuildable = rebuildable.with_folders(workspace_root); - } - TrackingOutcome { - path_reads: filtered_path_reads, - path_writes: filtered_path_writes, + }, + empty_folders: filter_outputs(rebuildable.empty_folders()), rebuildable, } }) @@ -390,7 +406,12 @@ fn collect_tracked_env_queries(reports: &Reports) -> anyhow::Result, @@ -400,9 +421,18 @@ fn collect_and_archive_outputs( let output_config = &cache_metadata.output_config; let mut output_files: FxHashSet = FxHashSet::default(); + let mut output_folders: Vec = Vec::new(); if let Some(t) = tracking { output_files.extend(t.path_writes.iter().cloned()); + if output_config.includes_auto { + output_folders.extend(t.empty_folders.iter().cloned()); + } else if !output_config.positive_globs.is_empty() && !t.empty_folders.is_empty() { + let positive_globs = PathGlobSet::new(&output_config.positive_globs)?; + output_folders.extend( + t.empty_folders.iter().filter(|dir| positive_globs.is_match(dir.as_str())).cloned(), + ); + } } if !output_config.positive_globs.is_empty() { @@ -414,17 +444,18 @@ fn collect_and_archive_outputs( output_files.extend(glob_paths); } - if output_files.is_empty() { + if output_files.is_empty() && output_folders.is_empty() { return Ok(None); } let mut sorted_files: Vec = output_files.into_iter().collect(); sorted_files.sort(); + output_folders.sort(); let archive_name: Str = vt_str::format!("{}.tar.zst", uuid::Uuid::new_v4()); let archive_path = cache_dir.join(archive_name.as_str()); - archive::create_output_archive(workspace_root, &sorted_files, &archive_path)?; + archive::create_output_archive(workspace_root, &sorted_files, &output_folders, &archive_path)?; Ok(Some(archive_name)) } diff --git a/crates/vt/src/session/execute/fingerprint.rs b/crates/vt/src/session/execute/fingerprint.rs index a1786378a..554288a7d 100644 --- a/crates/vt/src/session/execute/fingerprint.rs +++ b/crates/vt/src/session/execute/fingerprint.rs @@ -128,12 +128,12 @@ impl PostRunFingerprint { /// Negative glob filtering is done upstream (see /// [`super::tracked_accesses::TrackedPathAccesses::from_raw`]). /// Paths already present in `globbed_inputs` are skipped — they are - /// already tracked by the prerun glob fingerprint. Folders holding only - /// what the task can rebuild are skipped too: a hit restores the files in - /// them if they're among the task's outputs. Every other path is - /// fingerprinted as the task left it, including a file the task rewrote, - /// except that a folder listing leaves out the entries the task can - /// rebuild and records their names. + /// already tracked by the prerun glob fingerprint. Empty folders the task + /// made and folders holding only what the task can rebuild are skipped + /// too: a hit restores them if they're among the task's outputs. Every + /// other path is fingerprinted as the task left it, including a file the + /// task rewrote, except that a folder listing leaves out the entries the + /// task can rebuild and records their names. /// /// # Arguments /// * `inferred_path_reads` - Map of paths that were read during execution (from fspy) @@ -742,7 +742,12 @@ mod tests { let create = |written| { PostRunFingerprint::create( &path_reads, - &Rebuildable::new(written, FxHashSet::default(), &workspace_root), + &Rebuildable::new( + written, + FxHashSet::default(), + FxHashSet::default(), + &workspace_root, + ), &workspace_root, &BTreeMap::new(), BTreeMap::new(), @@ -792,6 +797,7 @@ mod tests { &Rebuildable::new( written.into_iter().map(rel).collect(), FxHashSet::default(), + FxHashSet::default(), &workspace_root, ) .with_folders(&workspace_root), @@ -821,6 +827,7 @@ mod tests { let rebuildable = Rebuildable::new( ["out/a.txt", "out/tmp/b.txt"].into_iter().map(rel).collect(), FxHashSet::default(), + FxHashSet::default(), &workspace_root, ) .with_folders(&workspace_root); @@ -828,6 +835,56 @@ mod tests { assert!(!rebuildable.is_rebuildable_folder(&rel("out/tmp"))); } + #[test] + fn empty_folders_the_task_made_are_rebuildable() { + let tmp = tempfile::TempDir::new().unwrap(); + let workspace_root = AbsolutePathBuf::new(tmp.path().to_path_buf()).unwrap(); + let rel = |path: &str| RelativePathBuf::new(path).unwrap(); + for dir in ["out/empty", "out/drained", "mixed/made"] { + std::fs::create_dir_all(workspace_root.join(dir).as_path()).unwrap(); + } + for file in ["out/a.txt", "out/empty/.DS_Store", "mixed/made/notes.txt"] { + std::fs::write(workspace_root.join(file).as_path(), "x").unwrap(); + } + + // `out/tmp` and the file the task wrote in it are gone after the run, + // and so is the file it wrote in `out/drained`. + let new = || { + Rebuildable::new( + ["out/a.txt", "out/tmp/b.txt", "out/drained/c.txt"].into_iter().map(rel).collect(), + FxHashSet::default(), + ["out", "out/empty", "out/tmp", "out/drained", "mixed/made"] + .into_iter() + .map(rel) + .collect(), + &workspace_root, + ) + }; + let empty_folders = FxHashSet::from_iter([rel("out/empty"), rel("out/drained")]); + let rebuildable = new().with_folders(&workspace_root); + assert_eq!(rebuildable.empty_folders(), &empty_folders); + // Without climbing, the archive gets the same empty folders. + assert_eq!(new().with_empty_folders(&workspace_root).empty_folders(), &empty_folders); + + let path_reads = ["out", "out/empty", "mixed", "mixed/made"] + .into_iter() + .map(|dir| (rel(dir), PathRead { read_dir_entries: false })) + .collect(); + let fingerprint = PostRunFingerprint::create( + &path_reads, + &rebuildable, + &workspace_root, + &BTreeMap::new(), + BTreeMap::new(), + BTreeMap::new(), + ) + .unwrap(); + let mut fingerprinted: Vec<&str> = + fingerprint.inferred_inputs.keys().map(|path| path.as_str()).collect(); + fingerprinted.sort_unstable(); + assert_eq!(fingerprinted, ["mixed", "mixed/made"]); + } + #[test] fn files_under_a_renamed_folder_count_as_written() { let tmp = tempfile::TempDir::new().unwrap(); @@ -843,6 +900,7 @@ mod tests { let rebuildable = Rebuildable::new( FxHashSet::default(), FxHashSet::from_iter([rel("deps")]), + FxHashSet::default(), &workspace_root, ) .with_folders(&workspace_root); @@ -877,8 +935,9 @@ mod tests { let rel = |path: &str| RelativePathBuf::new(path).unwrap(); // Vite's dependency optimizer probes a fresh folder name, makes the // folder, writes in it, and renames it into place. fspy records the - // probe as a read, the file as a write, and `.vite/deps` as the rename - // target, but nothing for the folder renamed away. + // probe as a read, the folder as made, the file as a write, and + // `.vite/deps` as the rename target, but nothing for the rename's + // source. let full_path = |path: &str| workspace_root.join(rel(path)); std::fs::create_dir_all(full_path(".vite/deps_temp_1a2b").as_path()).unwrap(); std::fs::write(full_path(".vite/deps_temp_1a2b/package.json").as_path(), "{}").unwrap(); @@ -896,6 +955,7 @@ mod tests { &Rebuildable::new( FxHashSet::from_iter([rel(".vite/deps_temp_1a2b/package.json")]), FxHashSet::from_iter([rel(".vite/deps")]), + FxHashSet::from_iter([rel(".vite/deps_temp_1a2b")]), &workspace_root, ) .with_folders(&workspace_root), @@ -927,6 +987,7 @@ mod tests { let rebuildable = Rebuildable::new( FxHashSet::from_iter([rel("deps")]), FxHashSet::default(), + FxHashSet::default(), &workspace_root, ) .with_folders(&workspace_root); @@ -970,6 +1031,7 @@ mod tests { &Rebuildable::new( written.into_iter().map(rel).collect(), FxHashSet::default(), + FxHashSet::default(), &workspace_root, ) .with_folders(&workspace_root), diff --git a/crates/vt/src/session/execute/rebuildable.rs b/crates/vt/src/session/execute/rebuildable.rs index 436539ea5..217291a50 100644 --- a/crates/vt/src/session/execute/rebuildable.rs +++ b/crates/vt/src/session/execute/rebuildable.rs @@ -6,13 +6,15 @@ //! would write them again, so a later run may find them missing. A file that //! is there must still be as the task left it. //! -//! The same goes for a folder that holds only what the task can rebuild: -//! every file (or symlink) in it is one the task wrote, and every folder in -//! it holds only what the task can rebuild too. It isn't fingerprinted at -//! all. A hit restores its files if they're among the task's outputs, which -//! recreates it; explicit output config can leave them out. Such folders are -//! found after the run by climbing from the written paths through their -//! parent folders inside the workspace, listing each one in the real file +//! The same goes for an empty folder the task made (`.DS_Store` aside), and +//! for a folder that holds only what the task can rebuild: every file (or +//! symlink) in it is one the task wrote, and every folder in it is rebuildable +//! too. None of these is fingerprinted at all. A hit restores the files and +//! the empty folders, which are archived as folders, if they're among the +//! task's outputs, and the files recreate the folders holding them; explicit +//! output config can leave them out. Such folders are found after the run by +//! climbing from the written paths and the empty folders through their parent +//! folders inside the workspace, listing each one once in the real file //! system. A written path or folder that is gone by then plays no part. A //! listing of any other folder leaves out its entries that the task can //! rebuild, which a later run may find missing too. @@ -29,7 +31,10 @@ //! fingerprinted as missing, which a later run must match either way, so this //! only tells it apart from a path the task looked for and didn't find. A //! write record on a path that is a folder, from opening it with write -//! access, is ignored. +//! access, is ignored. A mkdir record counts only for a folder that is empty +//! after the run, whether or not the call made it, since it may have been +//! there already: what any other folder holds decides whether it is +//! rebuildable. use std::{cmp::Reverse, fs, io}; @@ -38,11 +43,16 @@ use vt_path::{AbsolutePath, RelativePath, RelativePathBuf}; use super::fingerprint::PathFingerprint; -/// The paths a task wrote and the folders holding only what it can rebuild, -/// relative to the workspace root. +/// The paths a task wrote, the empty folders it made, and the folders +/// holding only what it can rebuild, relative to the workspace root. #[derive(Debug, Default)] pub struct Rebuildable { written: FxHashSet, + /// The folders the task made, or tried to make, inside the workspace. + mkdirs: FxHashSet, + /// The `mkdirs` that are empty folders. + empty_folders: FxHashSet, + /// The rebuildable folders, `empty_folders` among them. folders: FxHashSet, /// The folders above the written paths. written_in: FxHashSet, @@ -51,11 +61,13 @@ pub struct Rebuildable { impl Rebuildable { /// Takes the `written` paths and the `rename_targets` as written, with the /// files under a renamed folder in place of the folder, by looking under - /// `workspace_root`, which must be done after the run. No folder is - /// rebuildable until [`Self::with_folders`] finds them. + /// `workspace_root`, which must be done after the run, and the `mkdirs`. + /// No folder is rebuildable, and none of the `mkdirs` is an empty folder, + /// until [`Self::with_folders`] or [`Self::with_empty_folders`] finds them. pub fn new( written: FxHashSet, rename_targets: FxHashSet, + mkdirs: FxHashSet, workspace_root: &AbsolutePath, ) -> Self { let written = files_written(written, rename_targets, workspace_root); @@ -71,16 +83,38 @@ impl Rebuildable { dir = parent.parent(); } } - Self { written, folders: FxHashSet::default(), written_in } + Self { + written, + mkdirs, + empty_folders: FxHashSet::default(), + folders: FxHashSet::default(), + written_in, + } } - /// Finds the rebuildable folders above the written paths by listing them - /// under `workspace_root`, which must be done after the run. Only - /// fingerprints of the paths the task read ask about folders, so a run - /// without such reads skips this. + /// Finds the rebuildable folders, the empty folders the task made among + /// them, by listing the folders above the written paths and the folders + /// the task made under `workspace_root`, which must be done after the run. + /// Only fingerprints of the paths the task read ask about folders, so a + /// run without such reads takes [`Self::with_empty_folders`] instead. #[must_use] pub fn with_folders(mut self, workspace_root: &AbsolutePath) -> Self { - self.folders = find_folders(&self.written, workspace_root); + (self.folders, self.empty_folders) = + find_folders(&self.written, &self.mkdirs, workspace_root); + self + } + + /// Finds the empty folders the task made, which the archive takes, by + /// listing the folders it made under `workspace_root`, which must be done + /// after the run, without climbing to the folders above them. + #[must_use] + pub fn with_empty_folders(mut self, workspace_root: &AbsolutePath) -> Self { + self.empty_folders = self + .mkdirs + .iter() + .filter(|dir| is_empty_folder(dir, workspace_root)) + .cloned() + .collect(); self } @@ -90,6 +124,12 @@ impl Rebuildable { &self.written } + /// The empty folders the task made. No written file recreates them, so + /// they're archived as folders. + pub const fn empty_folders(&self) -> &FxHashSet { + &self.empty_folders + } + /// Whether a later run may find `path`, which a read found as /// `fingerprint`, missing: the task wrote it, or it is gone after the run /// and the task wrote in it. A write record on a folder, from opening it @@ -115,7 +155,8 @@ impl Rebuildable { } } - /// Whether `path` is a folder holding only what the task can rebuild. + /// Whether `path` is an empty folder the task made, or a folder holding + /// only what the task can rebuild. pub fn is_rebuildable_folder(&self, path: &RelativePath) -> bool { self.folders.contains(path) } @@ -137,12 +178,12 @@ impl Rebuildable { /// The paths in `written`, the `rename_targets` that aren't folders under /// `workspace_root`, and every file (or symlink) under the rename targets that -/// are, recursively. A symlink to a folder is a file here, as in -/// [`holds_only_rebuildable`]. Entries that can't be read or named are left -/// out. A written path that is a folder, from opening it with write access, -/// stays without a stat: nothing under it counts, folder entries are checked -/// against the rebuildable folders, and the archive skips folders, so only a -/// read of it has to tell (see [`Rebuildable::may_be_missing`]). +/// are, recursively. A symlink to a folder is a file here, as in [`holds`]. +/// Entries that can't be read or named are left out. A written path that is a +/// folder, from opening it with write access, stays without a stat: nothing +/// under it counts, folder entries are checked against the rebuildable +/// folders, and the archive skips folders, so only a read of it has to tell +/// (see [`Rebuildable::may_be_missing`]). fn files_written( mut written: FxHashSet, rename_targets: FxHashSet, @@ -188,43 +229,68 @@ fn add_files_under( } } -/// Finds the folders holding only what the task can rebuild. Each folder above -/// a written path is listed once, deepest first, so a folder's subfolders are -/// decided before it. Climbing stops at the first folder that isn't -/// rebuildable, since no folder above it can be, and at the workspace root. A -/// folder that is gone plays no part: its parent is decided by the entries it -/// holds. +/// Whether `dir` is a folder under `workspace_root` holding nothing but +/// `.DS_Store`, which doesn't count, as in directory listing fingerprints. +fn is_empty_folder(dir: &RelativePath, workspace_root: &AbsolutePath) -> bool { + let path = workspace_root.join(dir); + fs::symlink_metadata(&path).is_ok_and(|meta| meta.is_dir()) + && fs::read_dir(path).is_ok_and(|mut entries| { + entries.all(|entry| entry.is_ok_and(|entry| entry.file_name() == ".DS_Store")) + }) +} + +/// Finds the folders holding only what the task can rebuild, and the empty +/// folders the task made among them. The folders above a written path are +/// candidates, listed once, deepest first, so a folder's subfolders are +/// decided before it; an empty one is rebuildable if the task made it. A +/// folder the task made that isn't a candidate holds no written path, so only +/// being empty makes it rebuildable, and then the folders above it are +/// candidates too. Climbing stops at the first folder that isn't rebuildable, +/// since no folder above it can be, and at the workspace root. A folder that +/// is gone plays no part: its parent is decided by the entries it holds. fn find_folders( written: &FxHashSet, + mkdirs: &FxHashSet, workspace_root: &AbsolutePath, -) -> FxHashSet { +) -> (FxHashSet, FxHashSet) { let mut candidates = FxHashSet::default(); for path in written { - let mut dir = path.parent(); - // A folder already reached from another path has its parents too. - while let Some(parent) = dir - && !parent.as_str().is_empty() - && candidates.insert(parent) - { - dir = parent.parent(); + add_parents(path, &mut candidates); + } + let mut empty_folders = FxHashSet::default(); + let mut made: Vec<&RelativePath> = mkdirs + .iter() + .map(RelativePathBuf::as_relative_path) + .filter(|dir| !candidates.contains(dir)) + .collect(); + sort_deepest_first(&mut made); + for dir in made { + // A folder holding an empty folder found here is a candidate by now. + if !candidates.contains(dir) && is_empty_folder(dir, workspace_root) { + add_parents(dir, &mut candidates); + empty_folders.insert(dir.to_relative_path_buf()); } } let mut candidates: Vec<&RelativePath> = candidates.into_iter().collect(); - candidates.sort_unstable_by_key(|dir| Reverse(dir.as_str().matches('/').count())); + sort_deepest_first(&mut candidates); - let mut folders = FxHashSet::default(); + let mut folders = empty_folders.clone(); let mut above_unrebuildable = FxHashSet::default(); for dir in candidates { - let rebuildable = if above_unrebuildable.contains(dir) { - Some(false) + let contents = if above_unrebuildable.contains(dir) { + Some(Holds::Other) } else { - holds_only_rebuildable(dir, workspace_root, written, &folders) + holds(dir, workspace_root, written, &folders) }; - match rebuildable { - Some(true) => { + match contents { + Some(Holds::OnlyRebuildable) => { + folders.insert(dir.to_relative_path_buf()); + } + Some(Holds::Nothing) if mkdirs.contains(dir) => { folders.insert(dir.to_relative_path_buf()); + empty_folders.insert(dir.to_relative_path_buf()); } - Some(false) => { + Some(Holds::Nothing | Holds::Other) => { if let Some(parent) = dir.parent() { above_unrebuildable.insert(parent); } @@ -232,20 +298,46 @@ fn find_folders( None => {} } } - folders + (folders, empty_folders) +} + +/// Adds the folders above `path` inside the workspace to `candidates`, up to +/// one that is there already and has its parents there too. +fn add_parents<'a>(path: &'a RelativePath, candidates: &mut FxHashSet<&'a RelativePath>) { + let mut dir = path.parent(); + while let Some(parent) = dir + && !parent.as_str().is_empty() + && candidates.insert(parent) + { + dir = parent.parent(); + } +} + +/// Sorts `dirs` so that each comes before the folders above it. +fn sort_deepest_first(dirs: &mut [&RelativePath]) { + dirs.sort_unstable_by_key(|dir| Reverse(dir.as_str().matches('/').count())); +} + +/// What a folder holds, `.DS_Store` aside, which doesn't count, as in +/// directory listing fingerprints. +enum Holds { + Nothing, + /// At least one entry, each a file (or symlink) the task wrote or a + /// rebuildable folder. + OnlyRebuildable, + /// Anything else, or entries that can't be read or named. + Other, } -/// Whether `dir` holds at least one entry, and every entry is a file (or -/// symlink) in `written` or a folder in `folders`, or `None` when `dir` isn't -/// a folder anymore. `.DS_Store` doesn't count, as in directory listing -/// fingerprints. An empty folder isn't rebuildable: there's no written file to -/// recreate it. -fn holds_only_rebuildable( +/// What `dir` holds, with `written` and `folders` deciding which entries are +/// rebuildable, or `None` when `dir` isn't a folder anymore. An empty folder +/// is rebuildable only if the task made it, so a hit recreates it. +fn holds( dir: &RelativePath, workspace_root: &AbsolutePath, written: &FxHashSet, folders: &FxHashSet, -) -> Option { +) -> Option { let entries = match fs::read_dir(workspace_root.join(dir)) { Ok(entries) => entries, // Gone, or not a folder anymore: it plays no part. @@ -254,29 +346,29 @@ fn holds_only_rebuildable( { return None; } - Err(_) => return Some(false), + Err(_) => return Some(Holds::Other), }; - let mut is_empty = true; + let mut holds = Holds::Nothing; for entry in entries { let Ok(entry) = entry else { - return Some(false); + return Some(Holds::Other); }; let name = entry.file_name(); if name == ".DS_Store" { continue; } let (Some(name), Ok(file_type)) = (name.to_str(), entry.file_type()) else { - return Some(false); + return Some(Holds::Other); }; let Ok(name) = RelativePathBuf::new(name) else { - return Some(false); + return Some(Holds::Other); }; if !is_rebuildable(&dir.join(name), file_type.is_dir(), written, folders) { - return Some(false); + return Some(Holds::Other); } - is_empty = false; + holds = Holds::OnlyRebuildable; } - Some(!is_empty) + Some(holds) } /// Whether the entry at `path` is rebuildable: a folder in `folders`, or a diff --git a/crates/vt/src/session/execute/tracked_accesses.rs b/crates/vt/src/session/execute/tracked_accesses.rs index 0138aaa3a..392aef09d 100644 --- a/crates/vt/src/session/execute/tracked_accesses.rs +++ b/crates/vt/src/session/execute/tracked_accesses.rs @@ -23,6 +23,9 @@ pub struct TrackedPathAccesses { /// Tracked rename targets: the new paths of renamed files and folders pub rename_targets: FxHashSet, + + /// Tracked mkdirs: the folders the task made, or tried to make + pub mkdirs: FxHashSet, } impl TrackedPathAccesses { @@ -77,6 +80,11 @@ impl TrackedPathAccesses { accesses.rename_targets.insert(path); } } + PathAccess::Mkdir(path) => { + if let Some(path) = relative_path(path) { + accesses.mkdirs.insert(path); + } + } } } accesses diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml index aa488bf69..4233167fa 100644 --- a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots.toml @@ -19,11 +19,11 @@ steps = [ "node_modules/.vite/deps", "node_modules/.astro", ], comment = "remove Astro's outputs and caches, as on a clean checkout (vp's own cache is in `node_modules/.vite/task-cache`)" }, - { argv = [ + [ "vt", "run", "build", - ], comment = "several inputs are missing and vt names whichever it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + ], [ "vtt", "stat-file", diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md index ff085705f..5c6186e56 100644 --- a/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/astro_empty_collections/snapshots/astro_empty_collections.md @@ -17,10 +17,11 @@ remove Astro's outputs and caches, as on a clean checkout (vp's own cache is in ## `vt run build` -several inputs are missing and vt names whichever it finds first, so the miss reason is redacted - ``` -$ ASTRO_TELEMETRY_DISABLED=1 astro build --silent ○ cache miss: , executing +$ ASTRO_TELEMETRY_DISABLED=1 astro build --silent ◉ cache hit, replaying + +--- +vt run: cache hit. ``` ## `vtt stat-file .astro/collections` diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml index 0ea1c883c..fc2057070 100644 --- a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots.toml @@ -15,11 +15,11 @@ steps = [ "-r", "out", ], comment = "remove the output folder, as on a clean checkout" }, - { argv = [ + [ "vt", "run", "build", - ], comment = "on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + ], [ "vtt", "stat-file", @@ -44,11 +44,11 @@ steps = [ "-r", "out", ], comment = "remove the output folder, as on a clean checkout" }, - { argv = [ + [ "vt", "run", "build-globs", - ], comment = "on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted", redact = { 'cache miss: .*, executing' = 'cache miss: , executing' } }, + ], [ "vtt", "stat-file", diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md index 908de502c..57b714b0d 100644 --- a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output.md @@ -17,10 +17,11 @@ remove the output folder, as on a clean checkout ## `vt run build` -on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted - ``` -$ vtt fs mkdir out/empty write out/a.txt hi stat out ○ cache miss: , executing +$ vtt fs mkdir out/empty write out/a.txt hi stat out ◉ cache hit, replaying + +--- +vt run: cache hit. ``` ## `vtt stat-file out/empty` diff --git a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md index 4bceac052..64bc7642e 100644 --- a/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md +++ b/crates/vt_bin/tests/e2e_snapshots/fixtures/empty_folder_in_output/snapshots/empty_folder_in_output_globs.md @@ -17,10 +17,11 @@ remove the output folder, as on a clean checkout ## `vt run build-globs` -on Windows, where a mkdir is recorded as a read, `out/empty` is an input too, and vt names whichever removed input it finds first, so the miss reason is redacted - ``` -$ vtt fs mkdir out/empty write out/a.txt hi stat out ○ cache miss: , executing +$ vtt fs mkdir out/empty write out/a.txt hi stat out ◉ cache hit, replaying + +--- +vt run: cache hit. ``` ## `vtt stat-file out/empty`