From 5b7f56eb8099fa7dadbec4f946ab8d8a96e385e5 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 21:25:52 -0400 Subject: [PATCH 01/10] Switch to serving plugin bytes directly --- .github/workflows/ci.yml | 19 +- .gitignore | 2 + README.md | 7 +- deno.json | 8 - deno.lock | 29 - dprint.json | 12 +- env.d.ts | 8 + handleRequest.test.ts | 227 ++- handleRequest.ts | 29 +- home.tsx | 6 +- main.ts | 10 +- output.txt | 1462 ++++++++++++++++ package-lock.json | 2756 ++++++++++++++++++++++++++++++ package.json | 20 + plugins.test.ts | 34 +- plugins.ts | 2 +- readInfoFile.ts | 18 +- style.css | 11 +- tsconfig.json | 18 + utils/LazyExpirableValue.test.ts | 30 +- utils/LruCache.test.ts | 66 +- utils/RateLimiter.test.ts | 26 +- utils/RateLimiter.ts | 4 +- utils/asyncLazy.test.ts | 16 +- utils/fetchCached.test.ts | 77 +- utils/fetchCached.ts | 31 +- utils/github.test.ts | 16 +- utils/github.ts | 22 +- utils/mod.ts | 8 +- utils/synchronizedActioner.ts | 2 +- utils/version.test.ts | 20 +- vitest.config.ts | 11 + wrangler.toml | 8 + 33 files changed, 4638 insertions(+), 377 deletions(-) create mode 100644 .gitignore delete mode 100644 deno.json delete mode 100644 deno.lock create mode 100644 env.d.ts create mode 100644 output.txt create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tsconfig.json create mode 100644 vitest.config.ts create mode 100644 wrangler.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8311655..0a6d489 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,20 +6,17 @@ jobs: runs-on: ubuntu-latest permissions: - id-token: write contents: read steps: - uses: actions/checkout@v4 - - uses: denoland/setup-deno@v2 - with: - deno-version: v2.x + - name: Install dependencies + run: npm install - name: Run tests + run: npx vitest run + - name: Deploy to Cloudflare Workers + if: github.ref == 'refs/heads/main' + run: npx wrangler deploy env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: deno test --allow-env --allow-read=. --allow-net=api.github.com,0.0.0.0,localhost - - name: Deploy to Deno Deploy - uses: denoland/deployctl@v1 - with: - project: dprint-plugins - entrypoint: main.ts + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4cdbd31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.claude +node_modules diff --git a/README.md b/README.md index 0c63939..3157d85 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ Website for [https://plugins.dprint.dev](https://plugins.dprint.dev). -This website is hosted on [Deno Deploy](https://deno.com/deploy). +This website is hosted on Cloudflare. I really dislike how that makes the code, but Cloudflare has free bandwidth, which is important for this project. ## Redirect to Any GitHub Repo (For Plugin Authors) -This service provides a convenient redirect for a plugin stored in any GitHub repo. +This service provides a convenient URL for a plugin stored in any GitHub repo. To use it, create a GitHub release in your repo with: @@ -31,5 +31,6 @@ If your repo name is in the format `dprint-plugin-` then you can omit ## Run Locally ```bash -deno run --allow-read=. --allow-net --allow-env --no-check main.ts +npm install +npm run dev ``` diff --git a/deno.json b/deno.json deleted file mode 100644 index 94e489e..0000000 --- a/deno.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "imports": { - "@std/assert": "jsr:@std/assert@^1.0.12", - "preact": "https://esm.sh/preact@10.15.1?pin=v135", - "preact/": "https://esm.sh/preact@10.15.1&pin=v135/", - "preact-render-to-string": "https://esm.sh/*preact-render-to-string@6.1.0?pin=v135" - } -} diff --git a/deno.lock b/deno.lock deleted file mode 100644 index 0c9387f..0000000 --- a/deno.lock +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "4", - "specifiers": { - "jsr:@std/assert@^1.0.12": "1.0.12", - "jsr:@std/internal@^1.0.6": "1.0.6" - }, - "jsr": { - "@std/assert@1.0.12": { - "integrity": "08009f0926dda9cbd8bef3a35d3b6a4b964b0ab5c3e140a4e0351fbf34af5b9a", - "dependencies": [ - "jsr:@std/internal" - ] - }, - "@std/internal@1.0.6": { - "integrity": "9533b128f230f73bd209408bb07a4b12f8d4255ab2a4d22a1fd6d87304aca9a4" - } - }, - "remote": { - "https://esm.sh/*preact-render-to-string@6.1.0?pin=v135": "ce1c6902880f66372096778d76a4afcb1e7f10a7349939c146d5e33aee5962dd", - "https://esm.sh/preact@10.15.1?pin=v135": "796ac5b6d7b4c71b1eba2e60dee47d3a7c639d99b546b35902af6405e845cf5a", - "https://esm.sh/stable/preact@10.15.1/denonext/preact.mjs": "30710ac1d5ff3711ae0c04eddbeb706f34f82d97489f61aaf09897bc75d2a628", - "https://esm.sh/v135/preact-render-to-string@6.1.0/X-ZS8q/denonext/preact-render-to-string.mjs": "8ce71d44f2a197f8fafa24c8d1ac19e0d7fac5a171efae6154f8d754e1ae0ae4" - }, - "workspace": { - "dependencies": [ - "jsr:@std/assert@^1.0.12" - ] - } -} diff --git a/dprint.json b/dprint.json index 281ae36..d4628ba 100644 --- a/dprint.json +++ b/dprint.json @@ -7,11 +7,11 @@ "**/*-lock.json" ], "plugins": [ - "https://plugins.dprint.dev/typescript-0.88.7.wasm", - "https://plugins.dprint.dev/json-0.19.1.wasm", - "https://plugins.dprint.dev/markdown-0.16.3.wasm", - "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.3.0.wasm", - "https://plugins.dprint.dev/g-plane/malva-v0.5.1.wasm", - "https://plugins.dprint.dev/g-plane/markup_fmt-v0.10.0.wasm" + "https://plugins.dprint.dev/typescript-0.95.15.wasm", + "https://plugins.dprint.dev/json-0.21.3.wasm", + "https://plugins.dprint.dev/markdown-0.21.1.wasm", + "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.6.0.wasm", + "https://plugins.dprint.dev/g-plane/malva-v0.15.2.wasm", + "https://plugins.dprint.dev/g-plane/markup_fmt-v0.27.0.wasm" ] } diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..eaaac69 --- /dev/null +++ b/env.d.ts @@ -0,0 +1,8 @@ +declare module "*.css" { + const content: string; + export default content; +} + +interface Env { + DPRINT_PLUGINS_GH_TOKEN?: string; +} diff --git a/handleRequest.test.ts b/handleRequest.test.ts index 63ece30..88eb5af 100644 --- a/handleRequest.test.ts +++ b/handleRequest.test.ts @@ -1,371 +1,412 @@ -import { assertEquals } from "@std/assert"; -import { createRequestHandler } from "./handleRequest.ts"; -import { RealClock } from "./utils/clock.ts"; - -const connInfo: Deno.ServeHandlerInfo = { - remoteAddr: { - transport: "tcp", - hostname: "127.0.0.1", - port: 80, - }, - completed: Promise.resolve(), -}; - -Deno.test("should get info.json", async () => { +import { expect, it } from "vitest"; +import { createRequestHandler } from "./handleRequest.js"; +import { RealClock } from "./utils/clock.js"; + +it("should get info.json", async () => { const { handleRequest } = createRequestHandler(new RealClock()); const response = await handleRequest( new Request("https://plugins.dprint.dev/info.json"), - connInfo, ); - assertEquals(response.headers.get("content-type"), "application/json; charset=utf-8"); - const data = await response.json(); + expect(response.headers.get("content-type")).toEqual("application/json; charset=utf-8"); + const data: any = await response.json(); for (const pluginData of data.latest) { - assertEquals(typeof pluginData.name, "string"); - assertEquals(typeof pluginData.version, "string"); - assertEquals(typeof pluginData.url, "string"); + expect(typeof pluginData.name).toEqual("string"); + expect(typeof pluginData.version).toEqual("string"); + expect(typeof pluginData.url).toEqual("string"); } }); -Deno.test("should get cli.json", async () => { +it("should get cli.json", async () => { const { handleRequest } = createRequestHandler(new RealClock()); const response = await handleRequest( new Request("https://plugins.dprint.dev/cli.json"), - connInfo, ); - assertEquals(response.headers.get("content-type"), "application/json; charset=utf-8"); - const data = await response.json(); - assertEquals(typeof data.version, "string"); + expect(response.headers.get("content-type")).toEqual("application/json; charset=utf-8"); + const data: any = await response.json(); + expect(typeof data.version).toEqual("string"); }); async function getRedirectUrl(url: string) { const { handleRequest } = createRequestHandler(new RealClock()); const response = await handleRequest( new Request(url), - connInfo, ); - assertEquals(response.status, 302); + expect(response.status).toEqual(302); return response.headers.get("location")!; } -Deno.test("should get correct info for typescript resolver", async () => { +it("should get correct info for typescript resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/typescript-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.19.4"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.19.4/typescript-0.19.4.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.44.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.44.0/typescript-0.44.0.wasm", ); // file name changed here - assertEquals( + expect( await getWasmRedirectUrl("0.44.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.44.1/typescript.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/typescript-0.52.1.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.52.1/schema.json", ); // file name changed after this - assertEquals( + expect( await getWasmRedirectUrl("0.62.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.62.1/typescript.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.62.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.62.2/plugin.wasm", ); }); -Deno.test("should get correct info for json resolver", async () => { +it("should get correct info for json resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/json-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.4.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.4.0/json-0.4.0.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.10.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.10.1/json-0.10.1.wasm", ); // file name changed here - assertEquals( + expect( await getWasmRedirectUrl("0.10.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.10.2/json.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/json-0.13.1.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.13.1/schema.json", ); // file name changed after this - assertEquals( + expect( await getWasmRedirectUrl("0.14.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.14.0/json.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.14.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.14.1/plugin.wasm", ); }); -Deno.test("should get correct info for markdown resolver", async () => { +it("should get correct info for markdown resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/markdown-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.1.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.1.0/markdown-0.1.0.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.7.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.7.0/markdown-0.7.0.wasm", ); // file name changed here - assertEquals( + expect( await getWasmRedirectUrl("0.7.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.7.1/markdown.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/markdown-0.10.0.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.10.0/schema.json", ); // file name changed after this - assertEquals( + expect( await getWasmRedirectUrl("0.12.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.12.1/markdown.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.12.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.12.2/plugin.wasm", ); }); -Deno.test("should get correct info for toml resolver", async () => { +it("should get correct info for toml resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/toml-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.1.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.1.2/toml.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/toml-0.5.0.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.0/schema.json", ); // file name changed after this - assertEquals( + expect( await getWasmRedirectUrl("0.5.3"), + ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.3/toml.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.5.4"), + ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.4/plugin.wasm", ); }); -Deno.test("should get correct info for dockerfile resolver", async () => { +it("should get correct info for dockerfile resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/dockerfile-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.1.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.1.0/dockerfile.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/dockerfile-0.1.0.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.1.0/schema.json", ); // file name changed after this - assertEquals( + expect( await getWasmRedirectUrl("0.2.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.2.1/dockerfile.wasm", ); - assertEquals( + expect( await getWasmRedirectUrl("0.2.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.2.2/plugin.wasm", ); }); -Deno.test("should get correct info for sql resolver", async () => { +it("should get correct info for sql resolver", async () => { function getWasmRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/sql-${version}.wasm`); } - assertEquals( + expect( await getWasmRedirectUrl("0.1.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.1/sql.wasm", ); - assertEquals( + expect( await getRedirectUrl(`https://plugins.dprint.dev/schemas/sql-0.1.1.json`), + ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.1/schema.json", ); // file name changed here - assertEquals( + expect( await getWasmRedirectUrl("0.1.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.2/plugin.wasm", ); }); -Deno.test("should get correct info for prettier resolver", async () => { +it("should get correct info for prettier resolver", async () => { function getProcessPluginRedirectUrl(version: string, ext = "json") { return getRedirectUrl(`https://plugins.dprint.dev/prettier-${version}.${ext}`); } // file name changed after this - assertEquals( + expect( await getProcessPluginRedirectUrl("0.5.0", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.5.0/prettier.exe-plugin", ); - assertEquals( + expect( await getProcessPluginRedirectUrl("0.5.1", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.5.1/plugin.exe-plugin", ); // and changed again here - assertEquals( + expect( await getProcessPluginRedirectUrl("0.6.2", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.6.2/plugin.exe-plugin", ); - assertEquals( + expect( await getProcessPluginRedirectUrl("0.7.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.7.0/plugin.json", ); }); -Deno.test("should get correct info for roslyn resolver", async () => { +it("should get correct info for roslyn resolver", async () => { function getProcessPluginRedirectUrl(version: string, ext = "json") { return getRedirectUrl(`https://plugins.dprint.dev/roslyn-${version}.${ext}`); } // file name changed after this - assertEquals( + expect( await getProcessPluginRedirectUrl("0.4.0", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.4.0/roslyn.exe-plugin", ); - assertEquals( + expect( await getProcessPluginRedirectUrl("0.5.0", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.5.0/plugin.exe-plugin", ); // and again here - assertEquals( + expect( await getProcessPluginRedirectUrl("0.6.4"), + ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.6.4/plugin.json", ); }); -Deno.test("should get correct info for rustfmt resolver", async () => { +it("should get correct info for rustfmt resolver", async () => { function getProcessPluginRedirectUrl(version: string, ext = "json") { return getRedirectUrl(`https://plugins.dprint.dev/rustfmt-${version}.${ext}`); } // file name changed after this - assertEquals( + expect( await getProcessPluginRedirectUrl("0.4.0", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.4.0/rustfmt.exe-plugin", ); - assertEquals( + expect( await getProcessPluginRedirectUrl("0.5.1", "exe-plugin"), + ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.5.1/plugin.exe-plugin", ); // and again here - assertEquals( + expect( await getProcessPluginRedirectUrl("0.6.2"), + ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.6.2/plugin.json", ); }); -Deno.test("should get correct info for yapf resolver", async () => { +it("should get correct info for yapf resolver", async () => { function getProcessPluginRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/yapf-${version}.exe-plugin`); } // file name changed after this - assertEquals( + expect( await getProcessPluginRedirectUrl("0.2.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-yapf/releases/download/0.2.0/yapf.exe-plugin", ); - assertEquals( + expect( await getProcessPluginRedirectUrl("0.2.1"), + ).toEqual( "https://github.com/dprint/dprint-plugin-yapf/releases/download/0.2.1/plugin.exe-plugin", ); }); -Deno.test("should get correct info for exec resolver", async () => { +it("should get correct info for exec resolver", async () => { function getProcessPluginRedirectUrl(version: string) { return getRedirectUrl(`https://plugins.dprint.dev/exec-${version}.exe-plugin`); } - assertEquals( + expect( await getProcessPluginRedirectUrl("0.1.0"), + ).toEqual( "https://github.com/dprint/dprint-plugin-exec/releases/download/0.1.0/plugin.exe-plugin", ); }); -Deno.test("tryResolvePluginUrl", async () => { - assertEquals( +it("tryResolvePluginUrl", async () => { + expect( await getRedirectUrl("https://plugins.dprint.dev/typescript-1.2.3.wasm"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/typescript-1.2.3.wasm"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-1.2.3.wasm"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-latest.wasm"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/latest/download/plugin.wasm", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-exec-0.3.0.json"), + ).toEqual( "https://github.com/dprint/dprint-plugin-exec/releases/download/0.3.0/plugin.json", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools-0.1.0.wasm"), + ).toEqual( "https://github.com/lucacasonato/mf2-tools/releases/download/0.1.0/dprint-plugin-mf2.wasm", ); }); // todo: mock github api for these tests -Deno.test("tryResolveSchemaUrl", async () => { - assertEquals( +it("tryResolveSchemaUrl", async () => { + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/typescript/1.2.3/schema.json"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/schema.json", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/1.2.3/schema.json"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/schema.json", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/latest/schema.json"), + ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/latest/download/schema.json", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/dprint/non-existent/1.2.3/schema.json"), + ).toEqual( "https://github.com/dprint/non-existent/releases/download/1.2.3/schema.json", ); - assertEquals( + expect( await getRedirectUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools/0.1.0/schema.json"), + ).toEqual( "https://github.com/lucacasonato/mf2-tools/releases/download/0.1.0/dprint-plugin-mf2.schema.json", ); }); diff --git a/handleRequest.ts b/handleRequest.ts index 4b19dfe..ae9b6c9 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -1,9 +1,10 @@ -import { renderHome } from "./home.tsx"; +import { renderHome } from "./home.jsx"; import oldMappings from "./old_redirects.json" with { type: "json" }; -import { tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.ts"; -import { readInfoFile } from "./readInfoFile.ts"; -import { Clock } from "./utils/clock.ts"; -import { createFetchCacher, getCliInfo } from "./utils/mod.ts"; +import { tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.js"; +import { readInfoFile } from "./readInfoFile.js"; +import styleCSS from "./style.css"; +import { Clock } from "./utils/clock.js"; +import { createFetchCacher, getCliInfo } from "./utils/mod.js"; const contentTypes = { css: "text/css; charset=utf-8", @@ -16,7 +17,7 @@ const contentTypes = { export function createRequestHandler(clock: Clock) { const { fetchCached } = createFetchCacher(clock); return { - async handleRequest(request: Request, info: Deno.ServeHandlerInfo) { + async handleRequest(request: Request) { const url = new URL(request.url); const newUrl = await resolvePluginOrSchemaUrl(url); if (newUrl != null) { @@ -29,7 +30,7 @@ export function createRequestHandler(clock: Clock) { request, url: newUrl, contentType, - hostname: info.remoteAddr.hostname, + hostname: request.headers.get("CF-Connecting-IP") ?? "unknown", }); } @@ -61,14 +62,12 @@ export function createRequestHandler(clock: Clock) { } if (url.pathname === "/style.css") { - return Deno.readTextFile("./style.css").then((text) => - new Response(text, { - headers: { - "content-type": "text/css; charset=utf-8", - }, - status: 200, - }) - ); + return new Response(styleCSS, { + headers: { + "content-type": contentTypes.css, + }, + status: 200, + }); } if (url.pathname === "/") { diff --git a/home.tsx b/home.tsx index 9134273..35d3f9a 100644 --- a/home.tsx +++ b/home.tsx @@ -1,7 +1,5 @@ -/** @jsx h */ -import { h } from "preact"; import { renderToString } from "preact-render-to-string"; -import { PluginData, PluginsData, readInfoFile } from "./readInfoFile.ts"; +import { PluginData, PluginsData, readInfoFile } from "./readInfoFile.js"; export async function renderHome() { const content = await renderContent(); @@ -85,7 +83,7 @@ function renderPlugin(plugin: PluginData) {
{plugin.url}
{plugin.downloadCount.allVersions?.toLocaleString("en-US")}
-
diff --git a/main.ts b/main.ts index 3b5b02f..6e4bf3f 100644 --- a/main.ts +++ b/main.ts @@ -1,6 +1,10 @@ -import { createRequestHandler } from "./handleRequest.ts"; -import { RealClock } from "./utils/clock.ts"; +import { createRequestHandler } from "./handleRequest.js"; +import { RealClock } from "./utils/clock.js"; const { handleRequest } = createRequestHandler(new RealClock()); -Deno.serve((request, info) => handleRequest(request, info)); +export default { + fetch(request: Request) { + return handleRequest(request); + }, +}; diff --git a/output.txt b/output.txt new file mode 100644 index 0000000..9b42bcf --- /dev/null +++ b/output.txt @@ -0,0 +1,1462 @@ +error: The lockfile is out of date. Run `deno install --frozen=false`, or rerun with `--frozen=false` to update it. +changes: + 4 | - "npm:@cloudflare/vitest-pool-workers@0.5": "0.5.41_@vitest+runner@2.1.9_@vitest+snapshot@2.1.9_vitest@2.1.9_@cloudflare+workers-types@4.20260226.1", + 4 | + "npm:@cloudflare/vitest-pool-workers@~0.13.4": "0.13.4_@vitest+runner@4.1.1_@vitest+snapshot@4.1.1_vitest@4.1.1__vite@8.0.2___esbuild@0.27.3__esbuild@0.27.3_@cloudflare+workers-types@4.20260317.1_vite@8.0.2__esbuild@0.27.3", + 5 | - "npm:@cloudflare/workers-types@^4.20241205.0": "4.20260226.1", + 5 | + "npm:@cloudflare/workers-types@^4.20260317.1": "4.20260317.1", + 6 | - "npm:preact-render-to-string@^6.1.0": "6.6.5_preact@10.28.3", + 6 | + "npm:preact-render-to-string@^6.6.6": "6.6.6_preact@10.29.0", + 7 | - "npm:preact@^10.15.1": "10.28.3", + 7 | + "npm:preact@^10.29.0": "10.29.0", + 8 | - "npm:vitest@2.1": "2.1.9", + 8 | + "npm:vitest@~4.1.1": "4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3", + 9 | - "npm:wrangler@^3.90.0": "3.100.0_@cloudflare+workers-types@4.20260226.1" + 9 | + "npm:wrangler@^4.77.0": "4.77.0_@cloudflare+workers-types@4.20260317.1" + | ... + 12 | - "@cloudflare/kv-asset-handler@0.3.4": { + 12 | + "@cloudflare/kv-asset-handler@0.4.2": { + 13 | - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", + 13 | + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==" + 14 | + }, + 15 | + "@cloudflare/unenv-preset@2.16.0_unenv@2.0.0-rc.24_workerd@1.20260317.1": { + 16 | + "integrity": "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==", + | ... + 15 | - "mime" + 18 | + "unenv", + 19 | + "workerd" + 20 | + ], + 21 | + "optionalPeers": [ + 22 | + "workerd" + | ... + 18 | - "@cloudflare/vitest-pool-workers@0.5.41_@vitest+runner@2.1.9_@vitest+snapshot@2.1.9_vitest@2.1.9_@cloudflare+workers-types@4.20260226.1": { + 25 | + "@cloudflare/vitest-pool-workers@0.13.4_@vitest+runner@4.1.1_@vitest+snapshot@4.1.1_vitest@4.1.1__vite@8.0.2___esbuild@0.27.3__esbuild@0.27.3_@cloudflare+workers-types@4.20260317.1_vite@8.0.2__esbuild@0.27.3": { + 19 | - "integrity": "sha512-J0uYmOKJgyo/az5nV8QHlR6xQ+HHB6S65tOEutkvUPbuPDbFlBPRT+XHJhSTNNvZGeM1t2qZIzxp0WGmXLtNlQ==", + 26 | + "integrity": "sha512-0LWc3d14+8yiQsb6Io8HqWmHcNTPUAbxuvt5KbeL3ZPY70xvvaFJdxMYuHPYVbVVvV2oakoyc3pRitJLZRmEVQ==", + | ... + 23 | - "birpc", + | ... + 25 | - "devalue", + 31 | + "esbuild", + 26 | - "esbuild@0.17.19", + | ... + 28 | - "semver", + | ... + 34 | - "@cloudflare/workerd-darwin-64@1.20241230.0": { + 38 | + "@cloudflare/workerd-darwin-64@1.20260317.1": { + 35 | - "integrity": "sha512-BZHLg4bbhNQoaY1Uan81O3FV/zcmWueC55juhnaI7NAobiQth9RppadPNpxNAmS9fK2mR5z8xrwMQSQrHmztyQ==", + 39 | + "integrity": "sha512-8hjh3sPMwY8M/zedq3/sXoA2Q4BedlGufn3KOOleIG+5a4ReQKLlUah140D7J6zlKmYZAFMJ4tWC7hCuI/s79g==", + | ... + 39 | - "@cloudflare/workerd-darwin-arm64@1.20241230.0": { + 43 | + "@cloudflare/workerd-darwin-arm64@1.20260317.1": { + 40 | - "integrity": "sha512-lllxycj7EzYoJ0VOJh8M3palUgoonVrILnzGrgsworgWlIpgjfXGS7b41tEGCw6AxSxL9prmTIGtfSPUvn/rjg==", + 44 | + "integrity": "sha512-M/MnNyvO5HMgoIdr3QHjdCj2T1ki9gt0vIUnxYxBu9ISXS/jgtMl6chUVPJ7zHYBn9MyYr8ByeN6frjYxj0MGg==", + | ... + 44 | - "@cloudflare/workerd-linux-64@1.20241230.0": { + 48 | + "@cloudflare/workerd-linux-64@1.20260317.1": { + 45 | - "integrity": "sha512-Y3mHcW0KghOmWdNZyHYpEOG4Ba/ga8tht5vj1a+WXfagEjMO8Y98XhZUlCaYa9yB7Wh5jVcK5LM2jlO/BLgqpA==", + 49 | + "integrity": "sha512-1ltuEjkRcS3fsVF7CxsKlWiRmzq2ZqMfqDN0qUOgbUwkpXsLVJsXmoblaLf5OP00ELlcgF0QsN0p2xPEua4Uug==", + | ... + 49 | - "@cloudflare/workerd-linux-arm64@1.20241230.0": { + 53 | + "@cloudflare/workerd-linux-arm64@1.20260317.1": { + 50 | - "integrity": "sha512-IAjhsWPlHzhhkJ6I49sDG6XfMnhPvv0szKGXxTWQK/IWMrbGdHm4RSfNKBSoLQm67jGMIzbmcrX9UIkms27Y1g==", + 54 | + "integrity": "sha512-3QrNnPF1xlaNwkHpasvRvAMidOvQs2NhXQmALJrEfpIJ/IDL2la8g499yXp3eqhG3hVMCB07XVY149GTs42Xtw==", + | ... + 54 | - "@cloudflare/workerd-windows-64@1.20241230.0": { + 58 | + "@cloudflare/workerd-windows-64@1.20260317.1": { + 55 | - "integrity": "sha512-y5SPIk9iOb2gz+yWtHxoeMnjPnkYQswiCJ480oHC6zexnJLlKTpcmBCjDH1nWCT4pQi8F25gaH8thgElf4NvXQ==", + 59 | + "integrity": "sha512-MfZTz+7LfuIpMGTa3RLXHX8Z/pnycZLItn94WRdHr8LPVet+C5/1Nzei399w/jr3+kzT4pDKk26JF/tlI5elpQ==", + | ... + 59 | - "@cloudflare/workers-types@4.20260226.1": { + 63 | + "@cloudflare/workers-types@4.20260317.1": { + 60 | - "integrity": "sha512-ci/3wgHBLs7QYemyPCJa8ooQd0f9mL9V8cXknZj5f9joX1Iuf6+isDbfjphn0o/bDHpt88vxabC9mXeIYvBVDw==" + 64 | + "integrity": "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==" + | ... + 68 | - "@esbuild-plugins/node-globals-polyfill@0.2.3_esbuild@0.17.19": { + 72 | + "@emnapi/core@1.9.1": { + 69 | - "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + 73 | + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + | ... + 71 | - "esbuild@0.17.19" + 75 | + "@emnapi/wasi-threads", + 76 | + "tslib" + | ... + 74 | - "@esbuild-plugins/node-modules-polyfill@0.2.2_esbuild@0.17.19": { + 79 | + "@emnapi/runtime@1.9.1": { + 75 | - "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + 80 | + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + | ... + 77 | - "esbuild@0.17.19", + 82 | + "tslib" + 78 | - "escape-string-regexp", + 79 | - "rollup-plugin-node-polyfills" + | ... + 82 | - "@esbuild/aix-ppc64@0.21.5": { + 85 | + "@emnapi/wasi-threads@1.2.0": { + 83 | - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + 86 | + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + 87 | + "dependencies": [ + 88 | + "tslib" + 89 | + ] + 90 | + }, + 91 | + "@esbuild/aix-ppc64@0.27.3": { + 92 | + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + | ... + 87 | - "@esbuild/android-arm64@0.17.19": { + 96 | + "@esbuild/android-arm64@0.27.3": { + 88 | - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + 97 | + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + | ... + 92 | - "@esbuild/android-arm64@0.21.5": { + 101 | + "@esbuild/android-arm@0.27.3": { + 93 | - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + 102 | + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + 94 | - "os": ["android"], + 95 | - "cpu": ["arm64"] + 96 | - }, + 97 | - "@esbuild/android-arm@0.17.19": { + 98 | - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + | ... + 102 | - "@esbuild/android-arm@0.21.5": { + 106 | + "@esbuild/android-x64@0.27.3": { + 103 | - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + 107 | + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + 104 | - "os": ["android"], + 105 | - "cpu": ["arm"] + 106 | - }, + 107 | - "@esbuild/android-x64@0.17.19": { + 108 | - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + | ... + 112 | - "@esbuild/android-x64@0.21.5": { + 111 | + "@esbuild/darwin-arm64@0.27.3": { + 113 | - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + 112 | + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + 114 | - "os": ["android"], + 115 | - "cpu": ["x64"] + 116 | - }, + 117 | - "@esbuild/darwin-arm64@0.17.19": { + 118 | - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + | ... + 122 | - "@esbuild/darwin-arm64@0.21.5": { + 116 | + "@esbuild/darwin-x64@0.27.3": { + 123 | - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + 117 | + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + 124 | - "os": ["darwin"], + 125 | - "cpu": ["arm64"] + 126 | - }, + 127 | - "@esbuild/darwin-x64@0.17.19": { + 128 | - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + | ... + 132 | - "@esbuild/darwin-x64@0.21.5": { + 121 | + "@esbuild/freebsd-arm64@0.27.3": { + 133 | - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + 122 | + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + 134 | - "os": ["darwin"], + 135 | - "cpu": ["x64"] + 136 | - }, + 137 | - "@esbuild/freebsd-arm64@0.17.19": { + 138 | - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + | ... + 142 | - "@esbuild/freebsd-arm64@0.21.5": { + 126 | + "@esbuild/freebsd-x64@0.27.3": { + 143 | - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + 127 | + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + 144 | - "os": ["freebsd"], + 145 | - "cpu": ["arm64"] + 146 | - }, + 147 | - "@esbuild/freebsd-x64@0.17.19": { + 148 | - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + | ... + 152 | - "@esbuild/freebsd-x64@0.21.5": { + 131 | + "@esbuild/linux-arm64@0.27.3": { + 153 | - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + 132 | + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + 154 | - "os": ["freebsd"], + 155 | - "cpu": ["x64"] + 156 | - }, + 157 | - "@esbuild/linux-arm64@0.17.19": { + 158 | - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + | ... + 162 | - "@esbuild/linux-arm64@0.21.5": { + 136 | + "@esbuild/linux-arm@0.27.3": { + 163 | - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + 137 | + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + 164 | - "os": ["linux"], + 165 | - "cpu": ["arm64"] + 166 | - }, + 167 | - "@esbuild/linux-arm@0.17.19": { + 168 | - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + | ... + 172 | - "@esbuild/linux-arm@0.21.5": { + 141 | + "@esbuild/linux-ia32@0.27.3": { + 173 | - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + 142 | + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + 174 | - "os": ["linux"], + 175 | - "cpu": ["arm"] + 176 | - }, + 177 | - "@esbuild/linux-ia32@0.17.19": { + 178 | - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + | ... + 182 | - "@esbuild/linux-ia32@0.21.5": { + 146 | + "@esbuild/linux-loong64@0.27.3": { + 183 | - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + 147 | + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + 184 | - "os": ["linux"], + 185 | - "cpu": ["ia32"] + 186 | - }, + 187 | - "@esbuild/linux-loong64@0.17.19": { + 188 | - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + | ... + 192 | - "@esbuild/linux-loong64@0.21.5": { + 151 | + "@esbuild/linux-mips64el@0.27.3": { + 193 | - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + 152 | + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + 194 | - "os": ["linux"], + 195 | - "cpu": ["loong64"] + 196 | - }, + 197 | - "@esbuild/linux-mips64el@0.17.19": { + 198 | - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + | ... + 202 | - "@esbuild/linux-mips64el@0.21.5": { + 156 | + "@esbuild/linux-ppc64@0.27.3": { + 203 | - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + 157 | + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + 204 | - "os": ["linux"], + 205 | - "cpu": ["mips64el"] + 206 | - }, + 207 | - "@esbuild/linux-ppc64@0.17.19": { + 208 | - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + | ... + 212 | - "@esbuild/linux-ppc64@0.21.5": { + 161 | + "@esbuild/linux-riscv64@0.27.3": { + 213 | - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + 162 | + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + 163 | + "os": ["linux"], + 164 | + "cpu": ["riscv64"] + 165 | + }, + 166 | + "@esbuild/linux-s390x@0.27.3": { + 167 | + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + 168 | + "os": ["linux"], + 169 | + "cpu": ["s390x"] + 170 | + }, + 171 | + "@esbuild/linux-x64@0.27.3": { + 172 | + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + 173 | + "os": ["linux"], + 174 | + "cpu": ["x64"] + 175 | + }, + 176 | + "@esbuild/netbsd-arm64@0.27.3": { + 177 | + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + 178 | + "os": ["netbsd"], + 179 | + "cpu": ["arm64"] + 180 | + }, + 181 | + "@esbuild/netbsd-x64@0.27.3": { + 182 | + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + 183 | + "os": ["netbsd"], + 184 | + "cpu": ["x64"] + 185 | + }, + 186 | + "@esbuild/openbsd-arm64@0.27.3": { + 187 | + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + 188 | + "os": ["openbsd"], + 189 | + "cpu": ["arm64"] + 190 | + }, + 191 | + "@esbuild/openbsd-x64@0.27.3": { + 192 | + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + 193 | + "os": ["openbsd"], + 194 | + "cpu": ["x64"] + 195 | + }, + 196 | + "@esbuild/openharmony-arm64@0.27.3": { + 197 | + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + 198 | + "os": ["openharmony"], + 199 | + "cpu": ["arm64"] + 200 | + }, + 201 | + "@esbuild/sunos-x64@0.27.3": { + 202 | + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + 203 | + "os": ["sunos"], + 204 | + "cpu": ["x64"] + 205 | + }, + 206 | + "@esbuild/win32-arm64@0.27.3": { + 207 | + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + 208 | + "os": ["win32"], + 209 | + "cpu": ["arm64"] + 210 | + }, + 211 | + "@esbuild/win32-ia32@0.27.3": { + 212 | + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + 213 | + "os": ["win32"], + 214 | + "cpu": ["ia32"] + 215 | + }, + 216 | + "@esbuild/win32-x64@0.27.3": { + 217 | + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + 218 | + "os": ["win32"], + 219 | + "cpu": ["x64"] + 220 | + }, + 221 | + "@img/colour@1.1.0": { + 222 | + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==" + 223 | + }, + 224 | + "@img/sharp-darwin-arm64@0.34.5": { + 225 | + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + 226 | + "optionalDependencies": [ + 227 | + "@img/sharp-libvips-darwin-arm64" + 228 | + ], + 229 | + "os": ["darwin"], + 230 | + "cpu": ["arm64"] + 231 | + }, + 232 | + "@img/sharp-darwin-x64@0.34.5": { + 233 | + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + 234 | + "optionalDependencies": [ + 235 | + "@img/sharp-libvips-darwin-x64" + 236 | + ], + 237 | + "os": ["darwin"], + 238 | + "cpu": ["x64"] + 239 | + }, + 240 | + "@img/sharp-libvips-darwin-arm64@1.2.4": { + 241 | + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + 242 | + "os": ["darwin"], + 243 | + "cpu": ["arm64"] + 244 | + }, + 245 | + "@img/sharp-libvips-darwin-x64@1.2.4": { + 246 | + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + 247 | + "os": ["darwin"], + 248 | + "cpu": ["x64"] + 249 | + }, + 250 | + "@img/sharp-libvips-linux-arm64@1.2.4": { + 251 | + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + 252 | + "os": ["linux"], + 253 | + "cpu": ["arm64"] + 254 | + }, + 255 | + "@img/sharp-libvips-linux-arm@1.2.4": { + 256 | + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + 257 | + "os": ["linux"], + 258 | + "cpu": ["arm"] + 259 | + }, + 260 | + "@img/sharp-libvips-linux-ppc64@1.2.4": { + 261 | + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + | ... + 217 | - "@esbuild/linux-riscv64@0.17.19": { + 265 | + "@img/sharp-libvips-linux-riscv64@1.2.4": { + 218 | - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + 266 | + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + | ... + 222 | - "@esbuild/linux-riscv64@0.21.5": { + 270 | + "@img/sharp-libvips-linux-s390x@1.2.4": { + 223 | - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + 271 | + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + 272 | + "os": ["linux"], + 273 | + "cpu": ["s390x"] + 274 | + }, + 275 | + "@img/sharp-libvips-linux-x64@1.2.4": { + 276 | + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + 277 | + "os": ["linux"], + 278 | + "cpu": ["x64"] + 279 | + }, + 280 | + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": { + 281 | + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + 282 | + "os": ["linux"], + 283 | + "cpu": ["arm64"] + 284 | + }, + 285 | + "@img/sharp-libvips-linuxmusl-x64@1.2.4": { + 286 | + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + 287 | + "os": ["linux"], + 288 | + "cpu": ["x64"] + 289 | + }, + 290 | + "@img/sharp-linux-arm64@0.34.5": { + 291 | + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + 292 | + "optionalDependencies": [ + 293 | + "@img/sharp-libvips-linux-arm64" + 294 | + ], + 295 | + "os": ["linux"], + 296 | + "cpu": ["arm64"] + 297 | + }, + 298 | + "@img/sharp-linux-arm@0.34.5": { + 299 | + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + 300 | + "optionalDependencies": [ + 301 | + "@img/sharp-libvips-linux-arm" + 302 | + ], + 303 | + "os": ["linux"], + 304 | + "cpu": ["arm"] + 305 | + }, + 306 | + "@img/sharp-linux-ppc64@0.34.5": { + 307 | + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + 308 | + "optionalDependencies": [ + 309 | + "@img/sharp-libvips-linux-ppc64" + 310 | + ], + 311 | + "os": ["linux"], + 312 | + "cpu": ["ppc64"] + 313 | + }, + 314 | + "@img/sharp-linux-riscv64@0.34.5": { + 315 | + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + 316 | + "optionalDependencies": [ + 317 | + "@img/sharp-libvips-linux-riscv64" + 318 | + ], + | ... + 227 | - "@esbuild/linux-s390x@0.17.19": { + 322 | + "@img/sharp-linux-s390x@0.34.5": { + 228 | - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + 323 | + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + 324 | + "optionalDependencies": [ + 325 | + "@img/sharp-libvips-linux-s390x" + 326 | + ], + | ... + 232 | - "@esbuild/linux-s390x@0.21.5": { + 330 | + "@img/sharp-linux-x64@0.34.5": { + 233 | - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + 331 | + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + 234 | - "os": ["linux"], + 332 | + "optionalDependencies": [ + 235 | - "cpu": ["s390x"] + 333 | + "@img/sharp-libvips-linux-x64" + 236 | - }, + 334 | + ], + 237 | - "@esbuild/linux-x64@0.17.19": { + 238 | - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + | ... + 242 | - "@esbuild/linux-x64@0.21.5": { + 338 | + "@img/sharp-linuxmusl-arm64@0.34.5": { + 243 | - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + 339 | + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + 340 | + "optionalDependencies": [ + 341 | + "@img/sharp-libvips-linuxmusl-arm64" + 342 | + ], + 343 | + "os": ["linux"], + 344 | + "cpu": ["arm64"] + 345 | + }, + 346 | + "@img/sharp-linuxmusl-x64@0.34.5": { + 347 | + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + 348 | + "optionalDependencies": [ + 349 | + "@img/sharp-libvips-linuxmusl-x64" + 350 | + ], + | ... + 247 | - "@esbuild/netbsd-x64@0.17.19": { + 354 | + "@img/sharp-wasm32@0.34.5": { + 248 | - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + 355 | + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + 249 | - "os": ["netbsd"], + 356 | + "dependencies": [ + 250 | - "cpu": ["x64"] + 357 | + "@emnapi/runtime" + 358 | + ], + 359 | + "cpu": ["wasm32"] + | ... + 252 | - "@esbuild/netbsd-x64@0.21.5": { + 361 | + "@img/sharp-win32-arm64@0.34.5": { + 253 | - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + 362 | + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + 254 | - "os": ["netbsd"], + 255 | - "cpu": ["x64"] + 256 | - }, + 257 | - "@esbuild/openbsd-x64@0.17.19": { + 258 | - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + 259 | - "os": ["openbsd"], + 260 | - "cpu": ["x64"] + 261 | - }, + 262 | - "@esbuild/openbsd-x64@0.21.5": { + 263 | - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + 264 | - "os": ["openbsd"], + 265 | - "cpu": ["x64"] + 266 | - }, + 267 | - "@esbuild/sunos-x64@0.17.19": { + 268 | - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + 269 | - "os": ["sunos"], + 270 | - "cpu": ["x64"] + 271 | - }, + 272 | - "@esbuild/sunos-x64@0.21.5": { + 273 | - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + 274 | - "os": ["sunos"], + 275 | - "cpu": ["x64"] + 276 | - }, + 277 | - "@esbuild/win32-arm64@0.17.19": { + 278 | - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + | ... + 282 | - "@esbuild/win32-arm64@0.21.5": { + 366 | + "@img/sharp-win32-ia32@0.34.5": { + 283 | - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + 367 | + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + 284 | - "os": ["win32"], + 285 | - "cpu": ["arm64"] + 286 | - }, + 287 | - "@esbuild/win32-ia32@0.17.19": { + 288 | - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + | ... + 292 | - "@esbuild/win32-ia32@0.21.5": { + 371 | + "@img/sharp-win32-x64@0.34.5": { + 293 | - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + 372 | + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + 294 | - "os": ["win32"], + 295 | - "cpu": ["ia32"] + 296 | - }, + 297 | - "@esbuild/win32-x64@0.17.19": { + 298 | - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + | ... + 302 | - "@esbuild/win32-x64@0.21.5": { + 303 | - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + 304 | - "os": ["win32"], + 305 | - "cpu": ["x64"] + 306 | - }, + 307 | - "@fastify/busboy@2.1.1": { + 308 | - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" + 309 | - }, + | ... + 323 | - "@rollup/rollup-android-arm-eabi@4.57.1": { + 389 | + "@napi-rs/wasm-runtime@1.1.1": { + 324 | - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + 390 | + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + 325 | - "os": ["android"], + 391 | + "dependencies": [ + 326 | - "cpu": ["arm"] + 392 | + "@emnapi/core", + 393 | + "@emnapi/runtime", + 394 | + "@tybys/wasm-util" + 395 | + ] + | ... + 328 | - "@rollup/rollup-android-arm64@4.57.1": { + 397 | + "@oxc-project/types@0.122.0": { + 329 | - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + 398 | + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==" + 399 | + }, + 400 | + "@poppinss/colors@4.1.6": { + 401 | + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + 402 | + "dependencies": [ + 403 | + "kleur" + 404 | + ] + 405 | + }, + 406 | + "@poppinss/dumper@0.6.5": { + 407 | + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + 408 | + "dependencies": [ + 409 | + "@poppinss/colors", + 410 | + "@sindresorhus/is", + 411 | + "supports-color" + 412 | + ] + 413 | + }, + 414 | + "@poppinss/exception@1.2.3": { + 415 | + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==" + 416 | + }, + 417 | + "@rolldown/binding-android-arm64@1.0.0-rc.11": { + 418 | + "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", + | ... + 333 | - "@rollup/rollup-darwin-arm64@4.57.1": { + 422 | + "@rolldown/binding-darwin-arm64@1.0.0-rc.11": { + 334 | - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + 423 | + "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", + | ... + 338 | - "@rollup/rollup-darwin-x64@4.57.1": { + 427 | + "@rolldown/binding-darwin-x64@1.0.0-rc.11": { + 339 | - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + 428 | + "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", + | ... + 343 | - "@rollup/rollup-freebsd-arm64@4.57.1": { + 432 | + "@rolldown/binding-freebsd-x64@1.0.0-rc.11": { + 344 | - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + 433 | + "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", + 345 | - "os": ["freebsd"], + 346 | - "cpu": ["arm64"] + 347 | - }, + 348 | - "@rollup/rollup-freebsd-x64@4.57.1": { + 349 | - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + | ... + 353 | - "@rollup/rollup-linux-arm-gnueabihf@4.57.1": { + 437 | + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11": { + 354 | - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + 438 | + "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", + | ... + 358 | - "@rollup/rollup-linux-arm-musleabihf@4.57.1": { + 442 | + "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11": { + 359 | - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + 443 | + "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", + 360 | - "os": ["linux"], + 361 | - "cpu": ["arm"] + 362 | - }, + 363 | - "@rollup/rollup-linux-arm64-gnu@4.57.1": { + 364 | - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + | ... + 368 | - "@rollup/rollup-linux-arm64-musl@4.57.1": { + 447 | + "@rolldown/binding-linux-arm64-musl@1.0.0-rc.11": { + 369 | - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + 448 | + "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", + | ... + 373 | - "@rollup/rollup-linux-loong64-gnu@4.57.1": { + 452 | + "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11": { + 374 | - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + 453 | + "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", + 375 | - "os": ["linux"], + 376 | - "cpu": ["loong64"] + 377 | - }, + 378 | - "@rollup/rollup-linux-loong64-musl@4.57.1": { + 379 | - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + 380 | - "os": ["linux"], + 381 | - "cpu": ["loong64"] + 382 | - }, + 383 | - "@rollup/rollup-linux-ppc64-gnu@4.57.1": { + 384 | - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + | ... + 388 | - "@rollup/rollup-linux-ppc64-musl@4.57.1": { + 457 | + "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11": { + 389 | - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + 458 | + "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", + 390 | - "os": ["linux"], + 391 | - "cpu": ["ppc64"] + 392 | - }, + 393 | - "@rollup/rollup-linux-riscv64-gnu@4.57.1": { + 394 | - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + 395 | - "os": ["linux"], + 396 | - "cpu": ["riscv64"] + 397 | - }, + 398 | - "@rollup/rollup-linux-riscv64-musl@4.57.1": { + 399 | - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + 400 | - "os": ["linux"], + 401 | - "cpu": ["riscv64"] + 402 | - }, + 403 | - "@rollup/rollup-linux-s390x-gnu@4.57.1": { + 404 | - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + | ... + 408 | - "@rollup/rollup-linux-x64-gnu@4.57.1": { + 462 | + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.11": { + 409 | - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + 463 | + "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", + | ... + 413 | - "@rollup/rollup-linux-x64-musl@4.57.1": { + 467 | + "@rolldown/binding-linux-x64-musl@1.0.0-rc.11": { + 414 | - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + 468 | + "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", + | ... + 418 | - "@rollup/rollup-openbsd-x64@4.57.1": { + 472 | + "@rolldown/binding-openharmony-arm64@1.0.0-rc.11": { + 419 | - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + 473 | + "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", + 420 | - "os": ["openbsd"], + 421 | - "cpu": ["x64"] + 422 | - }, + 423 | - "@rollup/rollup-openharmony-arm64@4.57.1": { + 424 | - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + | ... + 428 | - "@rollup/rollup-win32-arm64-msvc@4.57.1": { + 477 | + "@rolldown/binding-wasm32-wasi@1.0.0-rc.11": { + 429 | - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + 478 | + "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", + 479 | + "dependencies": [ + 480 | + "@napi-rs/wasm-runtime" + 481 | + ], + 482 | + "cpu": ["wasm32"] + 483 | + }, + 484 | + "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11": { + 485 | + "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", + | ... + 433 | - "@rollup/rollup-win32-ia32-msvc@4.57.1": { + 489 | + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.11": { + 434 | - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + 490 | + "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", + 435 | - "os": ["win32"], + 436 | - "cpu": ["ia32"] + 437 | - }, + 438 | - "@rollup/rollup-win32-x64-gnu@4.57.1": { + 439 | - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + | ... + 443 | - "@rollup/rollup-win32-x64-msvc@4.57.1": { + 494 | + "@rolldown/pluginutils@1.0.0-rc.11": { + 444 | - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + 495 | + "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==" + 445 | - "os": ["win32"], + 496 | + }, + 446 | - "cpu": ["x64"] + 497 | + "@sindresorhus/is@7.2.0": { + 498 | + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==" + 499 | + }, + 500 | + "@speed-highlight/core@1.2.15": { + 501 | + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==" + 502 | + }, + 503 | + "@standard-schema/spec@1.1.0": { + 504 | + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" + 505 | + }, + 506 | + "@tybys/wasm-util@0.10.1": { + 507 | + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + 508 | + "dependencies": [ + 509 | + "tslib" + 510 | + ] + 511 | + }, + 512 | + "@types/chai@5.2.3": { + 513 | + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + 514 | + "dependencies": [ + 515 | + "@types/deep-eql", + 516 | + "assertion-error" + 517 | + ] + 518 | + }, + 519 | + "@types/deep-eql@4.0.2": { + 520 | + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" + | ... + 451 | - "@types/node-forge@1.3.14": { + 525 | + "@vitest/expect@4.1.1": { + 452 | - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + 526 | + "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", + 453 | - "dependencies": [ + 454 | - "@types/node" + 455 | - ] + 456 | - }, + 457 | - "@types/node@25.3.5": { + 458 | - "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", + 459 | - "dependencies": [ + 460 | - "undici-types" + 461 | - ] + 462 | - }, + 463 | - "@vitest/expect@2.1.9": { + 464 | - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + | ... + 528 | + "@standard-schema/spec", + 529 | + "@types/chai", + | ... + 472 | - "@vitest/mocker@2.1.9_vite@5.4.21": { + 536 | + "@vitest/mocker@4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3": { + 473 | - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + 537 | + "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", + | ... + 476 | - "estree-walker@3.0.3", + 540 | + "estree-walker", + 477 | - "magic-string@0.30.21", + 541 | + "magic-string", + | ... + 484 | - "@vitest/pretty-format@2.1.9": { + 548 | + "@vitest/pretty-format@4.1.1": { + 485 | - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + 549 | + "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", + | ... + 490 | - "@vitest/runner@2.1.9": { + 554 | + "@vitest/runner@4.1.1": { + 491 | - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + 555 | + "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", + | ... + 494 | - "pathe@1.1.2" + 558 | + "pathe" + | ... + 497 | - "@vitest/snapshot@2.1.9": { + 561 | + "@vitest/snapshot@4.1.1": { + 498 | - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + 562 | + "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", + | ... + 501 | - "magic-string@0.30.21", + 565 | + "@vitest/utils", + 502 | - "pathe@1.1.2" + 566 | + "magic-string", + 567 | + "pathe" + | ... + 505 | - "@vitest/spy@2.1.9": { + 570 | + "@vitest/spy@4.1.1": { + 506 | - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + 571 | + "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==" + 507 | - "dependencies": [ + 508 | - "tinyspy" + 509 | - ] + | ... + 511 | - "@vitest/utils@2.1.9": { + 573 | + "@vitest/utils@4.1.1": { + 512 | - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + 574 | + "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", + | ... + 515 | - "loupe", + 577 | + "convert-source-map", + | ... + 519 | - "acorn-walk@8.3.2": { + 520 | - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==" + 521 | - }, + 522 | - "acorn@8.16.0": { + 523 | - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + 524 | - "bin": true + 525 | - }, + 526 | - "as-table@1.0.55": { + 527 | - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + 528 | - "dependencies": [ + 529 | - "printable-characters" + 530 | - ] + 531 | - }, + | ... + 535 | - "birpc@0.2.14": { + 536 | - "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==" + 537 | - }, + | ... + 541 | - "cac@6.7.14": { + 587 | + "chai@6.2.2": { + 542 | - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + 588 | + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==" + 543 | - }, + 544 | - "capnp-ts@0.7.0": { + 545 | - "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + 546 | - "dependencies": [ + 547 | - "debug", + 548 | - "tslib" + 549 | - ] + 550 | - }, + 551 | - "chai@5.3.3": { + 552 | - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + 553 | - "dependencies": [ + 554 | - "assertion-error", + 555 | - "check-error", + 556 | - "deep-eql", + 557 | - "loupe", + 558 | - "pathval" + 559 | - ] + 560 | - }, + 561 | - "check-error@2.1.3": { + 562 | - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==" + 563 | - }, + 564 | - "chokidar@4.0.3": { + 565 | - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + 566 | - "dependencies": [ + 567 | - "readdirp" + 568 | - ] + | ... + 573 | - "confbox@0.1.8": { + 593 | + "convert-source-map@2.0.0": { + 574 | - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + 594 | + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + | ... + 576 | - "cookie@0.7.2": { + 596 | + "cookie@1.1.1": { + 577 | - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" + 597 | + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==" + | ... + 579 | - "data-uri-to-buffer@2.0.2": { + 599 | + "detect-libc@2.1.2": { + 580 | - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==" + 600 | + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + | ... + 582 | - "date-fns@4.1.0": { + 602 | + "error-stack-parser-es@1.0.5": { + 583 | - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==" + 603 | + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" + | ... + 585 | - "debug@4.4.3": { + 605 | + "es-module-lexer@2.0.0": { + 586 | - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + 606 | + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==" + 587 | - "dependencies": [ + 588 | - "ms" + 589 | - ] + | ... + 591 | - "deep-eql@5.0.2": { + 608 | + "esbuild@0.27.3": { + 592 | - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" + 609 | + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + 593 | - }, + 594 | - "defu@6.1.4": { + 595 | - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + 596 | - }, + 597 | - "devalue@4.3.3": { + 598 | - "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==" + 599 | - }, + 600 | - "es-module-lexer@1.7.0": { + 601 | - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + 602 | - }, + 603 | - "esbuild@0.17.19": { + 604 | - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + 605 | - "optionalDependencies": [ + 606 | - "@esbuild/android-arm@0.17.19", + 607 | - "@esbuild/android-arm64@0.17.19", + 608 | - "@esbuild/android-x64@0.17.19", + 609 | - "@esbuild/darwin-arm64@0.17.19", + 610 | - "@esbuild/darwin-x64@0.17.19", + 611 | - "@esbuild/freebsd-arm64@0.17.19", + 612 | - "@esbuild/freebsd-x64@0.17.19", + 613 | - "@esbuild/linux-arm@0.17.19", + 614 | - "@esbuild/linux-arm64@0.17.19", + 615 | - "@esbuild/linux-ia32@0.17.19", + 616 | - "@esbuild/linux-loong64@0.17.19", + 617 | - "@esbuild/linux-mips64el@0.17.19", + 618 | - "@esbuild/linux-ppc64@0.17.19", + 619 | - "@esbuild/linux-riscv64@0.17.19", + 620 | - "@esbuild/linux-s390x@0.17.19", + 621 | - "@esbuild/linux-x64@0.17.19", + 622 | - "@esbuild/netbsd-x64@0.17.19", + 623 | - "@esbuild/openbsd-x64@0.17.19", + 624 | - "@esbuild/sunos-x64@0.17.19", + 625 | - "@esbuild/win32-arm64@0.17.19", + 626 | - "@esbuild/win32-ia32@0.17.19", + 627 | - "@esbuild/win32-x64@0.17.19" + 628 | - ], + 629 | - "scripts": true, + 630 | - "bin": true + 631 | - }, + 632 | - "esbuild@0.21.5": { + 633 | - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + | ... + 636 | - "@esbuild/android-arm@0.21.5", + 612 | + "@esbuild/android-arm", + 637 | - "@esbuild/android-arm64@0.21.5", + 613 | + "@esbuild/android-arm64", + 638 | - "@esbuild/android-x64@0.21.5", + 614 | + "@esbuild/android-x64", + 639 | - "@esbuild/darwin-arm64@0.21.5", + 615 | + "@esbuild/darwin-arm64", + 640 | - "@esbuild/darwin-x64@0.21.5", + 616 | + "@esbuild/darwin-x64", + 641 | - "@esbuild/freebsd-arm64@0.21.5", + 617 | + "@esbuild/freebsd-arm64", + 642 | - "@esbuild/freebsd-x64@0.21.5", + 618 | + "@esbuild/freebsd-x64", + 643 | - "@esbuild/linux-arm@0.21.5", + 619 | + "@esbuild/linux-arm", + 644 | - "@esbuild/linux-arm64@0.21.5", + 620 | + "@esbuild/linux-arm64", + 645 | - "@esbuild/linux-ia32@0.21.5", + 621 | + "@esbuild/linux-ia32", + 646 | - "@esbuild/linux-loong64@0.21.5", + 622 | + "@esbuild/linux-loong64", + 647 | - "@esbuild/linux-mips64el@0.21.5", + 623 | + "@esbuild/linux-mips64el", + 648 | - "@esbuild/linux-ppc64@0.21.5", + 624 | + "@esbuild/linux-ppc64", + 649 | - "@esbuild/linux-riscv64@0.21.5", + 625 | + "@esbuild/linux-riscv64", + 650 | - "@esbuild/linux-s390x@0.21.5", + 626 | + "@esbuild/linux-s390x", + 651 | - "@esbuild/linux-x64@0.21.5", + 627 | + "@esbuild/linux-x64", + 652 | - "@esbuild/netbsd-x64@0.21.5", + 628 | + "@esbuild/netbsd-arm64", + 653 | - "@esbuild/openbsd-x64@0.21.5", + 629 | + "@esbuild/netbsd-x64", + 654 | - "@esbuild/sunos-x64@0.21.5", + 630 | + "@esbuild/openbsd-arm64", + 655 | - "@esbuild/win32-arm64@0.21.5", + 631 | + "@esbuild/openbsd-x64", + 656 | - "@esbuild/win32-ia32@0.21.5", + 632 | + "@esbuild/openharmony-arm64", + 657 | - "@esbuild/win32-x64@0.21.5" + 633 | + "@esbuild/sunos-x64", + 634 | + "@esbuild/win32-arm64", + 635 | + "@esbuild/win32-ia32", + 636 | + "@esbuild/win32-x64" + | ... + 662 | - "escape-string-regexp@4.0.0": { + 663 | - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + 664 | - }, + 665 | - "estree-walker@0.6.1": { + 666 | - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + 667 | - }, + | ... + 674 | - "exit-hook@2.2.1": { + 675 | - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==" + 676 | - }, + | ... + 650 | + "fdir@6.5.0_picomatch@4.0.4": { + 651 | + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + 652 | + "dependencies": [ + 653 | + "picomatch" + 654 | + ], + 655 | + "optionalPeers": [ + 656 | + "picomatch" + 657 | + ] + 658 | + }, + | ... + 685 | - "function-bind@1.1.2": { + 664 | + "kleur@4.1.5": { + 686 | - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + 665 | + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + | ... + 688 | - "get-source@2.0.12": { + 667 | + "lightningcss-android-arm64@1.32.0": { + 689 | - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + 668 | + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + 669 | + "os": ["android"], + 670 | + "cpu": ["arm64"] + 671 | + }, + 672 | + "lightningcss-darwin-arm64@1.32.0": { + 673 | + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + 674 | + "os": ["darwin"], + 675 | + "cpu": ["arm64"] + 676 | + }, + 677 | + "lightningcss-darwin-x64@1.32.0": { + 678 | + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + 679 | + "os": ["darwin"], + 680 | + "cpu": ["x64"] + 681 | + }, + 682 | + "lightningcss-freebsd-x64@1.32.0": { + 683 | + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + 684 | + "os": ["freebsd"], + 685 | + "cpu": ["x64"] + 686 | + }, + 687 | + "lightningcss-linux-arm-gnueabihf@1.32.0": { + 688 | + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + 689 | + "os": ["linux"], + 690 | + "cpu": ["arm"] + 691 | + }, + 692 | + "lightningcss-linux-arm64-gnu@1.32.0": { + 693 | + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + 694 | + "os": ["linux"], + 695 | + "cpu": ["arm64"] + 696 | + }, + 697 | + "lightningcss-linux-arm64-musl@1.32.0": { + 698 | + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + 699 | + "os": ["linux"], + 700 | + "cpu": ["arm64"] + 701 | + }, + 702 | + "lightningcss-linux-x64-gnu@1.32.0": { + 703 | + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + 704 | + "os": ["linux"], + 705 | + "cpu": ["x64"] + 706 | + }, + 707 | + "lightningcss-linux-x64-musl@1.32.0": { + 708 | + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + 709 | + "os": ["linux"], + 710 | + "cpu": ["x64"] + 711 | + }, + 712 | + "lightningcss-win32-arm64-msvc@1.32.0": { + 713 | + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + 714 | + "os": ["win32"], + 715 | + "cpu": ["arm64"] + 716 | + }, + 717 | + "lightningcss-win32-x64-msvc@1.32.0": { + 718 | + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + 719 | + "os": ["win32"], + 720 | + "cpu": ["x64"] + 721 | + }, + 722 | + "lightningcss@1.32.0": { + 723 | + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + | ... + 691 | - "data-uri-to-buffer", + 725 | + "detect-libc" + 692 | - "source-map" + 726 | + ], + 693 | - ] + 727 | + "optionalDependencies": [ + 694 | - }, + 728 | + "lightningcss-android-arm64", + 695 | - "glob-to-regexp@0.4.1": { + 729 | + "lightningcss-darwin-arm64", + 696 | - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + 730 | + "lightningcss-darwin-x64", + 697 | - }, + 731 | + "lightningcss-freebsd-x64", + 698 | - "hasown@2.0.2": { + 732 | + "lightningcss-linux-arm-gnueabihf", + 699 | - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + 733 | + "lightningcss-linux-arm64-gnu", + 700 | - "dependencies": [ + 734 | + "lightningcss-linux-arm64-musl", + 701 | - "function-bind" + 735 | + "lightningcss-linux-x64-gnu", + 702 | - ] + 736 | + "lightningcss-linux-x64-musl", + 703 | - }, + 737 | + "lightningcss-win32-arm64-msvc", + 704 | - "is-core-module@2.16.1": { + 738 | + "lightningcss-win32-x64-msvc" + 705 | - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + 706 | - "dependencies": [ + 707 | - "hasown" + 708 | - ] + 709 | - }, + 710 | - "itty-time@1.0.6": { + 711 | - "integrity": "sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==" + 712 | - }, + 713 | - "loupe@3.2.1": { + 714 | - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==" + 715 | - }, + 716 | - "magic-string@0.25.9": { + 717 | - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + 718 | - "dependencies": [ + 719 | - "sourcemap-codec" + | ... + 728 | - "mime@3.0.0": { + 747 | + "miniflare@4.20260317.2": { + 729 | - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + 748 | + "integrity": "sha512-qNL+yWAFMX6fr0pWU6Lx1vNpPobpnDSF1V8eunIckWvoIQl8y1oBjL2RJFEGY3un+l3f9gwW9dirDPP26usYJQ==", + 730 | - "bin": true + 731 | - }, + 732 | - "miniflare@3.20241230.0": { + 733 | - "integrity": "sha512-ZtWNoNAIj5Q0Vb3B4SPEKr7DDmVG8a0Stsp/AuRkYXoJniA5hsbKjFNIGhTXGMIHVP5bvDrKJWt/POIDGfpiKg==", + | ... + 736 | - "acorn", + 751 | + "sharp", + 737 | - "acorn-walk", + 738 | - "capnp-ts", + 739 | - "exit-hook", + 740 | - "glob-to-regexp", + 741 | - "stoppable", + | ... + 745 | - "youch", + 755 | + "youch" + 746 | - "zod" + | ... + 750 | - "mlly@1.8.2": { + 751 | - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + 752 | - "dependencies": [ + 753 | - "acorn", + 754 | - "pathe@2.0.3", + 755 | - "pkg-types", + 756 | - "ufo" + 757 | - ] + 758 | - }, + 759 | - "ms@2.1.3": { + 760 | - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + 761 | - }, + 762 | - "mustache@4.2.0": { + 763 | - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + 764 | - "bin": true + 765 | - }, + | ... + 770 | - "node-forge@1.4.0": { + 763 | + "obug@2.1.1": { + 771 | - "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==" + 764 | + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" + 772 | - }, + 773 | - "ohash@1.1.6": { + 774 | - "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==" + 775 | - }, + 776 | - "path-parse@1.0.7": { + 777 | - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + | ... + 782 | - "pathe@1.1.2": { + 783 | - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + 784 | - }, + | ... + 788 | - "pathval@2.0.1": { + 789 | - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==" + 790 | - }, + | ... + 794 | - "pkg-types@1.3.1": { + 775 | + "picomatch@4.0.4": { + 795 | - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + 776 | + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" + 796 | - "dependencies": [ + 797 | - "confbox", + 798 | - "mlly", + 799 | - "pathe@2.0.3" + 800 | - ] + | ... + 810 | - "preact-render-to-string@6.6.5_preact@10.28.3": { + 786 | + "preact-render-to-string@6.6.6_preact@10.29.0": { + 811 | - "integrity": "sha512-O6MHzYNIKYaiSX3bOw0gGZfEbOmlIDtDfWwN1JJdc/T3ihzRT6tGGSEWE088dWrEDGa1u7101q+6fzQnO9XCPA==", + 787 | + "integrity": "sha512-EfqZJytnjJldV+YaaqhthU2oXsEf5e+6rDv957p+zxAvNfFLQOPfvBOTncscQ+akzu6Wrl7s3Pa0LjUQmWJsGQ==", + | ... + 816 | - "preact@10.28.3": { + 792 | + "preact@10.29.0": { + 817 | - "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==" + 793 | + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" + | ... + 819 | - "printable-characters@1.0.42": { + 795 | + "rolldown@1.0.0-rc.11": { + 820 | - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==" + 796 | + "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", + 821 | - }, + 822 | - "readdirp@4.1.2": { + 823 | - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" + 824 | - }, + 825 | - "resolve@1.22.11": { + 826 | - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + | ... + 828 | - "is-core-module", + 798 | + "@oxc-project/types", + 829 | - "path-parse", + 799 | + "@rolldown/pluginutils" + 830 | - "supports-preserve-symlinks-flag" + 831 | - ], + 832 | - "bin": true + 833 | - }, + 834 | - "rollup-plugin-inject@3.0.2": { + 835 | - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + 836 | - "dependencies": [ + 837 | - "estree-walker@0.6.1", + 838 | - "magic-string@0.25.9", + 839 | - "rollup-pluginutils" + 840 | - ], + 841 | - "deprecated": true + 842 | - }, + 843 | - "rollup-plugin-node-polyfills@0.2.1": { + 844 | - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + 845 | - "dependencies": [ + 846 | - "rollup-plugin-inject" + 847 | - ] + 848 | - }, + 849 | - "rollup-pluginutils@2.8.2": { + 850 | - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + 851 | - "dependencies": [ + 852 | - "estree-walker@0.6.1" + 853 | - ] + 854 | - }, + 855 | - "rollup@4.57.1": { + 856 | - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + 857 | - "dependencies": [ + 858 | - "@types/estree" + | ... + 861 | - "@rollup/rollup-android-arm-eabi", + 802 | + "@rolldown/binding-android-arm64", + 862 | - "@rollup/rollup-android-arm64", + 803 | + "@rolldown/binding-darwin-arm64", + 863 | - "@rollup/rollup-darwin-arm64", + 804 | + "@rolldown/binding-darwin-x64", + 864 | - "@rollup/rollup-darwin-x64", + 805 | + "@rolldown/binding-freebsd-x64", + 865 | - "@rollup/rollup-freebsd-arm64", + 806 | + "@rolldown/binding-linux-arm-gnueabihf", + 866 | - "@rollup/rollup-freebsd-x64", + 807 | + "@rolldown/binding-linux-arm64-gnu", + 867 | - "@rollup/rollup-linux-arm-gnueabihf", + 808 | + "@rolldown/binding-linux-arm64-musl", + 868 | - "@rollup/rollup-linux-arm-musleabihf", + 809 | + "@rolldown/binding-linux-ppc64-gnu", + 869 | - "@rollup/rollup-linux-arm64-gnu", + 810 | + "@rolldown/binding-linux-s390x-gnu", + 870 | - "@rollup/rollup-linux-arm64-musl", + 811 | + "@rolldown/binding-linux-x64-gnu", + 871 | - "@rollup/rollup-linux-loong64-gnu", + 812 | + "@rolldown/binding-linux-x64-musl", + 872 | - "@rollup/rollup-linux-loong64-musl", + 813 | + "@rolldown/binding-openharmony-arm64", + 873 | - "@rollup/rollup-linux-ppc64-gnu", + 814 | + "@rolldown/binding-wasm32-wasi", + 874 | - "@rollup/rollup-linux-ppc64-musl", + 815 | + "@rolldown/binding-win32-arm64-msvc", + 875 | - "@rollup/rollup-linux-riscv64-gnu", + 816 | + "@rolldown/binding-win32-x64-msvc" + 876 | - "@rollup/rollup-linux-riscv64-musl", + 877 | - "@rollup/rollup-linux-s390x-gnu", + 878 | - "@rollup/rollup-linux-x64-gnu", + 879 | - "@rollup/rollup-linux-x64-musl", + 880 | - "@rollup/rollup-openbsd-x64", + 881 | - "@rollup/rollup-openharmony-arm64", + 882 | - "@rollup/rollup-win32-arm64-msvc", + 883 | - "@rollup/rollup-win32-ia32-msvc", + 884 | - "@rollup/rollup-win32-x64-gnu", + 885 | - "@rollup/rollup-win32-x64-msvc", + 886 | - "fsevents" + | ... + 890 | - "selfsigned@2.4.1": { + 891 | - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + 892 | - "dependencies": [ + 893 | - "@types/node-forge", + 894 | - "node-forge" + 895 | - ] + 896 | - }, + | ... + 824 | + "sharp@0.34.5": { + 825 | + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + 826 | + "dependencies": [ + 827 | + "@img/colour", + 828 | + "detect-libc", + 829 | + "semver" + 830 | + ], + 831 | + "optionalDependencies": [ + 832 | + "@img/sharp-darwin-arm64", + 833 | + "@img/sharp-darwin-x64", + 834 | + "@img/sharp-libvips-darwin-arm64", + 835 | + "@img/sharp-libvips-darwin-x64", + 836 | + "@img/sharp-libvips-linux-arm", + 837 | + "@img/sharp-libvips-linux-arm64", + 838 | + "@img/sharp-libvips-linux-ppc64", + 839 | + "@img/sharp-libvips-linux-riscv64", + 840 | + "@img/sharp-libvips-linux-s390x", + 841 | + "@img/sharp-libvips-linux-x64", + 842 | + "@img/sharp-libvips-linuxmusl-arm64", + 843 | + "@img/sharp-libvips-linuxmusl-x64", + 844 | + "@img/sharp-linux-arm", + 845 | + "@img/sharp-linux-arm64", + 846 | + "@img/sharp-linux-ppc64", + 847 | + "@img/sharp-linux-riscv64", + 848 | + "@img/sharp-linux-s390x", + 849 | + "@img/sharp-linux-x64", + 850 | + "@img/sharp-linuxmusl-arm64", + 851 | + "@img/sharp-linuxmusl-x64", + 852 | + "@img/sharp-wasm32", + 853 | + "@img/sharp-win32-arm64", + 854 | + "@img/sharp-win32-ia32", + 855 | + "@img/sharp-win32-x64" + 856 | + ], + 857 | + "scripts": true + 858 | + }, + | ... + 907 | - "source-map@0.6.1": { + 908 | - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + 909 | - }, + 910 | - "sourcemap-codec@1.4.8": { + 911 | - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + 912 | - "deprecated": true + 913 | - }, + | ... + 917 | - "stacktracey@2.2.0": { + 868 | + "std-env@4.0.0": { + 918 | - "integrity": "sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==", + 869 | + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==" + 919 | - "dependencies": [ + 920 | - "as-table", + 921 | - "get-source" + 922 | - ] + | ... + 924 | - "std-env@3.10.0": { + 871 | + "supports-color@10.2.2": { + 925 | - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" + 872 | + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" + 926 | - }, + 927 | - "stoppable@1.1.0": { + 928 | - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" + 929 | - }, + 930 | - "supports-preserve-symlinks-flag@1.0.0": { + 931 | - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + | ... + 936 | - "tinyexec@0.3.2": { + 877 | + "tinyexec@1.0.4": { + 937 | - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + 878 | + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==" + | ... + 939 | - "tinypool@1.1.1": { + 880 | + "tinyglobby@0.2.15": { + 940 | - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==" + 881 | + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + 882 | + "dependencies": [ + 883 | + "fdir", + 884 | + "picomatch" + 885 | + ] + | ... + 942 | - "tinyrainbow@1.2.0": { + 887 | + "tinyrainbow@3.1.0": { + 943 | - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==" + 888 | + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==" + 944 | - }, + 945 | - "tinyspy@3.0.2": { + 946 | - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" + | ... + 951 | - "ufo@1.6.3": { + 893 | + "undici@7.24.4": { + 952 | - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==" + 894 | + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==" + | ... + 954 | - "undici-types@7.18.2": { + 896 | + "unenv@2.0.0-rc.24": { + 955 | - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" + 897 | + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + 956 | - }, + 957 | - "undici@5.29.0": { + 958 | - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + | ... + 960 | - "@fastify/busboy" + 899 | + "pathe" + | ... + 963 | - "unenv-nightly@2.0.0-20241218-183400-5d6aec3": { + 902 | + "vite@8.0.2_esbuild@0.27.3": { + 964 | - "integrity": "sha512-7Xpi29CJRbOV1/IrC03DawMJ0hloklDLq/cigSe+J2jkcC+iDres2Cy0r4ltj5f0x7DqsaGaB4/dLuCPPFZnZA==", + 903 | + "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", + | ... + 966 | - "defu", + 905 | + "esbuild", + 967 | - "mlly", + 906 | + "lightningcss", + 968 | - "ohash", + 907 | + "picomatch", + 969 | - "pathe@1.1.2", + 970 | - "ufo" + 971 | - ] + 972 | - }, + 973 | - "vite-node@2.1.9": { + 974 | - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + 975 | - "dependencies": [ + 976 | - "cac", + 977 | - "debug", + 978 | - "es-module-lexer", + 979 | - "pathe@1.1.2", + 980 | - "vite" + 981 | - ], + 982 | - "bin": true + 983 | - }, + 984 | - "vite@5.4.21": { + 985 | - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + 986 | - "dependencies": [ + 987 | - "esbuild@0.21.5", + | ... + 989 | - "rollup" + 909 | + "rolldown", + 910 | + "tinyglobby" + | ... + 915 | + "optionalPeers": [ + 916 | + "esbuild" + 917 | + ], + | ... + 996 | - "vitest@2.1.9": { + 920 | + "vitest@4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3": { + 997 | - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + 921 | + "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", + | ... +1006 | - "chai", + 930 | + "es-module-lexer", +1007 | - "debug", + | ... +1009 | - "magic-string@0.30.21", + 932 | + "magic-string", +1010 | - "pathe@1.1.2", + 933 | + "obug", + 934 | + "pathe", + 935 | + "picomatch", + | ... +1014 | - "tinypool", + 939 | + "tinyglobby", + | ... +1017 | - "vite-node", + | ... +1030 | - "workerd@1.20241230.0": { + 954 | + "workerd@1.20260317.1": { +1031 | - "integrity": "sha512-EgixXP0JGXGq6J9lz17TKIZtfNDUvJNG+cl9paPMfZuYWT920fFpBx+K04YmnbQRLnglsivF1GT9pxh1yrlWhg==", + 955 | + "integrity": "sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==", + | ... +1042 | - "wrangler@3.100.0_@cloudflare+workers-types@4.20260226.1": { + 966 | + "wrangler@4.77.0_@cloudflare+workers-types@4.20260317.1": { +1043 | - "integrity": "sha512-+nsZK374Xnp2BEQQuB/18pnObgsOey0AHVlg75pAdwNaKAmB2aa0/E5rFb7i89DiiwFYoZMz3cARY1UKcm/WQQ==", + 967 | + "integrity": "sha512-E2Gm69+K++BFd3QvoWjC290RPQj1vDOUotA++sNHmtKPb7EP6C8Qv+1D5Ii73tfZtyNgakpqHlh8lBBbVWTKAQ==", + | ... + 970 | + "@cloudflare/unenv-preset", + | ... +1047 | - "@esbuild-plugins/node-globals-polyfill", +1048 | - "@esbuild-plugins/node-modules-polyfill", + | ... +1050 | - "chokidar", + 973 | + "esbuild", +1051 | - "date-fns", +1052 | - "esbuild@0.17.19", +1053 | - "itty-time", + | ... +1055 | - "nanoid", + | ... +1057 | - "resolve", + 976 | + "unenv", +1058 | - "selfsigned", + 977 | + "workerd" +1059 | - "source-map", +1060 | - "unenv@npm:unenv-nightly@2.0.0-20241218-183400-5d6aec3", +1061 | - "workerd", +1062 | - "xxhash-wasm" + | ... +1070 | - "deprecated": true, + | ... +1076 | - "xxhash-wasm@1.1.0": { + 990 | + "youch-core@0.3.3": { +1077 | - "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" + 991 | + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", +1078 | - }, +1079 | - "youch@3.3.4": { +1080 | - "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + | ... +1082 | - "cookie", + 993 | + "@poppinss/exception", +1083 | - "mustache", + 994 | + "error-stack-parser-es" +1084 | - "stacktracey" + | ... +1087 | - "zod@3.22.3": { + 997 | + "youch@4.1.0-beta.10": { +1088 | - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==" + 998 | + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + 999 | + "dependencies": [ +1000 | + "@poppinss/colors", +1001 | + "@poppinss/dumper", +1002 | + "@speed-highlight/core", +1003 | + "cookie", +1004 | + "youch-core" +1005 | + ] +1006 | + }, +1007 | + "zod@3.25.76": { +1008 | + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + | ... +1100 | - "npm:@cloudflare/vitest-pool-workers@0.5", +1020 | + "npm:@cloudflare/vitest-pool-workers@~0.13.4", +1101 | - "npm:@cloudflare/workers-types@^4.20241205.0", +1021 | + "npm:@cloudflare/workers-types@^4.20260317.1", +1102 | - "npm:preact-render-to-string@^6.1.0", +1022 | + "npm:preact-render-to-string@^6.6.6", +1103 | - "npm:preact@^10.15.1", +1023 | + "npm:preact@^10.29.0", +1104 | - "npm:vitest@2.1", +1024 | + "npm:vitest@~4.1.1", +1105 | - "npm:wrangler@^3.90.0" +1025 | + "npm:wrangler@^4.77.0" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..67d38c7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2756 @@ +{ + "name": "dprint-plugins", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dprint-plugins", + "dependencies": { + "preact": "^10.29.0", + "preact-render-to-string": "^6.6.6" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.13.4", + "@cloudflare/workers-types": "^4.20260317.1", + "vitest": "~4.1.1", + "wrangler": "^4.77.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.0.tgz", + "integrity": "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vitest-pool-workers": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.13.4.tgz", + "integrity": "sha512-0LWc3d14+8yiQsb6Io8HqWmHcNTPUAbxuvt5KbeL3ZPY70xvvaFJdxMYuHPYVbVVvV2oakoyc3pRitJLZRmEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cjs-module-lexer": "^1.2.3", + "esbuild": "0.27.3", + "miniflare": "4.20260317.2", + "wrangler": "4.77.0", + "zod": "^3.25.76" + }, + "peerDependencies": { + "@vitest/runner": "^4.1.0", + "@vitest/snapshot": "^4.1.0", + "vitest": "^4.1.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260317.1.tgz", + "integrity": "sha512-8hjh3sPMwY8M/zedq3/sXoA2Q4BedlGufn3KOOleIG+5a4ReQKLlUah140D7J6zlKmYZAFMJ4tWC7hCuI/s79g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260317.1.tgz", + "integrity": "sha512-M/MnNyvO5HMgoIdr3QHjdCj2T1ki9gt0vIUnxYxBu9ISXS/jgtMl6chUVPJ7zHYBn9MyYr8ByeN6frjYxj0MGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260317.1.tgz", + "integrity": "sha512-1ltuEjkRcS3fsVF7CxsKlWiRmzq2ZqMfqDN0qUOgbUwkpXsLVJsXmoblaLf5OP00ELlcgF0QsN0p2xPEua4Uug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260317.1.tgz", + "integrity": "sha512-3QrNnPF1xlaNwkHpasvRvAMidOvQs2NhXQmALJrEfpIJ/IDL2la8g499yXp3eqhG3hVMCB07XVY149GTs42Xtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260317.1.tgz", + "integrity": "sha512-MfZTz+7LfuIpMGTa3RLXHX8Z/pnycZLItn94WRdHr8LPVet+C5/1Nzei399w/jr3+kzT4pDKk26JF/tlI5elpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20260317.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260317.1.tgz", + "integrity": "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peer": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", + "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", + "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", + "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", + "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", + "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", + "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", + "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", + "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", + "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz", + "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz", + "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz", + "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.1.tgz", + "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vitest/utils": "4.1.1", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.1.tgz", + "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "@vitest/utils": "4.1.1", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz", + "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz", + "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/miniflare": { + "version": "4.20260317.2", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260317.2.tgz", + "integrity": "sha512-qNL+yWAFMX6fr0pWU6Lx1vNpPobpnDSF1V8eunIckWvoIQl8y1oBjL2RJFEGY3un+l3f9gwW9dirDPP26usYJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.4", + "workerd": "1.20260317.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.0.tgz", + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.6.6.tgz", + "integrity": "sha512-EfqZJytnjJldV+YaaqhthU2oXsEf5e+6rDv957p+zxAvNfFLQOPfvBOTncscQ+akzu6Wrl7s3Pa0LjUQmWJsGQ==", + "license": "MIT", + "peerDependencies": { + "preact": ">=10 || >= 11.0.0-0" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", + "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.11" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.11", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", + "@rolldown/binding-darwin-x64": "1.0.0-rc.11", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "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" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/undici": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/vite": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", + "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.11", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.1.tgz", + "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vitest/expect": "4.1.1", + "@vitest/mocker": "4.1.1", + "@vitest/pretty-format": "4.1.1", + "@vitest/runner": "4.1.1", + "@vitest/snapshot": "4.1.1", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.1", + "@vitest/browser-preview": "4.1.1", + "@vitest/browser-webdriverio": "4.1.1", + "@vitest/ui": "4.1.1", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerd": { + "version": "1.20260317.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260317.1.tgz", + "integrity": "sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260317.1", + "@cloudflare/workerd-darwin-arm64": "1.20260317.1", + "@cloudflare/workerd-linux-64": "1.20260317.1", + "@cloudflare/workerd-linux-arm64": "1.20260317.1", + "@cloudflare/workerd-windows-64": "1.20260317.1" + } + }, + "node_modules/wrangler": { + "version": "4.77.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.77.0.tgz", + "integrity": "sha512-E2Gm69+K++BFd3QvoWjC290RPQj1vDOUotA++sNHmtKPb7EP6C8Qv+1D5Ii73tfZtyNgakpqHlh8lBBbVWTKAQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.16.0", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260317.2", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260317.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=20.3.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260317.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1713b8f --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "dprint-plugins", + "private": true, + "type": "module", + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "test": "vitest run" + }, + "dependencies": { + "preact": "^10.29.0", + "preact-render-to-string": "^6.6.6" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.13.4", + "@cloudflare/workers-types": "^4.20260317.1", + "vitest": "~4.1.1", + "wrangler": "^4.77.0" + } +} diff --git a/plugins.test.ts b/plugins.test.ts index 0ac751f..615a002 100644 --- a/plugins.test.ts +++ b/plugins.test.ts @@ -1,29 +1,27 @@ -import { assertEquals } from "@std/assert"; -import { tryResolveLatestJson } from "./plugins.ts"; -import { getLatestReleaseInfo } from "./utils/github.ts"; +import { expect, it } from "vitest"; +import { tryResolveLatestJson } from "./plugins.js"; +import { getLatestReleaseInfo } from "./utils/github.js"; -Deno.test("tryResolveUserLatestJson", async () => { +it("tryResolveUserLatestJson", async () => { // non-matching - assertEquals( + expect( await tryResolveLatestJson( new URL("https://plugins.dprint.dev/dsherret/latest.json"), ), - undefined, - ); + ).toEqual(undefined); - assertEquals( + expect( await tryResolveLatestJson( new URL("https://plugins.dprint.dev/dsherret/non-existent/latest.json"), ), - 404, - ); + ).toEqual(404); // dprint repo { const result = await getValidResultForUrl("https://plugins.dprint.dev/dprint/typescript/latest.json"); const releaseInfo = await getLatestReleaseInfo("dprint", "dprint-plugin-typescript"); - assertEquals(releaseInfo?.checksum?.length, 64); - assertEquals(result, { + expect(releaseInfo?.checksum?.length).toEqual(64); + expect(result).toEqual({ schemaVersion: 1, url: `https://plugins.dprint.dev/typescript-${releaseInfo!.tagName}.wasm`, version: releaseInfo!.tagName, @@ -36,8 +34,8 @@ Deno.test("tryResolveUserLatestJson", async () => { "https://plugins.dprint.dev/dprint/dprint-plugin-typescript/latest.json", ); const releaseInfo = await getLatestReleaseInfo("dprint", "dprint-plugin-typescript"); - assertEquals(releaseInfo?.checksum?.length, 64); - assertEquals(result, { + expect(releaseInfo?.checksum?.length).toEqual(64); + expect(result).toEqual({ schemaVersion: 1, url: `https://plugins.dprint.dev/typescript-${releaseInfo!.tagName}.wasm`, version: releaseInfo!.tagName, @@ -48,7 +46,7 @@ Deno.test("tryResolveUserLatestJson", async () => { { const result = await getValidResultForUrl("https://plugins.dprint.dev/malobre/vue/latest.json"); const releaseInfo = await getLatestReleaseInfo("malobre", "dprint-plugin-vue"); - assertEquals(result, { + expect(result).toEqual({ schemaVersion: 1, url: `https://plugins.dprint.dev/malobre/vue-${releaseInfo!.tagName}.wasm`, version: releaseInfo!.tagName.replace(/^v/, ""), @@ -59,7 +57,7 @@ Deno.test("tryResolveUserLatestJson", async () => { { const result = await getValidResultForUrl("https://plugins.dprint.dev/malobre/dprint-plugin-vue/latest.json"); const releaseInfo = await getLatestReleaseInfo("malobre", "dprint-plugin-vue"); - assertEquals(result, { + expect(result).toEqual({ schemaVersion: 1, url: `https://plugins.dprint.dev/malobre/vue-${releaseInfo!.tagName}.wasm`, version: releaseInfo!.tagName.replace(/^v/, ""), @@ -70,8 +68,8 @@ Deno.test("tryResolveUserLatestJson", async () => { { const result = await getValidResultForUrl("https://plugins.dprint.dev/dprint/prettier/latest.json"); const releaseInfo = await getLatestReleaseInfo("dprint", "dprint-plugin-prettier"); - assertEquals(releaseInfo?.checksum?.length, 64); - assertEquals(result, { + expect(releaseInfo?.checksum?.length).toEqual(64); + expect(result).toEqual({ schemaVersion: 1, url: `https://plugins.dprint.dev/prettier-${releaseInfo!.tagName}.json`, version: releaseInfo!.tagName, diff --git a/plugins.ts b/plugins.ts index 1e43ca0..d38eb0d 100644 --- a/plugins.ts +++ b/plugins.ts @@ -1,4 +1,4 @@ -import { checkGithubRepoExists, getLatestReleaseInfo } from "./utils/mod.ts"; +import { checkGithubRepoExists, getLatestReleaseInfo } from "./utils/mod.js"; const tagPattern = "([A-Za-z0-9\._]+)"; // repos may only contain alphanumeric, underscores, hyphens, and period diff --git a/readInfoFile.ts b/readInfoFile.ts index a60a1c3..41a1164 100644 --- a/readInfoFile.ts +++ b/readInfoFile.ts @@ -1,11 +1,6 @@ -import { getLatestInfo } from "./plugins.ts"; -import { getAllDownloadCount } from "./utils/github.ts"; -import { createAsyncLazy } from "./utils/mod.ts"; - -const infoLazy = createAsyncLazy>(async () => { - const data = await Deno.readTextFile("./info.json"); - return JSON.parse(data); -}); +import infoJson from "./info.json" with { type: "json" }; +import { getLatestInfo } from "./plugins.js"; +import { getAllDownloadCount } from "./utils/github.js"; // only typing what's used on the server export interface PluginsData { @@ -23,13 +18,12 @@ export interface PluginData { } export async function readInfoFile(): Promise> { - const infoObj = await infoLazy.get(); return { - ...infoObj, - latest: await getLatest(infoObj.latest), + ...infoJson, + latest: await getLatest(infoJson.latest), }; - async function getLatest(latest: Readonly[]) { + async function getLatest(latest: typeof infoJson.latest) { const results = []; for (const plugin of latest) { const [username, pluginName] = plugin.name.split("/"); diff --git a/style.css b/style.css index ce11505..93bffd3 100644 --- a/style.css +++ b/style.css @@ -14,15 +14,8 @@ body { flex: 1; flex-direction: column; font-family: - "Segoe UI", - Roboto, - Oxygen, - Ubuntu, - Cantarell, - "Fira Sans", - "Droid Sans", - "Helvetica Neue", - sans-serif; + "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", + "Helvetica Neue", sans-serif; } h1 { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a82a6c6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "jsx": "react-jsx", + "jsxImportSource": "preact", + "types": [ + "@cloudflare/workers-types/2023-07-01", + "@cloudflare/vitest-pool-workers" + ] + }, + "include": ["**/*.ts", "**/*.tsx"] +} diff --git a/utils/LazyExpirableValue.test.ts b/utils/LazyExpirableValue.test.ts index fd04892..1ea601b 100644 --- a/utils/LazyExpirableValue.test.ts +++ b/utils/LazyExpirableValue.test.ts @@ -1,7 +1,7 @@ -import { assertEquals, assertRejects } from "@std/assert"; -import { LazyExpirableValue } from "./LazyExpirableValue.ts"; +import { expect, it } from "vitest"; +import { LazyExpirableValue } from "./LazyExpirableValue.js"; -Deno.test("should work", async () => { +it("should work", async () => { let currentTime = 100; let returnedValue = 1; let deferred = () => @@ -15,21 +15,21 @@ Deno.test("should work", async () => { }, getTime: () => currentTime, }); - assertEquals(await cache.getValue(), 1); + expect(await cache.getValue()).toEqual(1); returnedValue = 2; - assertEquals(await cache.getValue(), 1); + expect(await cache.getValue()).toEqual(1); currentTime = 200; - assertEquals(await cache.getValue(), 1); + expect(await cache.getValue()).toEqual(1); currentTime = 201; - assertEquals(await cache.getValue(), 2); + expect(await cache.getValue()).toEqual(2); currentTime = 302; returnedValue = 3; - assertEquals(await cache.getValue(), 3); + expect(await cache.getValue()).toEqual(3); deferred = () => new Promise((_, reject) => reject(new Error("FAIL"))); - assertEquals(await cache.getValue(), 3); + expect(await cache.getValue()).toEqual(3); currentTime = 403; - await assertRejects(async () => await cache.getValue()); - await assertRejects(async () => await cache.getValue()); + await expect(cache.getValue()).rejects.toThrow(); + await expect(cache.getValue()).rejects.toThrow(); // now try two at the same time let storedResolve: any; @@ -38,9 +38,9 @@ Deno.test("should work", async () => { storedResolve = resolve; }); currentTime = 504; - let p1 = cache.getValue(); - let p2 = cache.getValue(); + const p1 = cache.getValue(); + const p2 = cache.getValue(); storedResolve(10); - assertEquals(await p1, 10); - assertEquals(await p2, 10); + expect(await p1).toEqual(10); + expect(await p2).toEqual(10); }); diff --git a/utils/LruCache.test.ts b/utils/LruCache.test.ts index 05ed42c..cc45e1b 100644 --- a/utils/LruCache.test.ts +++ b/utils/LruCache.test.ts @@ -1,42 +1,42 @@ -import { assertEquals } from "@std/assert"; -import { LruCache, LruCacheWithExpiry } from "./LruCache.ts"; +import { expect, it } from "vitest"; +import { LruCache, LruCacheWithExpiry } from "./LruCache.js"; -Deno.test("LruCache - keeps only most recent", () => { +it("LruCache - keeps only most recent", () => { const cache = new LruCache({ size: 2 }); cache.set(1, 1); cache.set(2, 2); - assertEquals(cache.get(1), 1); - assertEquals(cache.get(2), 2); + expect(cache.get(1)).toEqual(1); + expect(cache.get(2)).toEqual(2); cache.set(3, 3); - assertEquals(cache.get(1), undefined); - assertEquals(cache.get(3), 3); - assertEquals(cache.get(2), 2); // most recent + expect(cache.get(1)).toEqual(undefined); + expect(cache.get(3)).toEqual(3); + expect(cache.get(2)).toEqual(2); // most recent cache.set(4, 4); - assertEquals(cache.get(3), undefined); - assertEquals(cache.get(2), 2); - assertEquals(cache.get(4), 4); + expect(cache.get(3)).toEqual(undefined); + expect(cache.get(2)).toEqual(2); + expect(cache.get(4)).toEqual(4); // adding the same one over and over shouldn't cause anything cache.set(4, 4); cache.set(4, 4); cache.set(4, 4); - assertEquals(cache.get(4), 4); - assertEquals(cache.get(2), 2); + expect(cache.get(4)).toEqual(4); + expect(cache.get(2)).toEqual(2); cache.set(4, 4); cache.set(5, 5); - assertEquals(cache.get(2), undefined); - assertEquals(cache.get(4), 4); - assertEquals(cache.get(5), 5); + expect(cache.get(2)).toEqual(undefined); + expect(cache.get(4)).toEqual(4); + expect(cache.get(5)).toEqual(5); // now ensure removing works cache.remove(5); - assertEquals(cache.get(5), undefined); + expect(cache.get(5)).toEqual(undefined); cache.set(2, 2); - assertEquals(cache.get(4), 4); - assertEquals(cache.get(2), 2); + expect(cache.get(4)).toEqual(4); + expect(cache.get(2)).toEqual(2); }); -Deno.test("LruCacheWithExpiry - expires values after a time", async () => { +it("LruCacheWithExpiry - expires values after a time", async () => { let currentTime = 0; const cache = new LruCacheWithExpiry({ size: 2, @@ -44,25 +44,25 @@ Deno.test("LruCacheWithExpiry - expires values after a time", async () => { getTime: () => currentTime, }); - assertEquals(await cache.getOrSet(1, () => Promise.resolve(1)), 1); - assertEquals(await cache.getOrSet(1, () => Promise.resolve(2)), 1); + expect(await cache.getOrSet(1, () => Promise.resolve(1))).toEqual(1); + expect(await cache.getOrSet(1, () => Promise.resolve(2))).toEqual(1); currentTime = 100; - assertEquals(await cache.getOrSet(1, () => Promise.resolve(2)), 1); + expect(await cache.getOrSet(1, () => Promise.resolve(2))).toEqual(1); currentTime = 101; - assertEquals(await cache.getOrSet(1, () => Promise.resolve(2)), 2); + expect(await cache.getOrSet(1, () => Promise.resolve(2))).toEqual(2); currentTime = 1000; - assertEquals(await cache.getOrSet(1, () => Promise.resolve(1)), 1); + expect(await cache.getOrSet(1, () => Promise.resolve(1))).toEqual(1); currentTime = 1025; - assertEquals(await cache.getOrSet(2, () => Promise.resolve(2)), 2); + expect(await cache.getOrSet(2, () => Promise.resolve(2))).toEqual(2); currentTime = 1050; - assertEquals(await cache.getOrSet(3, () => Promise.resolve(3)), 3); - assertEquals(await cache.getOrSet(1, () => Promise.resolve(11)), 11); - assertEquals(await cache.getOrSet(3, () => Promise.resolve(13)), 3); - assertEquals(await cache.getOrSet(2, () => Promise.resolve(12)), 12); + expect(await cache.getOrSet(3, () => Promise.resolve(3))).toEqual(3); + expect(await cache.getOrSet(1, () => Promise.resolve(11))).toEqual(11); + expect(await cache.getOrSet(3, () => Promise.resolve(13))).toEqual(3); + expect(await cache.getOrSet(2, () => Promise.resolve(12))).toEqual(12); currentTime = 1150; - assertEquals(await cache.getOrSet(3, () => Promise.resolve(13)), 3); + expect(await cache.getOrSet(3, () => Promise.resolve(13))).toEqual(3); currentTime = 1151; - assertEquals(await cache.getOrSet(3, () => Promise.reject(new Error())), 3); - assertEquals(await cache.getOrSet(3, () => Promise.resolve(13)), 13); + expect(await cache.getOrSet(3, () => Promise.reject(new Error()))).toEqual(3); + expect(await cache.getOrSet(3, () => Promise.resolve(13))).toEqual(13); }); diff --git a/utils/RateLimiter.test.ts b/utils/RateLimiter.test.ts index ee97813..4bbdc8d 100644 --- a/utils/RateLimiter.test.ts +++ b/utils/RateLimiter.test.ts @@ -1,8 +1,8 @@ -import { assert } from "@std/assert"; -import { Clock } from "./clock.ts"; -import { RateLimiter } from "./RateLimiter.ts"; +import { expect, it } from "vitest"; +import { Clock } from "./clock.js"; +import { RateLimiter } from "./RateLimiter.js"; -Deno.test("rate limits", () => { +it("rate limits", () => { let time = 0; const clock: Clock = { getTime() { @@ -14,17 +14,17 @@ Deno.test("rate limits", () => { timeWindowMs: 1000, }); - assert(rateLimiter.isAllowed("127.0.0.1")); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeTruthy(); time += 100; - assert(rateLimiter.isAllowed("127.0.0.1")); - assert(!rateLimiter.isAllowed("127.0.0.1")); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeTruthy(); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeFalsy(); time += 500; - assert(!rateLimiter.isAllowed("127.0.0.1")); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeFalsy(); time += 500; - assert(rateLimiter.isAllowed("127.0.0.1")); - assert(!rateLimiter.isAllowed("127.0.0.1")); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeTruthy(); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeFalsy(); time += 500; - assert(rateLimiter.isAllowed("127.0.0.1")); - assert(!rateLimiter.isAllowed("127.0.0.1")); - assert(rateLimiter.isAllowed("127.0.0.2")); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeTruthy(); + expect(rateLimiter.isAllowed("127.0.0.1")).toBeFalsy(); + expect(rateLimiter.isAllowed("127.0.0.2")).toBeTruthy(); }); diff --git a/utils/RateLimiter.ts b/utils/RateLimiter.ts index 38a8e29..64e16ea 100644 --- a/utils/RateLimiter.ts +++ b/utils/RateLimiter.ts @@ -1,5 +1,5 @@ -import { Clock } from "./clock.ts"; -import { LruCache } from "./LruCache.ts"; +import { Clock } from "./clock.js"; +import { LruCache } from "./LruCache.js"; export interface RateLimiterOptions { limit: number; diff --git a/utils/asyncLazy.test.ts b/utils/asyncLazy.test.ts index 10c3708..4bac170 100644 --- a/utils/asyncLazy.test.ts +++ b/utils/asyncLazy.test.ts @@ -1,18 +1,18 @@ -import { assertEquals, assertRejects } from "@std/assert"; -import { createAsyncLazy } from "./asyncLazy.ts"; +import { expect, it } from "vitest"; +import { createAsyncLazy } from "./asyncLazy.js"; -Deno.test("should create", async () => { +it("should create", async () => { let createdValue = () => Promise.resolve(1); const asyncLazy = createAsyncLazy(() => createdValue()); - assertEquals(await asyncLazy.get(), 1); + expect(await asyncLazy.get()).toEqual(1); createdValue = () => Promise.resolve(2); - assertEquals(await asyncLazy.get(), 1); + expect(await asyncLazy.get()).toEqual(1); }); -Deno.test("should create when throws first time", async () => { +it("should create when throws first time", async () => { let createdValue: () => Promise = () => Promise.reject(new Error()); const asyncLazy = createAsyncLazy(() => createdValue()); - assertRejects(() => asyncLazy.get()); + await expect(asyncLazy.get()).rejects.toThrow(); createdValue = () => Promise.resolve(1); - assertEquals(await asyncLazy.get(), 1); + expect(await asyncLazy.get()).toEqual(1); }); diff --git a/utils/fetchCached.test.ts b/utils/fetchCached.test.ts index de22727..eddb7b2 100644 --- a/utils/fetchCached.test.ts +++ b/utils/fetchCached.test.ts @@ -1,90 +1,79 @@ -import { assertEquals } from "@std/assert"; -import { createFetchCacher } from "./fetchCached.ts"; +import { describe, expect, it } from "vitest"; +import { createFetchCacher } from "./fetchCached.js"; -Deno.test("should error when going above 10mb", { - // not sure why this stopped working on the CI - ignore: !!Deno.env.get("CI"), -}, async (t) => { +describe("fetchCached", () => { let time = 0; const clock = { getTime() { return time; }, }; - const { fetchCached } = createFetchCacher(clock); - await using server = Deno.serve((request) => { - if (request.url.endsWith("large")) { - return new Response(new Uint8Array(11 * 1024 * 1024).buffer, { - status: 200, - }); - } else if (request.url.endsWith("small")) { - return new Response(new Uint8Array(9 * 1024 * 1024).buffer, { - status: 200, - }); + + const mockFetch = (url: string) => { + if (url.endsWith("large")) { + return Promise.resolve(new Response(new Uint8Array(11 * 1024 * 1024), { status: 200 })); + } else if (url.endsWith("small")) { + return Promise.resolve(new Response(new Uint8Array(9 * 1024 * 1024), { status: 200 })); } else { - return new Response("Not found", { - status: 404, - }); + return Promise.resolve(new Response("Not found", { status: 404 })); } - }); + }; - const addr = server.addr.hostname + ":" + server.addr.port; + const { fetchCached } = createFetchCacher(clock, mockFetch); - // large - await t.step("should error going above 10mb", async () => { + it("should error going above 10mb", async () => { const response = await fetchCached({ - url: `http://${addr}/large`, - hostname: server.addr.hostname, + url: "http://test/large", + hostname: "127.0.0.1", }); if (response.kind !== "error") { throw new Error("Expected error."); } - assertEquals(response.response.status, 413); + expect(response.response.status).toEqual(413); }); - // small - await t.step("should not error below 10mb", async () => { + it("should not error below 10mb", async () => { const response = await fetchCached({ - url: `http://${addr}/small`, - hostname: server.addr.hostname, + url: "http://test/small", + hostname: "127.0.0.1", }); if (response.kind !== "success") { - throw new Error("Expected error."); + throw new Error("Expected success."); } - assertEquals(response.body.byteLength, 9 * 1024 * 1024); + expect(response.body.byteLength).toEqual(9 * 1024 * 1024); const response2 = await fetchCached({ - url: `http://${addr}/small`, - hostname: server.addr.hostname, + url: "http://test/small", + hostname: "127.0.0.1", }); if (response.body !== response2.body) { throw new Error("Should have been the same objects."); } }); - await t.step("should error after 20 downloads because of rate limiting", async () => { + it("should error after 20 downloads because of rate limiting", async () => { for (let i = 0; i < 19; i++) { const response = await fetchCached({ - url: `http://${addr}/small`, - hostname: server.addr.hostname, + url: "http://test/small", + hostname: "127.0.0.1", }); - assertEquals(response.kind, "success"); + expect(response.kind).toEqual("success"); } let response = await fetchCached({ - url: `http://${addr}/small`, - hostname: server.addr.hostname, + url: "http://test/small", + hostname: "127.0.0.1", }); if (response.kind !== "error") { throw new Error("Was not error."); } - assertEquals(response.response.status, 429); + expect(response.response.status).toEqual(429); // advance time and it should work again time += 61 * 1000; response = await fetchCached({ - url: `http://${addr}/small`, - hostname: server.addr.hostname, + url: "http://test/small", + hostname: "127.0.0.1", }); - assertEquals(response.kind, "success"); + expect(response.kind).toEqual("success"); }); }); diff --git a/utils/fetchCached.ts b/utils/fetchCached.ts index d4769d6..5b02c6a 100644 --- a/utils/fetchCached.ts +++ b/utils/fetchCached.ts @@ -1,21 +1,22 @@ -import { Clock } from "./clock.ts"; -import { LruCache, LruCacheSet } from "./LruCache.ts"; -import { RateLimiter } from "./RateLimiter.ts"; +import { Clock } from "./clock.js"; +import { LruCache, LruCacheSet } from "./LruCache.js"; +import { RateLimiter } from "./RateLimiter.js"; -const tooLargeResponse = { +const tooLargeResponse = () => ({ kind: "error" as const, response: new Response("Response body exceeds 10MB limit", { status: 413, }), -}; -const tooManyRequestsResponse = { +} as const); +const tooManyRequestsResponse = () => ({ kind: "error" as const, response: new Response("Too many requests", { status: 429, }), -}; +} as const); -export function createFetchCacher(clock: Clock) { +export function createFetchCacher(clock: Clock, fetchFn?: (url: string) => Promise) { + const doFetch = fetchFn ?? ((url: string) => fetch(url)); const directDownloadRateLimiter = new RateLimiter(clock, { limit: 10, timeWindowMs: 5 * 60 * 1_000, @@ -32,10 +33,10 @@ export function createFetchCacher(clock: Clock) { let cachedBody = cache.get(url); if (cachedBody == null) { if (!directDownloadRateLimiter.isAllowed(hostname)) { - return tooManyRequestsResponse; + return tooManyRequestsResponse(); } - const response = await fetch(url); + const response = await doFetch(url); if (!response.ok) { return { kind: "error", @@ -46,7 +47,7 @@ export function createFetchCacher(clock: Clock) { const reader = response.body!.getReader(); let receivedLength = 0; // received that many bytes at the moment - let chunks = []; // array of received binary chunks (comprises the body) + const chunks = []; // array of received binary chunks (comprises the body) while (true) { const { done, value } = await reader.read(); @@ -61,14 +62,14 @@ export function createFetchCacher(clock: Clock) { if (receivedLength > 10 * 1024 * 1024) { reader.cancel(); // stops the reading process tooLargeCache.insert(url); - return tooLargeResponse; + return tooLargeResponse(); } } // Concatenate chunks into single Uint8Array - let chunksAll = new Uint8Array(receivedLength); + const chunksAll = new Uint8Array(receivedLength); let position = 0; - for (let chunk of chunks) { + for (const chunk of chunks) { chunksAll.set(chunk, position); position += chunk.length; } @@ -76,7 +77,7 @@ export function createFetchCacher(clock: Clock) { cachedBody = chunksAll.buffer; cache.set(url, cachedBody); } else if (!cachedRateLimiter.isAllowed(hostname)) { - return tooManyRequestsResponse; + return tooManyRequestsResponse(); } return { kind: "success", diff --git a/utils/github.test.ts b/utils/github.test.ts index 9ab6019..a744a28 100644 --- a/utils/github.test.ts +++ b/utils/github.test.ts @@ -1,14 +1,14 @@ -import { assertEquals } from "@std/assert"; -import { checkGithubRepoExists } from "./github.ts"; +import { expect, it } from "vitest"; +import { checkGithubRepoExists } from "./github.js"; -Deno.test("should get when exists", async () => { +it("should get when exists", async () => { const getResult = () => checkGithubRepoExists("dprint", "dprint"); - assertEquals(await getResult(), true); - assertEquals(await getResult(), true); + expect(await getResult()).toEqual(true); + expect(await getResult()).toEqual(true); }); -Deno.test("should get when not exists", async () => { +it("should get when not exists", async () => { const getResult = () => checkGithubRepoExists("dsherret", "some-random-name"); - assertEquals(await getResult(), false); - assertEquals(await getResult(), false); + expect(await getResult()).toEqual(false); + expect(await getResult()).toEqual(false); }); diff --git a/utils/github.ts b/utils/github.ts index 752719b..edb20b4 100644 --- a/utils/github.ts +++ b/utils/github.ts @@ -1,6 +1,7 @@ -import { LazyExpirableValue } from "./LazyExpirableValue.ts"; -import { LruCache, LruCacheWithExpiry } from "./LruCache.ts"; -import { createSynchronizedActioner } from "./synchronizedActioner.ts"; +import { env } from "cloudflare:workers"; +import { LazyExpirableValue } from "./LazyExpirableValue.js"; +import { LruCache, LruCacheWithExpiry } from "./LruCache.js"; +import { createSynchronizedActioner } from "./synchronizedActioner.js"; const repoExistsCache = new LruCache({ size: 1000 }); @@ -38,11 +39,6 @@ export interface ReleaseInfo { downloadCount: number; } -const latestReleaseTagNameCache = new LruCacheWithExpiry({ - size: 1000, - expiryMs: 5 * 60 * 1_000, // keep entries for 5 minutes -}); - export async function getLatestReleaseInfo(username: string, repoName: string) { const releases = await getReleasesData(username, repoName); const latest = releases?.find((release) => !release.draft && !release.prerelease); @@ -118,7 +114,7 @@ interface GitHubRelease { assets: ReleaseAsset[]; } -const releasesCache = new LruCacheWithExpiry({ +const releasesCache = new LruCacheWithExpiry({ size: 1000, expiryMs: 5 * 60 * 1_000, // keep entries for 5 minutes }); @@ -132,7 +128,7 @@ async function getReleasesData(username: string, repoName: string) { return await releasesCache.getOrSet(url, async () => { const response = await makeGitHubGetRequest(url, "GET"); if (response.status === 404) { - await response.text(); // todo: no way to mark this as used for the sanitizers? + await response.text(); return; } else if (!response.ok) { const text = await response.text(); @@ -142,7 +138,7 @@ async function getReleasesData(username: string, repoName: string) { }); } -const latestCliReleaseInfo = new LazyExpirableValue({ +const latestCliReleaseInfo = new LazyExpirableValue<{ tag_name: string }>({ expiryMs: 10 * 60 * 1_000, // keep for 10 minutes createValue: async () => { const url = `https://api.github.com/repos/dprint/dprint/releases/latest`; @@ -185,8 +181,10 @@ function makeGitHubGetRequest(url: string, method: "GET" | "HEAD") { function getGitHubHeaders() { const headers: Record = { "accept": "application/vnd.github.v3+json", + "user-agent": "dprint-plugins", }; - const token = Deno.env.get("DPRINT_PLUGINS_GH_TOKEN"); + console.log(env); + const token = env.DPRINT_PLUGINS_GH_TOKEN; if (token != null) { headers["authorization"] = "token " + token; } diff --git a/utils/mod.ts b/utils/mod.ts index 408bd9f..0eb338b 100644 --- a/utils/mod.ts +++ b/utils/mod.ts @@ -1,4 +1,4 @@ -export * from "./asyncLazy.ts"; -export * from "./fetchCached.ts"; -export * from "./github.ts"; -export * from "./version.ts"; +export * from "./asyncLazy.js"; +export * from "./fetchCached.js"; +export * from "./github.js"; +export * from "./version.js"; diff --git a/utils/synchronizedActioner.ts b/utils/synchronizedActioner.ts index 82a7bc3..a0982de 100644 --- a/utils/synchronizedActioner.ts +++ b/utils/synchronizedActioner.ts @@ -1,4 +1,4 @@ -import { withTimeout } from "./withTimeout.ts"; +import { withTimeout } from "./withTimeout.js"; /** Creates an object that only lets one action execute at a time. */ export function createSynchronizedActioner() { diff --git a/utils/version.test.ts b/utils/version.test.ts index 0afe366..ae8f093 100644 --- a/utils/version.test.ts +++ b/utils/version.test.ts @@ -1,15 +1,15 @@ -import { assertEquals } from "@std/assert"; -import { parseVersion, Version } from "./version.ts"; +import { expect, it } from "vitest"; +import { parseVersion, Version } from "./version.js"; -Deno.test("should parse version", () => { - assertEquals(parseVersion("12.34.56"), new Version(12, 34, 56)); +it("should parse version", () => { + expect(parseVersion("12.34.56")).toEqual(new Version(12, 34, 56)); }); function runVersionLessThanTest(a: string, b: string, expected: boolean) { - assertEquals(parseVersion(a).lessThan(parseVersion(b)), expected); + expect(parseVersion(a).lessThan(parseVersion(b))).toEqual(expected); } -Deno.test("less than tests", () => { +it("less than tests", () => { runVersionLessThanTest("1.3.5", "1.3.5", false); runVersionLessThanTest("1.3.4", "1.3.5", true); @@ -22,10 +22,10 @@ Deno.test("less than tests", () => { }); function runEqualTest(a: string, b: string, expected: boolean) { - assertEquals(parseVersion(a).equal(parseVersion(b)), expected); + expect(parseVersion(a).equal(parseVersion(b))).toEqual(expected); } -Deno.test("equal tests", () => { +it("equal tests", () => { runEqualTest("1.3.5", "1.3.5", true); runEqualTest("1.3.6", "1.3.5", false); @@ -34,10 +34,10 @@ Deno.test("equal tests", () => { }); function runLessThanEqual(a: string, b: string, expected: boolean) { - assertEquals(parseVersion(a).lessThanEqual(parseVersion(b)), expected); + expect(parseVersion(a).lessThanEqual(parseVersion(b))).toEqual(expected); } -Deno.test("less than equal tests", () => { +it("less than equal tests", () => { runLessThanEqual("1.3.4", "1.3.5", true); runLessThanEqual("1.3.5", "1.3.5", true); runLessThanEqual("1.3.6", "1.3.5", false); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..973627c --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; + +export default defineWorkersConfig({ + test: { + poolOptions: { + workers: { + wrangler: { configPath: "./wrangler.toml" }, + }, + }, + }, +}); diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..9bffdda --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,8 @@ +name = "dprint-plugins" +main = "main.ts" +compatibility_date = "2024-12-01" +compatibility_flags = ["nodejs_compat"] + +rules = [ + { type = "Text", globs = ["**/*.css"] }, +] From 7a2c3164121f153db98d3e2618855a55dd3ff219 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 22:12:20 -0400 Subject: [PATCH 02/10] Switch to serving plugin bytes directly --- .gitignore | 1 + env.d.ts | 1 + handleRequest.test.ts | 189 ++++++++++++++------------------------ handleRequest.ts | 138 +++++++++++++--------------- main.ts | 7 +- utils/fetchCached.test.ts | 79 ---------------- utils/fetchCached.ts | 88 ------------------ utils/github.ts | 1 - utils/mod.ts | 1 - utils/r2Cache.ts | 43 +++++++++ vitest.config.ts | 17 ++-- wrangler.toml | 4 + 12 files changed, 195 insertions(+), 374 deletions(-) delete mode 100644 utils/fetchCached.test.ts delete mode 100644 utils/fetchCached.ts create mode 100644 utils/r2Cache.ts diff --git a/.gitignore b/.gitignore index 4cdbd31..7ee3704 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .claude node_modules +.wrangler \ No newline at end of file diff --git a/env.d.ts b/env.d.ts index eaaac69..8b71a7f 100644 --- a/env.d.ts +++ b/env.d.ts @@ -5,4 +5,5 @@ declare module "*.css" { interface Env { DPRINT_PLUGINS_GH_TOKEN?: string; + PLUGIN_CACHE: R2Bucket; } diff --git a/handleRequest.test.ts b/handleRequest.test.ts index 88eb5af..1524a61 100644 --- a/handleRequest.test.ts +++ b/handleRequest.test.ts @@ -1,9 +1,8 @@ import { expect, it } from "vitest"; -import { createRequestHandler } from "./handleRequest.js"; -import { RealClock } from "./utils/clock.js"; +import { createRequestHandler, resolvePluginOrSchemaUrl } from "./handleRequest.js"; it("should get info.json", async () => { - const { handleRequest } = createRequestHandler(new RealClock()); + const { handleRequest } = createRequestHandler(); const response = await handleRequest( new Request("https://plugins.dprint.dev/info.json"), ); @@ -17,7 +16,7 @@ it("should get info.json", async () => { }); it("should get cli.json", async () => { - const { handleRequest } = createRequestHandler(new RealClock()); + const { handleRequest } = createRequestHandler(); const response = await handleRequest( new Request("https://plugins.dprint.dev/cli.json"), ); @@ -26,314 +25,264 @@ it("should get cli.json", async () => { expect(typeof data.version).toEqual("string"); }); -async function getRedirectUrl(url: string) { - const { handleRequest } = createRequestHandler(new RealClock()); - const response = await handleRequest( - new Request(url), - ); - expect(response.status).toEqual(302); - return response.headers.get("location")!; +async function resolveUrl(url: string) { + return await resolvePluginOrSchemaUrl(new URL(url)); } -it("should get correct info for typescript resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/typescript-${version}.wasm`); - } - +it("should resolve typescript URLs", async () => { expect( - await getWasmRedirectUrl("0.19.4"), + await resolveUrl("https://plugins.dprint.dev/typescript-0.19.4.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.19.4/typescript-0.19.4.wasm", ); expect( - await getWasmRedirectUrl("0.44.0"), + await resolveUrl("https://plugins.dprint.dev/typescript-0.44.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.44.0/typescript-0.44.0.wasm", ); // file name changed here expect( - await getWasmRedirectUrl("0.44.1"), + await resolveUrl("https://plugins.dprint.dev/typescript-0.44.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.44.1/typescript.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/typescript-0.52.1.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/typescript-0.52.1.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.52.1/schema.json", ); // file name changed after this expect( - await getWasmRedirectUrl("0.62.1"), + await resolveUrl("https://plugins.dprint.dev/typescript-0.62.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.62.1/typescript.wasm", ); expect( - await getWasmRedirectUrl("0.62.2"), + await resolveUrl("https://plugins.dprint.dev/typescript-0.62.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/0.62.2/plugin.wasm", ); }); -it("should get correct info for json resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/json-${version}.wasm`); - } - +it("should resolve json URLs", async () => { expect( - await getWasmRedirectUrl("0.4.0"), + await resolveUrl("https://plugins.dprint.dev/json-0.4.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.4.0/json-0.4.0.wasm", ); expect( - await getWasmRedirectUrl("0.10.1"), + await resolveUrl("https://plugins.dprint.dev/json-0.10.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.10.1/json-0.10.1.wasm", ); // file name changed here expect( - await getWasmRedirectUrl("0.10.2"), + await resolveUrl("https://plugins.dprint.dev/json-0.10.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.10.2/json.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/json-0.13.1.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/json-0.13.1.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.13.1/schema.json", ); // file name changed after this expect( - await getWasmRedirectUrl("0.14.0"), + await resolveUrl("https://plugins.dprint.dev/json-0.14.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.14.0/json.wasm", ); expect( - await getWasmRedirectUrl("0.14.1"), + await resolveUrl("https://plugins.dprint.dev/json-0.14.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-json/releases/download/0.14.1/plugin.wasm", ); }); -it("should get correct info for markdown resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/markdown-${version}.wasm`); - } - +it("should resolve markdown URLs", async () => { expect( - await getWasmRedirectUrl("0.1.0"), + await resolveUrl("https://plugins.dprint.dev/markdown-0.1.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.1.0/markdown-0.1.0.wasm", ); expect( - await getWasmRedirectUrl("0.7.0"), + await resolveUrl("https://plugins.dprint.dev/markdown-0.7.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.7.0/markdown-0.7.0.wasm", ); // file name changed here expect( - await getWasmRedirectUrl("0.7.1"), + await resolveUrl("https://plugins.dprint.dev/markdown-0.7.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.7.1/markdown.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/markdown-0.10.0.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/markdown-0.10.0.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.10.0/schema.json", ); // file name changed after this expect( - await getWasmRedirectUrl("0.12.1"), + await resolveUrl("https://plugins.dprint.dev/markdown-0.12.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.12.1/markdown.wasm", ); expect( - await getWasmRedirectUrl("0.12.2"), + await resolveUrl("https://plugins.dprint.dev/markdown-0.12.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-markdown/releases/download/0.12.2/plugin.wasm", ); }); -it("should get correct info for toml resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/toml-${version}.wasm`); - } - +it("should resolve toml URLs", async () => { expect( - await getWasmRedirectUrl("0.1.2"), + await resolveUrl("https://plugins.dprint.dev/toml-0.1.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.1.2/toml.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/toml-0.5.0.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/toml-0.5.0.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.0/schema.json", ); // file name changed after this expect( - await getWasmRedirectUrl("0.5.3"), + await resolveUrl("https://plugins.dprint.dev/toml-0.5.3.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.3/toml.wasm", ); expect( - await getWasmRedirectUrl("0.5.4"), + await resolveUrl("https://plugins.dprint.dev/toml-0.5.4.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-toml/releases/download/0.5.4/plugin.wasm", ); }); -it("should get correct info for dockerfile resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/dockerfile-${version}.wasm`); - } - +it("should resolve dockerfile URLs", async () => { expect( - await getWasmRedirectUrl("0.1.0"), + await resolveUrl("https://plugins.dprint.dev/dockerfile-0.1.0.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.1.0/dockerfile.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/dockerfile-0.1.0.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/dockerfile-0.1.0.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.1.0/schema.json", ); // file name changed after this expect( - await getWasmRedirectUrl("0.2.1"), + await resolveUrl("https://plugins.dprint.dev/dockerfile-0.2.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.2.1/dockerfile.wasm", ); expect( - await getWasmRedirectUrl("0.2.2"), + await resolveUrl("https://plugins.dprint.dev/dockerfile-0.2.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-dockerfile/releases/download/0.2.2/plugin.wasm", ); }); -it("should get correct info for sql resolver", async () => { - function getWasmRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/sql-${version}.wasm`); - } - +it("should resolve sql URLs", async () => { expect( - await getWasmRedirectUrl("0.1.1"), + await resolveUrl("https://plugins.dprint.dev/sql-0.1.1.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.1/sql.wasm", ); expect( - await getRedirectUrl(`https://plugins.dprint.dev/schemas/sql-0.1.1.json`), + await resolveUrl("https://plugins.dprint.dev/schemas/sql-0.1.1.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.1/schema.json", ); // file name changed here expect( - await getWasmRedirectUrl("0.1.2"), + await resolveUrl("https://plugins.dprint.dev/sql-0.1.2.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-sql/releases/download/0.1.2/plugin.wasm", ); }); -it("should get correct info for prettier resolver", async () => { - function getProcessPluginRedirectUrl(version: string, ext = "json") { - return getRedirectUrl(`https://plugins.dprint.dev/prettier-${version}.${ext}`); - } - +it("should resolve prettier URLs", async () => { // file name changed after this expect( - await getProcessPluginRedirectUrl("0.5.0", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/prettier-0.5.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.5.0/prettier.exe-plugin", ); expect( - await getProcessPluginRedirectUrl("0.5.1", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/prettier-0.5.1.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.5.1/plugin.exe-plugin", ); - // and changed again here expect( - await getProcessPluginRedirectUrl("0.6.2", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/prettier-0.6.2.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.6.2/plugin.exe-plugin", ); expect( - await getProcessPluginRedirectUrl("0.7.0"), + await resolveUrl("https://plugins.dprint.dev/prettier-0.7.0.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.7.0/plugin.json", ); }); -it("should get correct info for roslyn resolver", async () => { - function getProcessPluginRedirectUrl(version: string, ext = "json") { - return getRedirectUrl(`https://plugins.dprint.dev/roslyn-${version}.${ext}`); - } - +it("should resolve roslyn URLs", async () => { // file name changed after this expect( - await getProcessPluginRedirectUrl("0.4.0", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/roslyn-0.4.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.4.0/roslyn.exe-plugin", ); expect( - await getProcessPluginRedirectUrl("0.5.0", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/roslyn-0.5.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.5.0/plugin.exe-plugin", ); // and again here expect( - await getProcessPluginRedirectUrl("0.6.4"), + await resolveUrl("https://plugins.dprint.dev/roslyn-0.6.4.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-roslyn/releases/download/0.6.4/plugin.json", ); }); -it("should get correct info for rustfmt resolver", async () => { - function getProcessPluginRedirectUrl(version: string, ext = "json") { - return getRedirectUrl(`https://plugins.dprint.dev/rustfmt-${version}.${ext}`); - } - +it("should resolve rustfmt URLs", async () => { // file name changed after this expect( - await getProcessPluginRedirectUrl("0.4.0", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/rustfmt-0.4.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.4.0/rustfmt.exe-plugin", ); expect( - await getProcessPluginRedirectUrl("0.5.1", "exe-plugin"), + await resolveUrl("https://plugins.dprint.dev/rustfmt-0.5.1.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.5.1/plugin.exe-plugin", ); // and again here expect( - await getProcessPluginRedirectUrl("0.6.2"), + await resolveUrl("https://plugins.dprint.dev/rustfmt-0.6.2.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-rustfmt/releases/download/0.6.2/plugin.json", ); }); -it("should get correct info for yapf resolver", async () => { - function getProcessPluginRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/yapf-${version}.exe-plugin`); - } - +it("should resolve yapf URLs", async () => { // file name changed after this expect( - await getProcessPluginRedirectUrl("0.2.0"), + await resolveUrl("https://plugins.dprint.dev/yapf-0.2.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-yapf/releases/download/0.2.0/yapf.exe-plugin", ); expect( - await getProcessPluginRedirectUrl("0.2.1"), + await resolveUrl("https://plugins.dprint.dev/yapf-0.2.1.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-yapf/releases/download/0.2.1/plugin.exe-plugin", ); }); -it("should get correct info for exec resolver", async () => { - function getProcessPluginRedirectUrl(version: string) { - return getRedirectUrl(`https://plugins.dprint.dev/exec-${version}.exe-plugin`); - } - +it("should resolve exec URLs", async () => { expect( - await getProcessPluginRedirectUrl("0.1.0"), + await resolveUrl("https://plugins.dprint.dev/exec-0.1.0.exe-plugin"), ).toEqual( "https://github.com/dprint/dprint-plugin-exec/releases/download/0.1.0/plugin.exe-plugin", ); @@ -341,37 +290,37 @@ it("should get correct info for exec resolver", async () => { it("tryResolvePluginUrl", async () => { expect( - await getRedirectUrl("https://plugins.dprint.dev/typescript-1.2.3.wasm"), + await resolveUrl("https://plugins.dprint.dev/typescript-1.2.3.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/typescript-1.2.3.wasm"), + await resolveUrl("https://plugins.dprint.dev/dprint/typescript-1.2.3.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-1.2.3.wasm"), + await resolveUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-1.2.3.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/plugin.wasm", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-latest.wasm"), + await resolveUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript-latest.wasm"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/latest/download/plugin.wasm", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-exec-0.3.0.json"), + await resolveUrl("https://plugins.dprint.dev/dprint/dprint-plugin-exec-0.3.0.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-exec/releases/download/0.3.0/plugin.json", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools-0.1.0.wasm"), + await resolveUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools-0.1.0.wasm"), ).toEqual( "https://github.com/lucacasonato/mf2-tools/releases/download/0.1.0/dprint-plugin-mf2.wasm", ); @@ -381,31 +330,31 @@ it("tryResolvePluginUrl", async () => { it("tryResolveSchemaUrl", async () => { expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/typescript/1.2.3/schema.json"), + await resolveUrl("https://plugins.dprint.dev/dprint/typescript/1.2.3/schema.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/schema.json", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/1.2.3/schema.json"), + await resolveUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/1.2.3/schema.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/download/1.2.3/schema.json", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/latest/schema.json"), + await resolveUrl("https://plugins.dprint.dev/dprint/dprint-plugin-typescript/latest/schema.json"), ).toEqual( "https://github.com/dprint/dprint-plugin-typescript/releases/latest/download/schema.json", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/dprint/non-existent/1.2.3/schema.json"), + await resolveUrl("https://plugins.dprint.dev/dprint/non-existent/1.2.3/schema.json"), ).toEqual( "https://github.com/dprint/non-existent/releases/download/1.2.3/schema.json", ); expect( - await getRedirectUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools/0.1.0/schema.json"), + await resolveUrl("https://plugins.dprint.dev/lucacasonato/mf2-tools/0.1.0/schema.json"), ).toEqual( "https://github.com/lucacasonato/mf2-tools/releases/download/0.1.0/dprint-plugin-mf2.schema.json", ); diff --git a/handleRequest.ts b/handleRequest.ts index ae9b6c9..d94a5bb 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -3,8 +3,11 @@ import oldMappings from "./old_redirects.json" with { type: "json" }; import { tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.js"; import { readInfoFile } from "./readInfoFile.js"; import styleCSS from "./style.css"; -import { Clock } from "./utils/clock.js"; -import { createFetchCacher, getCliInfo } from "./utils/mod.js"; +import { LruCache } from "./utils/LruCache.js"; +import { getCliInfo } from "./utils/mod.js"; +import { r2Get, r2Put } from "./utils/r2Cache.js"; + +const MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB const contentTypes = { css: "text/css; charset=utf-8", @@ -14,24 +17,19 @@ const contentTypes = { wasm: "application/wasm", }; -export function createRequestHandler(clock: Clock) { - const { fetchCached } = createFetchCacher(clock); +export function createRequestHandler() { + const memoryCache = new LruCache({ size: 50 }); return { - async handleRequest(request: Request) { + async handleRequest(request: Request, ctx?: ExecutionContext) { const url = new URL(request.url); - const newUrl = await resolvePluginOrSchemaUrl(url); - if (newUrl != null) { - const contentType = newUrl.endsWith(".json") + const githubUrl = await resolvePluginOrSchemaUrl(url); + if (githubUrl != null) { + const contentType = githubUrl.endsWith(".json") || githubUrl.endsWith(".exe-plugin") ? contentTypes.json - : newUrl.endsWith(".wasm") + : githubUrl.endsWith(".wasm") ? contentTypes.wasm : contentTypes.plain; - return handleConditionalRedirectRequest({ - request, - url: newUrl, - contentType, - hostname: request.headers.get("CF-Connecting-IP") ?? "unknown", - }); + return servePlugin(request, githubUrl, contentType, ctx); } const userLatestInfo = await tryResolveLatestJson(url); @@ -92,43 +90,64 @@ export function createRequestHandler(clock: Clock) { }, }; - // This is done to allow the playground to access these files - function handleConditionalRedirectRequest(params: { - request: Request; - url: string; - contentType: string; - hostname: string; - }) { - if (shouldDirectlyServeFile(params.request)) { - return fetchCached(params) - .then((result) => { - if (result.kind === "error") { - return result.response; - } - - return new Response(result.body, { - headers: { - "content-type": params.contentType, - // allow the playground to download this - "Access-Control-Allow-Origin": getAccessControlAllowOrigin( - params.request, - ), - }, - status: 200, - }); - }).catch((err) => { - console.error(err); - return new Response("Internal Server Error", { - status: 500, - }); - }); + async function servePlugin(request: Request, githubUrl: string, contentType: string, ctx?: ExecutionContext) { + try { + const body = await resolveBody(githubUrl, contentType, ctx); + return new Response(body, { + headers: { + "content-type": contentType, + "Access-Control-Allow-Origin": getAccessControlAllowOrigin(request), + }, + status: 200, + }); + } catch (err) { + console.error("Error serving plugin:", err); + return new Response("Internal Server Error", { status: 500 }); + } + } + + async function resolveBody(githubUrl: string, contentType: string, ctx?: ExecutionContext): Promise { + // L1: in-memory cache + const cached = memoryCache.get(githubUrl); + if (cached != null) { + return cached; + } + + // L2: R2 + const r2Body = await r2Get(githubUrl); + if (r2Body != null) { + if (r2Body.byteLength <= MAX_BODY_SIZE) { + memoryCache.set(githubUrl, r2Body); + } + return r2Body; + } + + // L3: fetch from GitHub + const response = await fetch(githubUrl, { + headers: { "user-agent": "dprint-plugins" }, + }); + if (!response.ok) { + throw new Error(`GitHub fetch failed: ${response.status} ${response.statusText}`); + } + + const body = await response.arrayBuffer(); + + // populate caches + const r2Promise = r2Put(githubUrl, body, contentType); + if (ctx != null) { + ctx.waitUntil(r2Promise); } else { - return createRedirectResponse(params.url); + await r2Promise; } + if (body.byteLength <= MAX_BODY_SIZE) { + memoryCache.set(githubUrl, body); + } + + return body; } } -async function resolvePluginOrSchemaUrl(url: URL) { +export async function resolvePluginOrSchemaUrl(url: URL) { return (oldMappings as { [oldUrl: string]: string })[url.toString()] ?? await tryResolvePluginUrl(url) ?? await tryResolveSchemaUrl(url); @@ -145,35 +164,10 @@ function isLocalHostname(hostname: string) { return hostname === "localhost" || hostname === "127.0.0.1"; } -function shouldDirectlyServeFile(request: Request) { - // directly serve for when Deno makes a request in order to fix the content type - if (request.headers.get("user-agent")?.startsWith("Deno/")) { - return true; - } - - const origin = request.headers.get("origin"); - if (origin == null) { - return false; - } - - const hostname = new URL(origin).hostname; - return isLocalHostname(hostname) || hostname === "dprint.dev"; -} - -function createRedirectResponse(location: string) { - return new Response(null, { - headers: { - location, - }, - status: 302, // temporary redirect - }); -} - function createJsonResponse(text: string, request: Request) { return new Response(text, { headers: { "content-type": contentTypes.json, - // allow the dprint website to download this file "Access-Control-Allow-Origin": getAccessControlAllowOrigin(request), }, status: 200, diff --git a/main.ts b/main.ts index 6e4bf3f..9bd0337 100644 --- a/main.ts +++ b/main.ts @@ -1,10 +1,9 @@ import { createRequestHandler } from "./handleRequest.js"; -import { RealClock } from "./utils/clock.js"; -const { handleRequest } = createRequestHandler(new RealClock()); +const { handleRequest } = createRequestHandler(); export default { - fetch(request: Request) { - return handleRequest(request); + fetch(request: Request, env: unknown, ctx: ExecutionContext) { + return handleRequest(request, ctx); }, }; diff --git a/utils/fetchCached.test.ts b/utils/fetchCached.test.ts deleted file mode 100644 index eddb7b2..0000000 --- a/utils/fetchCached.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { createFetchCacher } from "./fetchCached.js"; - -describe("fetchCached", () => { - let time = 0; - const clock = { - getTime() { - return time; - }, - }; - - const mockFetch = (url: string) => { - if (url.endsWith("large")) { - return Promise.resolve(new Response(new Uint8Array(11 * 1024 * 1024), { status: 200 })); - } else if (url.endsWith("small")) { - return Promise.resolve(new Response(new Uint8Array(9 * 1024 * 1024), { status: 200 })); - } else { - return Promise.resolve(new Response("Not found", { status: 404 })); - } - }; - - const { fetchCached } = createFetchCacher(clock, mockFetch); - - it("should error going above 10mb", async () => { - const response = await fetchCached({ - url: "http://test/large", - hostname: "127.0.0.1", - }); - if (response.kind !== "error") { - throw new Error("Expected error."); - } - expect(response.response.status).toEqual(413); - }); - - it("should not error below 10mb", async () => { - const response = await fetchCached({ - url: "http://test/small", - hostname: "127.0.0.1", - }); - if (response.kind !== "success") { - throw new Error("Expected success."); - } - expect(response.body.byteLength).toEqual(9 * 1024 * 1024); - - const response2 = await fetchCached({ - url: "http://test/small", - hostname: "127.0.0.1", - }); - if (response.body !== response2.body) { - throw new Error("Should have been the same objects."); - } - }); - - it("should error after 20 downloads because of rate limiting", async () => { - for (let i = 0; i < 19; i++) { - const response = await fetchCached({ - url: "http://test/small", - hostname: "127.0.0.1", - }); - expect(response.kind).toEqual("success"); - } - - let response = await fetchCached({ - url: "http://test/small", - hostname: "127.0.0.1", - }); - if (response.kind !== "error") { - throw new Error("Was not error."); - } - expect(response.response.status).toEqual(429); - // advance time and it should work again - time += 61 * 1000; - response = await fetchCached({ - url: "http://test/small", - hostname: "127.0.0.1", - }); - expect(response.kind).toEqual("success"); - }); -}); diff --git a/utils/fetchCached.ts b/utils/fetchCached.ts deleted file mode 100644 index 5b02c6a..0000000 --- a/utils/fetchCached.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Clock } from "./clock.js"; -import { LruCache, LruCacheSet } from "./LruCache.js"; -import { RateLimiter } from "./RateLimiter.js"; - -const tooLargeResponse = () => ({ - kind: "error" as const, - response: new Response("Response body exceeds 10MB limit", { - status: 413, - }), -} as const); -const tooManyRequestsResponse = () => ({ - kind: "error" as const, - response: new Response("Too many requests", { - status: 429, - }), -} as const); - -export function createFetchCacher(clock: Clock, fetchFn?: (url: string) => Promise) { - const doFetch = fetchFn ?? ((url: string) => fetch(url)); - const directDownloadRateLimiter = new RateLimiter(clock, { - limit: 10, - timeWindowMs: 5 * 60 * 1_000, - }); - const cachedRateLimiter = new RateLimiter(clock, { - limit: 20, - timeWindowMs: 60 * 1_000, - }); - const cache = new LruCache({ size: 50 }); - const tooLargeCache = new LruCacheSet({ size: 1000 }); - - return { - async fetchCached({ url, hostname }: { url: string; hostname: string }) { - let cachedBody = cache.get(url); - if (cachedBody == null) { - if (!directDownloadRateLimiter.isAllowed(hostname)) { - return tooManyRequestsResponse(); - } - - const response = await doFetch(url); - if (!response.ok) { - return { - kind: "error", - response, - } as const; - } - - const reader = response.body!.getReader(); - - let receivedLength = 0; // received that many bytes at the moment - const chunks = []; // array of received binary chunks (comprises the body) - while (true) { - const { done, value } = await reader.read(); - - if (done) { - break; - } - - chunks.push(value); - receivedLength += value.length; - - // Check if the received length is greater than 10MB - if (receivedLength > 10 * 1024 * 1024) { - reader.cancel(); // stops the reading process - tooLargeCache.insert(url); - return tooLargeResponse(); - } - } - - // Concatenate chunks into single Uint8Array - const chunksAll = new Uint8Array(receivedLength); - let position = 0; - for (const chunk of chunks) { - chunksAll.set(chunk, position); - position += chunk.length; - } - - cachedBody = chunksAll.buffer; - cache.set(url, cachedBody); - } else if (!cachedRateLimiter.isAllowed(hostname)) { - return tooManyRequestsResponse(); - } - return { - kind: "success", - body: cachedBody, - } as const; - }, - }; -} diff --git a/utils/github.ts b/utils/github.ts index edb20b4..3ed753f 100644 --- a/utils/github.ts +++ b/utils/github.ts @@ -183,7 +183,6 @@ function getGitHubHeaders() { "accept": "application/vnd.github.v3+json", "user-agent": "dprint-plugins", }; - console.log(env); const token = env.DPRINT_PLUGINS_GH_TOKEN; if (token != null) { headers["authorization"] = "token " + token; diff --git a/utils/mod.ts b/utils/mod.ts index 0eb338b..e48b202 100644 --- a/utils/mod.ts +++ b/utils/mod.ts @@ -1,4 +1,3 @@ export * from "./asyncLazy.js"; -export * from "./fetchCached.js"; export * from "./github.js"; export * from "./version.js"; diff --git a/utils/r2Cache.ts b/utils/r2Cache.ts new file mode 100644 index 0000000..debbdfc --- /dev/null +++ b/utils/r2Cache.ts @@ -0,0 +1,43 @@ +import { env } from "cloudflare:workers"; + +const GITHUB_PREFIX = "https://github.com/"; + +function toR2Key(githubUrl: string) { + if (githubUrl.startsWith(GITHUB_PREFIX)) { + return githubUrl.slice(GITHUB_PREFIX.length); + } + return githubUrl; +} + +function isLatestUrl(githubUrl: string) { + return githubUrl.includes("/releases/latest/"); +} + +export async function r2Get(githubUrl: string): Promise { + if (isLatestUrl(githubUrl)) { + return null; + } + try { + const object = await env.PLUGIN_CACHE.get(toR2Key(githubUrl)); + if (object == null) { + return null; + } + return await object.arrayBuffer(); + } catch (err) { + console.error("R2 get error:", err); + return null; + } +} + +export async function r2Put(githubUrl: string, body: ArrayBuffer, contentType: string): Promise { + if (isLatestUrl(githubUrl)) { + return; + } + try { + await env.PLUGIN_CACHE.put(toR2Key(githubUrl), body, { + httpMetadata: { contentType }, + }); + } catch (err) { + console.error("R2 put error:", err); + } +} diff --git a/vitest.config.ts b/vitest.config.ts index 973627c..b6c748a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,11 +1,10 @@ -import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; +import { cloudflareTest } from "@cloudflare/vitest-pool-workers"; +import { defineConfig } from "vitest/config"; -export default defineWorkersConfig({ - test: { - poolOptions: { - workers: { - wrangler: { configPath: "./wrangler.toml" }, - }, - }, - }, +export default defineConfig({ + plugins: [ + cloudflareTest({ + wrangler: { configPath: "./wrangler.toml" }, + }), + ], }); diff --git a/wrangler.toml b/wrangler.toml index 9bffdda..7e05808 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -6,3 +6,7 @@ compatibility_flags = ["nodejs_compat"] rules = [ { type = "Text", globs = ["**/*.css"] }, ] + +[[r2_buckets]] +binding = "PLUGIN_CACHE" +bucket_name = "dprint-plugin-cache" From 37f05fef38872a1cc4bb3229c16d03bf4e84be67 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 22:55:25 -0400 Subject: [PATCH 03/10] Support assets and hardcode more repo names for better perf --- .gitignore | 3 ++- README.md | 20 ++++++++++++-- handleRequest.ts | 8 +++++- plugins.test.ts | 37 +++++++++++++++++++++++++- plugins.ts | 68 ++++++++++++++++++++++++++++++++++++++++++++++-- wrangler.toml | 2 +- 6 files changed, 130 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 7ee3704..abf6dbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .claude node_modules -.wrangler \ No newline at end of file +.wrangler +.dev.vars \ No newline at end of file diff --git a/README.md b/README.md index 3157d85..c5efd4e 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Website for [https://plugins.dprint.dev](https://plugins.dprint.dev). -This website is hosted on Cloudflare. I really dislike how that makes the code, but Cloudflare has free bandwidth, which is important for this project. - ## Redirect to Any GitHub Repo (For Plugin Authors) This service provides a convenient URL for a plugin stored in any GitHub repo. @@ -28,6 +26,24 @@ Restrictions and recommendations: If your repo name is in the format `dprint-plugin-` then you can omit `dprint-plugin-` in the `` for the redirect (ex. `https://plugins.dprint.dev//dprint-plugin-typescript-0.0.0.wasm` may be shortened to `https://plugins.dprint.dev//typescript-0.0.0.wasm`). +## Release Assets + +For approved repositories, individual release assets can be served directly via: + +``` +https://plugins.dprint.dev////asset/ +``` + +For example: + +``` +https://plugins.dprint.dev/dprint/dprint-plugin-prettier/0.67.0/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip +``` + +This is useful for process plugins that distribute platform-specific binaries. Assets are cached in R2 for persistence. + +Note: To get approved, open a PR to this repository including your username and plugin repo. + ## Run Locally ```bash diff --git a/handleRequest.ts b/handleRequest.ts index d94a5bb..bce2723 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -1,6 +1,6 @@ import { renderHome } from "./home.jsx"; import oldMappings from "./old_redirects.json" with { type: "json" }; -import { tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.js"; +import { tryResolveAssetUrl, tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.js"; import { readInfoFile } from "./readInfoFile.js"; import styleCSS from "./style.css"; import { LruCache } from "./utils/LruCache.js"; @@ -15,6 +15,7 @@ const contentTypes = { json: "application/json; charset=utf-8", plain: "text/plain; charset=utf-8", wasm: "application/wasm", + octetStream: "application/octet-stream", }; export function createRequestHandler() { @@ -22,6 +23,11 @@ export function createRequestHandler() { return { async handleRequest(request: Request, ctx?: ExecutionContext) { const url = new URL(request.url); + const assetUrl = tryResolveAssetUrl(url); + if (assetUrl != null) { + return servePlugin(request, assetUrl, contentTypes.octetStream, ctx); + } + const githubUrl = await resolvePluginOrSchemaUrl(url); if (githubUrl != null) { const contentType = githubUrl.endsWith(".json") || githubUrl.endsWith(".exe-plugin") diff --git a/plugins.test.ts b/plugins.test.ts index 615a002..2962fe4 100644 --- a/plugins.test.ts +++ b/plugins.test.ts @@ -1,7 +1,42 @@ import { expect, it } from "vitest"; -import { tryResolveLatestJson } from "./plugins.js"; +import { tryResolveAssetUrl, tryResolveLatestJson } from "./plugins.js"; import { getLatestReleaseInfo } from "./utils/github.js"; +function resolveAsset(url: string) { + return tryResolveAssetUrl(new URL(url)); +} + +it("tryResolveAssetUrl", () => { + // allowed repo + expect( + resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-prettier/0.67.0/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip"), + ).toEqual( + "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.67.0/dprint-plugin-prettier-x86_64-apple-darwin.zip", + ); + + // latest tag is not allowed + expect( + resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-prettier/latest/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip"), + ).toEqual(undefined); + + // different repo in dprint org also works + expect( + resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-exec/0.5.0/asset/some-binary.zip"), + ).toEqual( + "https://github.com/dprint/dprint-plugin-exec/releases/download/0.5.0/some-binary.zip", + ); + + // org not on allow list + expect( + resolveAsset("https://plugins.dprint.dev/someone/some-repo/0.1.0/asset/file.zip"), + ).toEqual(undefined); + + // non-matching URL + expect( + resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-prettier/0.67.0/file.zip"), + ).toEqual(undefined); +}); + it("tryResolveUserLatestJson", async () => { // non-matching expect( diff --git a/plugins.ts b/plugins.ts index d38eb0d..ce9f239 100644 --- a/plugins.ts +++ b/plugins.ts @@ -22,6 +22,68 @@ const userSchemaPattern = new URLPattern({ pathname: `/${userRepoPattern}/${tagPattern}/schema.json`, }); +// known repos where shortname resolves to dprint-plugin-, +// avoiding a GitHub API call to check existence +const KNOWN_DPRINT_PLUGIN_REPOS = new Set([ + // dprint org + "dprint/dprint-plugin-typescript", + "dprint/dprint-plugin-json", + "dprint/dprint-plugin-markdown", + "dprint/dprint-plugin-toml", + "dprint/dprint-plugin-dockerfile", + "dprint/dprint-plugin-biome", + "dprint/dprint-plugin-oxc", + "dprint/dprint-plugin-mago", + "dprint/dprint-plugin-ruff", + "dprint/dprint-plugin-jupyter", + "dprint/dprint-plugin-prettier", + "dprint/dprint-plugin-roslyn", + "dprint/dprint-plugin-rustfmt", + "dprint/dprint-plugin-yapf", + "dprint/dprint-plugin-exec", + "dprint/dprint-plugin-sql", + // community + "jakebailey/dprint-plugin-gofumpt", + "malobre/dprint-plugin-vue", +]); + +// repos where the short name IS the repo name (no dprint-plugin- prefix) +const KNOWN_NON_PREFIXED_REPOS = new Set([ + "g-plane/malva", + "g-plane/markup_fmt", + "g-plane/pretty_yaml", + "g-plane/pretty_graphql", + "lucacasonato/mf2-tools", +]); + +// orgs/users allowed to serve release assets directly +const ASSET_ALLOWED_ORGS = new Set([ + "dprint", +]); + +const assetNamePattern = "([A-Za-z0-9\\-\\._]+)"; +const assetPattern = new URLPattern({ + pathname: `/${userRepoPattern}/${tagPattern}/asset/${assetNamePattern}`, +}); + +export function tryResolveAssetUrl(url: URL) { + const result = assetPattern.exec(url); + if (!result) { + return undefined; + } + const username = result.pathname.groups[0]!; + const repo = result.pathname.groups[1]!; + if (!ASSET_ALLOWED_ORGS.has(username)) { + return undefined; + } + const tag = result.pathname.groups[2]!; + if (tag === "latest") { + return undefined; + } + const assetName = result.pathname.groups[3]!; + return `https://github.com/${username}/${repo}/releases/download/${tag}/${assetName}`; +} + export async function tryResolvePluginUrl(url: URL) { return dprintPluginTagPatternMapper(dprintWasmPluginPattern, url, "plugin.wasm") ?? dprintPluginTagPatternMapper(dprintProcessPluginPattern, url, "plugin.json") @@ -132,8 +194,10 @@ async function getFullRepoName(username: string, repoName: string) { return repoName; } const fullName = `dprint-plugin-${repoName}`; - // todo: hardcode more repos here - if (username === "jakebailey" && fullName === "dprint-plugin-gofumpt") { + if (KNOWN_NON_PREFIXED_REPOS.has(`${username}/${repoName}`)) { + return repoName; + } + if (KNOWN_DPRINT_PLUGIN_REPOS.has(`${username}/${fullName}`)) { return fullName; } if (await checkGithubRepoExists(username, fullName)) { diff --git a/wrangler.toml b/wrangler.toml index 7e05808..38b4ce2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,6 +1,6 @@ name = "dprint-plugins" main = "main.ts" -compatibility_date = "2024-12-01" +compatibility_date = "2024-02-24" compatibility_flags = ["nodejs_compat"] rules = [ From d526981ffcf56a073c93b2f7f91716b875f984e2 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 22:58:35 -0400 Subject: [PATCH 04/10] add --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a6d489..006cc9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,7 @@ jobs: permissions: contents: read + id-token: write steps: - uses: actions/checkout@v4 From 95cdc15766c7df03eb57e68c8e53db7799fcb51c Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 22:58:58 -0400 Subject: [PATCH 05/10] remove env --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 006cc9f..878f62c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,3 @@ jobs: - name: Deploy to Cloudflare Workers if: github.ref == 'refs/heads/main' run: npx wrangler deploy - env: - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} From 62418470c5e0084c7524b78a19509c03a5079720 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 23:00:39 -0400 Subject: [PATCH 06/10] update --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 878f62c..def6e58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,4 +17,4 @@ jobs: run: npx vitest run - name: Deploy to Cloudflare Workers if: github.ref == 'refs/heads/main' - run: npx wrangler deploy + uses: cloudflare/wrangler-action@v3 From b23a1efdf1ada491250a615b745d1ac356337185 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 24 Mar 2026 23:01:03 -0400 Subject: [PATCH 07/10] format --- .gitignore | 2 +- plugins.test.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index abf6dbb..188edee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .claude node_modules .wrangler -.dev.vars \ No newline at end of file +.dev.vars diff --git a/plugins.test.ts b/plugins.test.ts index 2962fe4..5c4cc01 100644 --- a/plugins.test.ts +++ b/plugins.test.ts @@ -9,14 +9,18 @@ function resolveAsset(url: string) { it("tryResolveAssetUrl", () => { // allowed repo expect( - resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-prettier/0.67.0/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip"), + resolveAsset( + "https://plugins.dprint.dev/dprint/dprint-plugin-prettier/0.67.0/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip", + ), ).toEqual( "https://github.com/dprint/dprint-plugin-prettier/releases/download/0.67.0/dprint-plugin-prettier-x86_64-apple-darwin.zip", ); // latest tag is not allowed expect( - resolveAsset("https://plugins.dprint.dev/dprint/dprint-plugin-prettier/latest/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip"), + resolveAsset( + "https://plugins.dprint.dev/dprint/dprint-plugin-prettier/latest/asset/dprint-plugin-prettier-x86_64-apple-darwin.zip", + ), ).toEqual(undefined); // different repo in dprint org also works From 56f0a1c700065eb718e0ccfc68a9ec2e13b7f508 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 25 Mar 2026 09:03:38 -0400 Subject: [PATCH 08/10] serve r2 body directly when large --- handleRequest.ts | 16 ++++++++++------ utils/r2Cache.ts | 8 ++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/handleRequest.ts b/handleRequest.ts index bce2723..df45851 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -112,7 +112,7 @@ export function createRequestHandler() { } } - async function resolveBody(githubUrl: string, contentType: string, ctx?: ExecutionContext): Promise { + async function resolveBody(githubUrl: string, contentType: string, ctx?: ExecutionContext): Promise { // L1: in-memory cache const cached = memoryCache.get(githubUrl); if (cached != null) { @@ -120,12 +120,16 @@ export function createRequestHandler() { } // L2: R2 - const r2Body = await r2Get(githubUrl); - if (r2Body != null) { - if (r2Body.byteLength <= MAX_BODY_SIZE) { - memoryCache.set(githubUrl, r2Body); + const r2Object = await r2Get(githubUrl); + if (r2Object != null) { + // small enough for L1 — buffer and cache + if (r2Object.size <= MAX_BODY_SIZE) { + const buffer = await r2Object.arrayBuffer(); + memoryCache.set(githubUrl, buffer); + return buffer; } - return r2Body; + // large — stream directly without buffering + return r2Object.body; } // L3: fetch from GitHub diff --git a/utils/r2Cache.ts b/utils/r2Cache.ts index debbdfc..66e019c 100644 --- a/utils/r2Cache.ts +++ b/utils/r2Cache.ts @@ -13,16 +13,12 @@ function isLatestUrl(githubUrl: string) { return githubUrl.includes("/releases/latest/"); } -export async function r2Get(githubUrl: string): Promise { +export async function r2Get(githubUrl: string): Promise { if (isLatestUrl(githubUrl)) { return null; } try { - const object = await env.PLUGIN_CACHE.get(toR2Key(githubUrl)); - if (object == null) { - return null; - } - return await object.arrayBuffer(); + return await env.PLUGIN_CACHE.get(toR2Key(githubUrl)); } catch (err) { console.error("R2 get error:", err); return null; From ef7d07bdb7835c477bf1e4e2c26df83e0f4df036 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 25 Mar 2026 09:04:09 -0400 Subject: [PATCH 09/10] update name --- handleRequest.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/handleRequest.ts b/handleRequest.ts index df45851..b46b2e2 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -7,7 +7,7 @@ import { LruCache } from "./utils/LruCache.js"; import { getCliInfo } from "./utils/mod.js"; import { r2Get, r2Put } from "./utils/r2Cache.js"; -const MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB +const MAX_MEM_CACHE_BODY_SIZE = 10 * 1024 * 1024; // 10MB const contentTypes = { css: "text/css; charset=utf-8", @@ -112,7 +112,11 @@ export function createRequestHandler() { } } - async function resolveBody(githubUrl: string, contentType: string, ctx?: ExecutionContext): Promise { + async function resolveBody( + githubUrl: string, + contentType: string, + ctx?: ExecutionContext, + ): Promise { // L1: in-memory cache const cached = memoryCache.get(githubUrl); if (cached != null) { @@ -123,7 +127,7 @@ export function createRequestHandler() { const r2Object = await r2Get(githubUrl); if (r2Object != null) { // small enough for L1 — buffer and cache - if (r2Object.size <= MAX_BODY_SIZE) { + if (r2Object.size <= MAX_MEM_CACHE_BODY_SIZE) { const buffer = await r2Object.arrayBuffer(); memoryCache.set(githubUrl, buffer); return buffer; @@ -149,7 +153,7 @@ export function createRequestHandler() { } else { await r2Promise; } - if (body.byteLength <= MAX_BODY_SIZE) { + if (body.byteLength <= MAX_MEM_CACHE_BODY_SIZE) { memoryCache.set(githubUrl, body); } From d2e5021916d91a88f14370517ecdfe09e2a73171 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 25 Mar 2026 09:55:59 -0400 Subject: [PATCH 10/10] update --- env.d.ts | 5 + handleRequest.ts | 8 + output.txt | 1462 ---------------------------------------------- robots.txt | 3 + wrangler.toml | 2 +- 5 files changed, 17 insertions(+), 1463 deletions(-) delete mode 100644 output.txt create mode 100644 robots.txt diff --git a/env.d.ts b/env.d.ts index 8b71a7f..cc6cba3 100644 --- a/env.d.ts +++ b/env.d.ts @@ -3,6 +3,11 @@ declare module "*.css" { export default content; } +declare module "*.txt" { + const content: string; + export default content; +} + interface Env { DPRINT_PLUGINS_GH_TOKEN?: string; PLUGIN_CACHE: R2Bucket; diff --git a/handleRequest.ts b/handleRequest.ts index b46b2e2..a1e712d 100644 --- a/handleRequest.ts +++ b/handleRequest.ts @@ -2,6 +2,7 @@ import { renderHome } from "./home.jsx"; import oldMappings from "./old_redirects.json" with { type: "json" }; import { tryResolveAssetUrl, tryResolveLatestJson, tryResolvePluginUrl, tryResolveSchemaUrl } from "./plugins.js"; import { readInfoFile } from "./readInfoFile.js"; +import robotsTxt from "./robots.txt"; import styleCSS from "./style.css"; import { LruCache } from "./utils/LruCache.js"; import { getCliInfo } from "./utils/mod.js"; @@ -65,6 +66,13 @@ export function createRequestHandler() { return createJsonResponse(JSON.stringify(cliInfo, null, 2), request); } + if (url.pathname === "/robots.txt") { + return new Response(robotsTxt, { + headers: { "content-type": contentTypes.plain }, + status: 200, + }); + } + if (url.pathname === "/style.css") { return new Response(styleCSS, { headers: { diff --git a/output.txt b/output.txt deleted file mode 100644 index 9b42bcf..0000000 --- a/output.txt +++ /dev/null @@ -1,1462 +0,0 @@ -error: The lockfile is out of date. Run `deno install --frozen=false`, or rerun with `--frozen=false` to update it. -changes: - 4 | - "npm:@cloudflare/vitest-pool-workers@0.5": "0.5.41_@vitest+runner@2.1.9_@vitest+snapshot@2.1.9_vitest@2.1.9_@cloudflare+workers-types@4.20260226.1", - 4 | + "npm:@cloudflare/vitest-pool-workers@~0.13.4": "0.13.4_@vitest+runner@4.1.1_@vitest+snapshot@4.1.1_vitest@4.1.1__vite@8.0.2___esbuild@0.27.3__esbuild@0.27.3_@cloudflare+workers-types@4.20260317.1_vite@8.0.2__esbuild@0.27.3", - 5 | - "npm:@cloudflare/workers-types@^4.20241205.0": "4.20260226.1", - 5 | + "npm:@cloudflare/workers-types@^4.20260317.1": "4.20260317.1", - 6 | - "npm:preact-render-to-string@^6.1.0": "6.6.5_preact@10.28.3", - 6 | + "npm:preact-render-to-string@^6.6.6": "6.6.6_preact@10.29.0", - 7 | - "npm:preact@^10.15.1": "10.28.3", - 7 | + "npm:preact@^10.29.0": "10.29.0", - 8 | - "npm:vitest@2.1": "2.1.9", - 8 | + "npm:vitest@~4.1.1": "4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3", - 9 | - "npm:wrangler@^3.90.0": "3.100.0_@cloudflare+workers-types@4.20260226.1" - 9 | + "npm:wrangler@^4.77.0": "4.77.0_@cloudflare+workers-types@4.20260317.1" - | ... - 12 | - "@cloudflare/kv-asset-handler@0.3.4": { - 12 | + "@cloudflare/kv-asset-handler@0.4.2": { - 13 | - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", - 13 | + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==" - 14 | + }, - 15 | + "@cloudflare/unenv-preset@2.16.0_unenv@2.0.0-rc.24_workerd@1.20260317.1": { - 16 | + "integrity": "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==", - | ... - 15 | - "mime" - 18 | + "unenv", - 19 | + "workerd" - 20 | + ], - 21 | + "optionalPeers": [ - 22 | + "workerd" - | ... - 18 | - "@cloudflare/vitest-pool-workers@0.5.41_@vitest+runner@2.1.9_@vitest+snapshot@2.1.9_vitest@2.1.9_@cloudflare+workers-types@4.20260226.1": { - 25 | + "@cloudflare/vitest-pool-workers@0.13.4_@vitest+runner@4.1.1_@vitest+snapshot@4.1.1_vitest@4.1.1__vite@8.0.2___esbuild@0.27.3__esbuild@0.27.3_@cloudflare+workers-types@4.20260317.1_vite@8.0.2__esbuild@0.27.3": { - 19 | - "integrity": "sha512-J0uYmOKJgyo/az5nV8QHlR6xQ+HHB6S65tOEutkvUPbuPDbFlBPRT+XHJhSTNNvZGeM1t2qZIzxp0WGmXLtNlQ==", - 26 | + "integrity": "sha512-0LWc3d14+8yiQsb6Io8HqWmHcNTPUAbxuvt5KbeL3ZPY70xvvaFJdxMYuHPYVbVVvV2oakoyc3pRitJLZRmEVQ==", - | ... - 23 | - "birpc", - | ... - 25 | - "devalue", - 31 | + "esbuild", - 26 | - "esbuild@0.17.19", - | ... - 28 | - "semver", - | ... - 34 | - "@cloudflare/workerd-darwin-64@1.20241230.0": { - 38 | + "@cloudflare/workerd-darwin-64@1.20260317.1": { - 35 | - "integrity": "sha512-BZHLg4bbhNQoaY1Uan81O3FV/zcmWueC55juhnaI7NAobiQth9RppadPNpxNAmS9fK2mR5z8xrwMQSQrHmztyQ==", - 39 | + "integrity": "sha512-8hjh3sPMwY8M/zedq3/sXoA2Q4BedlGufn3KOOleIG+5a4ReQKLlUah140D7J6zlKmYZAFMJ4tWC7hCuI/s79g==", - | ... - 39 | - "@cloudflare/workerd-darwin-arm64@1.20241230.0": { - 43 | + "@cloudflare/workerd-darwin-arm64@1.20260317.1": { - 40 | - "integrity": "sha512-lllxycj7EzYoJ0VOJh8M3palUgoonVrILnzGrgsworgWlIpgjfXGS7b41tEGCw6AxSxL9prmTIGtfSPUvn/rjg==", - 44 | + "integrity": "sha512-M/MnNyvO5HMgoIdr3QHjdCj2T1ki9gt0vIUnxYxBu9ISXS/jgtMl6chUVPJ7zHYBn9MyYr8ByeN6frjYxj0MGg==", - | ... - 44 | - "@cloudflare/workerd-linux-64@1.20241230.0": { - 48 | + "@cloudflare/workerd-linux-64@1.20260317.1": { - 45 | - "integrity": "sha512-Y3mHcW0KghOmWdNZyHYpEOG4Ba/ga8tht5vj1a+WXfagEjMO8Y98XhZUlCaYa9yB7Wh5jVcK5LM2jlO/BLgqpA==", - 49 | + "integrity": "sha512-1ltuEjkRcS3fsVF7CxsKlWiRmzq2ZqMfqDN0qUOgbUwkpXsLVJsXmoblaLf5OP00ELlcgF0QsN0p2xPEua4Uug==", - | ... - 49 | - "@cloudflare/workerd-linux-arm64@1.20241230.0": { - 53 | + "@cloudflare/workerd-linux-arm64@1.20260317.1": { - 50 | - "integrity": "sha512-IAjhsWPlHzhhkJ6I49sDG6XfMnhPvv0szKGXxTWQK/IWMrbGdHm4RSfNKBSoLQm67jGMIzbmcrX9UIkms27Y1g==", - 54 | + "integrity": "sha512-3QrNnPF1xlaNwkHpasvRvAMidOvQs2NhXQmALJrEfpIJ/IDL2la8g499yXp3eqhG3hVMCB07XVY149GTs42Xtw==", - | ... - 54 | - "@cloudflare/workerd-windows-64@1.20241230.0": { - 58 | + "@cloudflare/workerd-windows-64@1.20260317.1": { - 55 | - "integrity": "sha512-y5SPIk9iOb2gz+yWtHxoeMnjPnkYQswiCJ480oHC6zexnJLlKTpcmBCjDH1nWCT4pQi8F25gaH8thgElf4NvXQ==", - 59 | + "integrity": "sha512-MfZTz+7LfuIpMGTa3RLXHX8Z/pnycZLItn94WRdHr8LPVet+C5/1Nzei399w/jr3+kzT4pDKk26JF/tlI5elpQ==", - | ... - 59 | - "@cloudflare/workers-types@4.20260226.1": { - 63 | + "@cloudflare/workers-types@4.20260317.1": { - 60 | - "integrity": "sha512-ci/3wgHBLs7QYemyPCJa8ooQd0f9mL9V8cXknZj5f9joX1Iuf6+isDbfjphn0o/bDHpt88vxabC9mXeIYvBVDw==" - 64 | + "integrity": "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==" - | ... - 68 | - "@esbuild-plugins/node-globals-polyfill@0.2.3_esbuild@0.17.19": { - 72 | + "@emnapi/core@1.9.1": { - 69 | - "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", - 73 | + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - | ... - 71 | - "esbuild@0.17.19" - 75 | + "@emnapi/wasi-threads", - 76 | + "tslib" - | ... - 74 | - "@esbuild-plugins/node-modules-polyfill@0.2.2_esbuild@0.17.19": { - 79 | + "@emnapi/runtime@1.9.1": { - 75 | - "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", - 80 | + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - | ... - 77 | - "esbuild@0.17.19", - 82 | + "tslib" - 78 | - "escape-string-regexp", - 79 | - "rollup-plugin-node-polyfills" - | ... - 82 | - "@esbuild/aix-ppc64@0.21.5": { - 85 | + "@emnapi/wasi-threads@1.2.0": { - 83 | - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - 86 | + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - 87 | + "dependencies": [ - 88 | + "tslib" - 89 | + ] - 90 | + }, - 91 | + "@esbuild/aix-ppc64@0.27.3": { - 92 | + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - | ... - 87 | - "@esbuild/android-arm64@0.17.19": { - 96 | + "@esbuild/android-arm64@0.27.3": { - 88 | - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - 97 | + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - | ... - 92 | - "@esbuild/android-arm64@0.21.5": { - 101 | + "@esbuild/android-arm@0.27.3": { - 93 | - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - 102 | + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - 94 | - "os": ["android"], - 95 | - "cpu": ["arm64"] - 96 | - }, - 97 | - "@esbuild/android-arm@0.17.19": { - 98 | - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - | ... - 102 | - "@esbuild/android-arm@0.21.5": { - 106 | + "@esbuild/android-x64@0.27.3": { - 103 | - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - 107 | + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - 104 | - "os": ["android"], - 105 | - "cpu": ["arm"] - 106 | - }, - 107 | - "@esbuild/android-x64@0.17.19": { - 108 | - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - | ... - 112 | - "@esbuild/android-x64@0.21.5": { - 111 | + "@esbuild/darwin-arm64@0.27.3": { - 113 | - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - 112 | + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - 114 | - "os": ["android"], - 115 | - "cpu": ["x64"] - 116 | - }, - 117 | - "@esbuild/darwin-arm64@0.17.19": { - 118 | - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - | ... - 122 | - "@esbuild/darwin-arm64@0.21.5": { - 116 | + "@esbuild/darwin-x64@0.27.3": { - 123 | - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - 117 | + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - 124 | - "os": ["darwin"], - 125 | - "cpu": ["arm64"] - 126 | - }, - 127 | - "@esbuild/darwin-x64@0.17.19": { - 128 | - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - | ... - 132 | - "@esbuild/darwin-x64@0.21.5": { - 121 | + "@esbuild/freebsd-arm64@0.27.3": { - 133 | - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - 122 | + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - 134 | - "os": ["darwin"], - 135 | - "cpu": ["x64"] - 136 | - }, - 137 | - "@esbuild/freebsd-arm64@0.17.19": { - 138 | - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - | ... - 142 | - "@esbuild/freebsd-arm64@0.21.5": { - 126 | + "@esbuild/freebsd-x64@0.27.3": { - 143 | - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - 127 | + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - 144 | - "os": ["freebsd"], - 145 | - "cpu": ["arm64"] - 146 | - }, - 147 | - "@esbuild/freebsd-x64@0.17.19": { - 148 | - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - | ... - 152 | - "@esbuild/freebsd-x64@0.21.5": { - 131 | + "@esbuild/linux-arm64@0.27.3": { - 153 | - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - 132 | + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - 154 | - "os": ["freebsd"], - 155 | - "cpu": ["x64"] - 156 | - }, - 157 | - "@esbuild/linux-arm64@0.17.19": { - 158 | - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - | ... - 162 | - "@esbuild/linux-arm64@0.21.5": { - 136 | + "@esbuild/linux-arm@0.27.3": { - 163 | - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - 137 | + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - 164 | - "os": ["linux"], - 165 | - "cpu": ["arm64"] - 166 | - }, - 167 | - "@esbuild/linux-arm@0.17.19": { - 168 | - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - | ... - 172 | - "@esbuild/linux-arm@0.21.5": { - 141 | + "@esbuild/linux-ia32@0.27.3": { - 173 | - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - 142 | + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - 174 | - "os": ["linux"], - 175 | - "cpu": ["arm"] - 176 | - }, - 177 | - "@esbuild/linux-ia32@0.17.19": { - 178 | - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - | ... - 182 | - "@esbuild/linux-ia32@0.21.5": { - 146 | + "@esbuild/linux-loong64@0.27.3": { - 183 | - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - 147 | + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - 184 | - "os": ["linux"], - 185 | - "cpu": ["ia32"] - 186 | - }, - 187 | - "@esbuild/linux-loong64@0.17.19": { - 188 | - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - | ... - 192 | - "@esbuild/linux-loong64@0.21.5": { - 151 | + "@esbuild/linux-mips64el@0.27.3": { - 193 | - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - 152 | + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - 194 | - "os": ["linux"], - 195 | - "cpu": ["loong64"] - 196 | - }, - 197 | - "@esbuild/linux-mips64el@0.17.19": { - 198 | - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - | ... - 202 | - "@esbuild/linux-mips64el@0.21.5": { - 156 | + "@esbuild/linux-ppc64@0.27.3": { - 203 | - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - 157 | + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - 204 | - "os": ["linux"], - 205 | - "cpu": ["mips64el"] - 206 | - }, - 207 | - "@esbuild/linux-ppc64@0.17.19": { - 208 | - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - | ... - 212 | - "@esbuild/linux-ppc64@0.21.5": { - 161 | + "@esbuild/linux-riscv64@0.27.3": { - 213 | - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - 162 | + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - 163 | + "os": ["linux"], - 164 | + "cpu": ["riscv64"] - 165 | + }, - 166 | + "@esbuild/linux-s390x@0.27.3": { - 167 | + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - 168 | + "os": ["linux"], - 169 | + "cpu": ["s390x"] - 170 | + }, - 171 | + "@esbuild/linux-x64@0.27.3": { - 172 | + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - 173 | + "os": ["linux"], - 174 | + "cpu": ["x64"] - 175 | + }, - 176 | + "@esbuild/netbsd-arm64@0.27.3": { - 177 | + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - 178 | + "os": ["netbsd"], - 179 | + "cpu": ["arm64"] - 180 | + }, - 181 | + "@esbuild/netbsd-x64@0.27.3": { - 182 | + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - 183 | + "os": ["netbsd"], - 184 | + "cpu": ["x64"] - 185 | + }, - 186 | + "@esbuild/openbsd-arm64@0.27.3": { - 187 | + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - 188 | + "os": ["openbsd"], - 189 | + "cpu": ["arm64"] - 190 | + }, - 191 | + "@esbuild/openbsd-x64@0.27.3": { - 192 | + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - 193 | + "os": ["openbsd"], - 194 | + "cpu": ["x64"] - 195 | + }, - 196 | + "@esbuild/openharmony-arm64@0.27.3": { - 197 | + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - 198 | + "os": ["openharmony"], - 199 | + "cpu": ["arm64"] - 200 | + }, - 201 | + "@esbuild/sunos-x64@0.27.3": { - 202 | + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - 203 | + "os": ["sunos"], - 204 | + "cpu": ["x64"] - 205 | + }, - 206 | + "@esbuild/win32-arm64@0.27.3": { - 207 | + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - 208 | + "os": ["win32"], - 209 | + "cpu": ["arm64"] - 210 | + }, - 211 | + "@esbuild/win32-ia32@0.27.3": { - 212 | + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - 213 | + "os": ["win32"], - 214 | + "cpu": ["ia32"] - 215 | + }, - 216 | + "@esbuild/win32-x64@0.27.3": { - 217 | + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - 218 | + "os": ["win32"], - 219 | + "cpu": ["x64"] - 220 | + }, - 221 | + "@img/colour@1.1.0": { - 222 | + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==" - 223 | + }, - 224 | + "@img/sharp-darwin-arm64@0.34.5": { - 225 | + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - 226 | + "optionalDependencies": [ - 227 | + "@img/sharp-libvips-darwin-arm64" - 228 | + ], - 229 | + "os": ["darwin"], - 230 | + "cpu": ["arm64"] - 231 | + }, - 232 | + "@img/sharp-darwin-x64@0.34.5": { - 233 | + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - 234 | + "optionalDependencies": [ - 235 | + "@img/sharp-libvips-darwin-x64" - 236 | + ], - 237 | + "os": ["darwin"], - 238 | + "cpu": ["x64"] - 239 | + }, - 240 | + "@img/sharp-libvips-darwin-arm64@1.2.4": { - 241 | + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - 242 | + "os": ["darwin"], - 243 | + "cpu": ["arm64"] - 244 | + }, - 245 | + "@img/sharp-libvips-darwin-x64@1.2.4": { - 246 | + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - 247 | + "os": ["darwin"], - 248 | + "cpu": ["x64"] - 249 | + }, - 250 | + "@img/sharp-libvips-linux-arm64@1.2.4": { - 251 | + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - 252 | + "os": ["linux"], - 253 | + "cpu": ["arm64"] - 254 | + }, - 255 | + "@img/sharp-libvips-linux-arm@1.2.4": { - 256 | + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - 257 | + "os": ["linux"], - 258 | + "cpu": ["arm"] - 259 | + }, - 260 | + "@img/sharp-libvips-linux-ppc64@1.2.4": { - 261 | + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - | ... - 217 | - "@esbuild/linux-riscv64@0.17.19": { - 265 | + "@img/sharp-libvips-linux-riscv64@1.2.4": { - 218 | - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - 266 | + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - | ... - 222 | - "@esbuild/linux-riscv64@0.21.5": { - 270 | + "@img/sharp-libvips-linux-s390x@1.2.4": { - 223 | - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - 271 | + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - 272 | + "os": ["linux"], - 273 | + "cpu": ["s390x"] - 274 | + }, - 275 | + "@img/sharp-libvips-linux-x64@1.2.4": { - 276 | + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - 277 | + "os": ["linux"], - 278 | + "cpu": ["x64"] - 279 | + }, - 280 | + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": { - 281 | + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - 282 | + "os": ["linux"], - 283 | + "cpu": ["arm64"] - 284 | + }, - 285 | + "@img/sharp-libvips-linuxmusl-x64@1.2.4": { - 286 | + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - 287 | + "os": ["linux"], - 288 | + "cpu": ["x64"] - 289 | + }, - 290 | + "@img/sharp-linux-arm64@0.34.5": { - 291 | + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - 292 | + "optionalDependencies": [ - 293 | + "@img/sharp-libvips-linux-arm64" - 294 | + ], - 295 | + "os": ["linux"], - 296 | + "cpu": ["arm64"] - 297 | + }, - 298 | + "@img/sharp-linux-arm@0.34.5": { - 299 | + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - 300 | + "optionalDependencies": [ - 301 | + "@img/sharp-libvips-linux-arm" - 302 | + ], - 303 | + "os": ["linux"], - 304 | + "cpu": ["arm"] - 305 | + }, - 306 | + "@img/sharp-linux-ppc64@0.34.5": { - 307 | + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - 308 | + "optionalDependencies": [ - 309 | + "@img/sharp-libvips-linux-ppc64" - 310 | + ], - 311 | + "os": ["linux"], - 312 | + "cpu": ["ppc64"] - 313 | + }, - 314 | + "@img/sharp-linux-riscv64@0.34.5": { - 315 | + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - 316 | + "optionalDependencies": [ - 317 | + "@img/sharp-libvips-linux-riscv64" - 318 | + ], - | ... - 227 | - "@esbuild/linux-s390x@0.17.19": { - 322 | + "@img/sharp-linux-s390x@0.34.5": { - 228 | - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - 323 | + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - 324 | + "optionalDependencies": [ - 325 | + "@img/sharp-libvips-linux-s390x" - 326 | + ], - | ... - 232 | - "@esbuild/linux-s390x@0.21.5": { - 330 | + "@img/sharp-linux-x64@0.34.5": { - 233 | - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - 331 | + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - 234 | - "os": ["linux"], - 332 | + "optionalDependencies": [ - 235 | - "cpu": ["s390x"] - 333 | + "@img/sharp-libvips-linux-x64" - 236 | - }, - 334 | + ], - 237 | - "@esbuild/linux-x64@0.17.19": { - 238 | - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - | ... - 242 | - "@esbuild/linux-x64@0.21.5": { - 338 | + "@img/sharp-linuxmusl-arm64@0.34.5": { - 243 | - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - 339 | + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - 340 | + "optionalDependencies": [ - 341 | + "@img/sharp-libvips-linuxmusl-arm64" - 342 | + ], - 343 | + "os": ["linux"], - 344 | + "cpu": ["arm64"] - 345 | + }, - 346 | + "@img/sharp-linuxmusl-x64@0.34.5": { - 347 | + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - 348 | + "optionalDependencies": [ - 349 | + "@img/sharp-libvips-linuxmusl-x64" - 350 | + ], - | ... - 247 | - "@esbuild/netbsd-x64@0.17.19": { - 354 | + "@img/sharp-wasm32@0.34.5": { - 248 | - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - 355 | + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - 249 | - "os": ["netbsd"], - 356 | + "dependencies": [ - 250 | - "cpu": ["x64"] - 357 | + "@emnapi/runtime" - 358 | + ], - 359 | + "cpu": ["wasm32"] - | ... - 252 | - "@esbuild/netbsd-x64@0.21.5": { - 361 | + "@img/sharp-win32-arm64@0.34.5": { - 253 | - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - 362 | + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - 254 | - "os": ["netbsd"], - 255 | - "cpu": ["x64"] - 256 | - }, - 257 | - "@esbuild/openbsd-x64@0.17.19": { - 258 | - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - 259 | - "os": ["openbsd"], - 260 | - "cpu": ["x64"] - 261 | - }, - 262 | - "@esbuild/openbsd-x64@0.21.5": { - 263 | - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - 264 | - "os": ["openbsd"], - 265 | - "cpu": ["x64"] - 266 | - }, - 267 | - "@esbuild/sunos-x64@0.17.19": { - 268 | - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - 269 | - "os": ["sunos"], - 270 | - "cpu": ["x64"] - 271 | - }, - 272 | - "@esbuild/sunos-x64@0.21.5": { - 273 | - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - 274 | - "os": ["sunos"], - 275 | - "cpu": ["x64"] - 276 | - }, - 277 | - "@esbuild/win32-arm64@0.17.19": { - 278 | - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - | ... - 282 | - "@esbuild/win32-arm64@0.21.5": { - 366 | + "@img/sharp-win32-ia32@0.34.5": { - 283 | - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - 367 | + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - 284 | - "os": ["win32"], - 285 | - "cpu": ["arm64"] - 286 | - }, - 287 | - "@esbuild/win32-ia32@0.17.19": { - 288 | - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - | ... - 292 | - "@esbuild/win32-ia32@0.21.5": { - 371 | + "@img/sharp-win32-x64@0.34.5": { - 293 | - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - 372 | + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - 294 | - "os": ["win32"], - 295 | - "cpu": ["ia32"] - 296 | - }, - 297 | - "@esbuild/win32-x64@0.17.19": { - 298 | - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - | ... - 302 | - "@esbuild/win32-x64@0.21.5": { - 303 | - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - 304 | - "os": ["win32"], - 305 | - "cpu": ["x64"] - 306 | - }, - 307 | - "@fastify/busboy@2.1.1": { - 308 | - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" - 309 | - }, - | ... - 323 | - "@rollup/rollup-android-arm-eabi@4.57.1": { - 389 | + "@napi-rs/wasm-runtime@1.1.1": { - 324 | - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", - 390 | + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - 325 | - "os": ["android"], - 391 | + "dependencies": [ - 326 | - "cpu": ["arm"] - 392 | + "@emnapi/core", - 393 | + "@emnapi/runtime", - 394 | + "@tybys/wasm-util" - 395 | + ] - | ... - 328 | - "@rollup/rollup-android-arm64@4.57.1": { - 397 | + "@oxc-project/types@0.122.0": { - 329 | - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", - 398 | + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==" - 399 | + }, - 400 | + "@poppinss/colors@4.1.6": { - 401 | + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", - 402 | + "dependencies": [ - 403 | + "kleur" - 404 | + ] - 405 | + }, - 406 | + "@poppinss/dumper@0.6.5": { - 407 | + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", - 408 | + "dependencies": [ - 409 | + "@poppinss/colors", - 410 | + "@sindresorhus/is", - 411 | + "supports-color" - 412 | + ] - 413 | + }, - 414 | + "@poppinss/exception@1.2.3": { - 415 | + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==" - 416 | + }, - 417 | + "@rolldown/binding-android-arm64@1.0.0-rc.11": { - 418 | + "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", - | ... - 333 | - "@rollup/rollup-darwin-arm64@4.57.1": { - 422 | + "@rolldown/binding-darwin-arm64@1.0.0-rc.11": { - 334 | - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", - 423 | + "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", - | ... - 338 | - "@rollup/rollup-darwin-x64@4.57.1": { - 427 | + "@rolldown/binding-darwin-x64@1.0.0-rc.11": { - 339 | - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", - 428 | + "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", - | ... - 343 | - "@rollup/rollup-freebsd-arm64@4.57.1": { - 432 | + "@rolldown/binding-freebsd-x64@1.0.0-rc.11": { - 344 | - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", - 433 | + "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", - 345 | - "os": ["freebsd"], - 346 | - "cpu": ["arm64"] - 347 | - }, - 348 | - "@rollup/rollup-freebsd-x64@4.57.1": { - 349 | - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", - | ... - 353 | - "@rollup/rollup-linux-arm-gnueabihf@4.57.1": { - 437 | + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11": { - 354 | - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", - 438 | + "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", - | ... - 358 | - "@rollup/rollup-linux-arm-musleabihf@4.57.1": { - 442 | + "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11": { - 359 | - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", - 443 | + "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", - 360 | - "os": ["linux"], - 361 | - "cpu": ["arm"] - 362 | - }, - 363 | - "@rollup/rollup-linux-arm64-gnu@4.57.1": { - 364 | - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", - | ... - 368 | - "@rollup/rollup-linux-arm64-musl@4.57.1": { - 447 | + "@rolldown/binding-linux-arm64-musl@1.0.0-rc.11": { - 369 | - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", - 448 | + "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", - | ... - 373 | - "@rollup/rollup-linux-loong64-gnu@4.57.1": { - 452 | + "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11": { - 374 | - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", - 453 | + "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", - 375 | - "os": ["linux"], - 376 | - "cpu": ["loong64"] - 377 | - }, - 378 | - "@rollup/rollup-linux-loong64-musl@4.57.1": { - 379 | - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", - 380 | - "os": ["linux"], - 381 | - "cpu": ["loong64"] - 382 | - }, - 383 | - "@rollup/rollup-linux-ppc64-gnu@4.57.1": { - 384 | - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", - | ... - 388 | - "@rollup/rollup-linux-ppc64-musl@4.57.1": { - 457 | + "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11": { - 389 | - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", - 458 | + "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", - 390 | - "os": ["linux"], - 391 | - "cpu": ["ppc64"] - 392 | - }, - 393 | - "@rollup/rollup-linux-riscv64-gnu@4.57.1": { - 394 | - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", - 395 | - "os": ["linux"], - 396 | - "cpu": ["riscv64"] - 397 | - }, - 398 | - "@rollup/rollup-linux-riscv64-musl@4.57.1": { - 399 | - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", - 400 | - "os": ["linux"], - 401 | - "cpu": ["riscv64"] - 402 | - }, - 403 | - "@rollup/rollup-linux-s390x-gnu@4.57.1": { - 404 | - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", - | ... - 408 | - "@rollup/rollup-linux-x64-gnu@4.57.1": { - 462 | + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.11": { - 409 | - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", - 463 | + "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", - | ... - 413 | - "@rollup/rollup-linux-x64-musl@4.57.1": { - 467 | + "@rolldown/binding-linux-x64-musl@1.0.0-rc.11": { - 414 | - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", - 468 | + "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", - | ... - 418 | - "@rollup/rollup-openbsd-x64@4.57.1": { - 472 | + "@rolldown/binding-openharmony-arm64@1.0.0-rc.11": { - 419 | - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", - 473 | + "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", - 420 | - "os": ["openbsd"], - 421 | - "cpu": ["x64"] - 422 | - }, - 423 | - "@rollup/rollup-openharmony-arm64@4.57.1": { - 424 | - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", - | ... - 428 | - "@rollup/rollup-win32-arm64-msvc@4.57.1": { - 477 | + "@rolldown/binding-wasm32-wasi@1.0.0-rc.11": { - 429 | - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", - 478 | + "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", - 479 | + "dependencies": [ - 480 | + "@napi-rs/wasm-runtime" - 481 | + ], - 482 | + "cpu": ["wasm32"] - 483 | + }, - 484 | + "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11": { - 485 | + "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", - | ... - 433 | - "@rollup/rollup-win32-ia32-msvc@4.57.1": { - 489 | + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.11": { - 434 | - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", - 490 | + "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", - 435 | - "os": ["win32"], - 436 | - "cpu": ["ia32"] - 437 | - }, - 438 | - "@rollup/rollup-win32-x64-gnu@4.57.1": { - 439 | - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", - | ... - 443 | - "@rollup/rollup-win32-x64-msvc@4.57.1": { - 494 | + "@rolldown/pluginutils@1.0.0-rc.11": { - 444 | - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", - 495 | + "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==" - 445 | - "os": ["win32"], - 496 | + }, - 446 | - "cpu": ["x64"] - 497 | + "@sindresorhus/is@7.2.0": { - 498 | + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==" - 499 | + }, - 500 | + "@speed-highlight/core@1.2.15": { - 501 | + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==" - 502 | + }, - 503 | + "@standard-schema/spec@1.1.0": { - 504 | + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" - 505 | + }, - 506 | + "@tybys/wasm-util@0.10.1": { - 507 | + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - 508 | + "dependencies": [ - 509 | + "tslib" - 510 | + ] - 511 | + }, - 512 | + "@types/chai@5.2.3": { - 513 | + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - 514 | + "dependencies": [ - 515 | + "@types/deep-eql", - 516 | + "assertion-error" - 517 | + ] - 518 | + }, - 519 | + "@types/deep-eql@4.0.2": { - 520 | + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" - | ... - 451 | - "@types/node-forge@1.3.14": { - 525 | + "@vitest/expect@4.1.1": { - 452 | - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - 526 | + "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", - 453 | - "dependencies": [ - 454 | - "@types/node" - 455 | - ] - 456 | - }, - 457 | - "@types/node@25.3.5": { - 458 | - "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", - 459 | - "dependencies": [ - 460 | - "undici-types" - 461 | - ] - 462 | - }, - 463 | - "@vitest/expect@2.1.9": { - 464 | - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", - | ... - 528 | + "@standard-schema/spec", - 529 | + "@types/chai", - | ... - 472 | - "@vitest/mocker@2.1.9_vite@5.4.21": { - 536 | + "@vitest/mocker@4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3": { - 473 | - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", - 537 | + "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", - | ... - 476 | - "estree-walker@3.0.3", - 540 | + "estree-walker", - 477 | - "magic-string@0.30.21", - 541 | + "magic-string", - | ... - 484 | - "@vitest/pretty-format@2.1.9": { - 548 | + "@vitest/pretty-format@4.1.1": { - 485 | - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", - 549 | + "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", - | ... - 490 | - "@vitest/runner@2.1.9": { - 554 | + "@vitest/runner@4.1.1": { - 491 | - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", - 555 | + "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", - | ... - 494 | - "pathe@1.1.2" - 558 | + "pathe" - | ... - 497 | - "@vitest/snapshot@2.1.9": { - 561 | + "@vitest/snapshot@4.1.1": { - 498 | - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", - 562 | + "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", - | ... - 501 | - "magic-string@0.30.21", - 565 | + "@vitest/utils", - 502 | - "pathe@1.1.2" - 566 | + "magic-string", - 567 | + "pathe" - | ... - 505 | - "@vitest/spy@2.1.9": { - 570 | + "@vitest/spy@4.1.1": { - 506 | - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", - 571 | + "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==" - 507 | - "dependencies": [ - 508 | - "tinyspy" - 509 | - ] - | ... - 511 | - "@vitest/utils@2.1.9": { - 573 | + "@vitest/utils@4.1.1": { - 512 | - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", - 574 | + "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", - | ... - 515 | - "loupe", - 577 | + "convert-source-map", - | ... - 519 | - "acorn-walk@8.3.2": { - 520 | - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==" - 521 | - }, - 522 | - "acorn@8.16.0": { - 523 | - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - 524 | - "bin": true - 525 | - }, - 526 | - "as-table@1.0.55": { - 527 | - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - 528 | - "dependencies": [ - 529 | - "printable-characters" - 530 | - ] - 531 | - }, - | ... - 535 | - "birpc@0.2.14": { - 536 | - "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==" - 537 | - }, - | ... - 541 | - "cac@6.7.14": { - 587 | + "chai@6.2.2": { - 542 | - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" - 588 | + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==" - 543 | - }, - 544 | - "capnp-ts@0.7.0": { - 545 | - "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", - 546 | - "dependencies": [ - 547 | - "debug", - 548 | - "tslib" - 549 | - ] - 550 | - }, - 551 | - "chai@5.3.3": { - 552 | - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - 553 | - "dependencies": [ - 554 | - "assertion-error", - 555 | - "check-error", - 556 | - "deep-eql", - 557 | - "loupe", - 558 | - "pathval" - 559 | - ] - 560 | - }, - 561 | - "check-error@2.1.3": { - 562 | - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==" - 563 | - }, - 564 | - "chokidar@4.0.3": { - 565 | - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - 566 | - "dependencies": [ - 567 | - "readdirp" - 568 | - ] - | ... - 573 | - "confbox@0.1.8": { - 593 | + "convert-source-map@2.0.0": { - 574 | - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - 594 | + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - | ... - 576 | - "cookie@0.7.2": { - 596 | + "cookie@1.1.1": { - 577 | - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" - 597 | + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==" - | ... - 579 | - "data-uri-to-buffer@2.0.2": { - 599 | + "detect-libc@2.1.2": { - 580 | - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==" - 600 | + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" - | ... - 582 | - "date-fns@4.1.0": { - 602 | + "error-stack-parser-es@1.0.5": { - 583 | - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==" - 603 | + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" - | ... - 585 | - "debug@4.4.3": { - 605 | + "es-module-lexer@2.0.0": { - 586 | - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - 606 | + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==" - 587 | - "dependencies": [ - 588 | - "ms" - 589 | - ] - | ... - 591 | - "deep-eql@5.0.2": { - 608 | + "esbuild@0.27.3": { - 592 | - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" - 609 | + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - 593 | - }, - 594 | - "defu@6.1.4": { - 595 | - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - 596 | - }, - 597 | - "devalue@4.3.3": { - 598 | - "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==" - 599 | - }, - 600 | - "es-module-lexer@1.7.0": { - 601 | - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" - 602 | - }, - 603 | - "esbuild@0.17.19": { - 604 | - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - 605 | - "optionalDependencies": [ - 606 | - "@esbuild/android-arm@0.17.19", - 607 | - "@esbuild/android-arm64@0.17.19", - 608 | - "@esbuild/android-x64@0.17.19", - 609 | - "@esbuild/darwin-arm64@0.17.19", - 610 | - "@esbuild/darwin-x64@0.17.19", - 611 | - "@esbuild/freebsd-arm64@0.17.19", - 612 | - "@esbuild/freebsd-x64@0.17.19", - 613 | - "@esbuild/linux-arm@0.17.19", - 614 | - "@esbuild/linux-arm64@0.17.19", - 615 | - "@esbuild/linux-ia32@0.17.19", - 616 | - "@esbuild/linux-loong64@0.17.19", - 617 | - "@esbuild/linux-mips64el@0.17.19", - 618 | - "@esbuild/linux-ppc64@0.17.19", - 619 | - "@esbuild/linux-riscv64@0.17.19", - 620 | - "@esbuild/linux-s390x@0.17.19", - 621 | - "@esbuild/linux-x64@0.17.19", - 622 | - "@esbuild/netbsd-x64@0.17.19", - 623 | - "@esbuild/openbsd-x64@0.17.19", - 624 | - "@esbuild/sunos-x64@0.17.19", - 625 | - "@esbuild/win32-arm64@0.17.19", - 626 | - "@esbuild/win32-ia32@0.17.19", - 627 | - "@esbuild/win32-x64@0.17.19" - 628 | - ], - 629 | - "scripts": true, - 630 | - "bin": true - 631 | - }, - 632 | - "esbuild@0.21.5": { - 633 | - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - | ... - 636 | - "@esbuild/android-arm@0.21.5", - 612 | + "@esbuild/android-arm", - 637 | - "@esbuild/android-arm64@0.21.5", - 613 | + "@esbuild/android-arm64", - 638 | - "@esbuild/android-x64@0.21.5", - 614 | + "@esbuild/android-x64", - 639 | - "@esbuild/darwin-arm64@0.21.5", - 615 | + "@esbuild/darwin-arm64", - 640 | - "@esbuild/darwin-x64@0.21.5", - 616 | + "@esbuild/darwin-x64", - 641 | - "@esbuild/freebsd-arm64@0.21.5", - 617 | + "@esbuild/freebsd-arm64", - 642 | - "@esbuild/freebsd-x64@0.21.5", - 618 | + "@esbuild/freebsd-x64", - 643 | - "@esbuild/linux-arm@0.21.5", - 619 | + "@esbuild/linux-arm", - 644 | - "@esbuild/linux-arm64@0.21.5", - 620 | + "@esbuild/linux-arm64", - 645 | - "@esbuild/linux-ia32@0.21.5", - 621 | + "@esbuild/linux-ia32", - 646 | - "@esbuild/linux-loong64@0.21.5", - 622 | + "@esbuild/linux-loong64", - 647 | - "@esbuild/linux-mips64el@0.21.5", - 623 | + "@esbuild/linux-mips64el", - 648 | - "@esbuild/linux-ppc64@0.21.5", - 624 | + "@esbuild/linux-ppc64", - 649 | - "@esbuild/linux-riscv64@0.21.5", - 625 | + "@esbuild/linux-riscv64", - 650 | - "@esbuild/linux-s390x@0.21.5", - 626 | + "@esbuild/linux-s390x", - 651 | - "@esbuild/linux-x64@0.21.5", - 627 | + "@esbuild/linux-x64", - 652 | - "@esbuild/netbsd-x64@0.21.5", - 628 | + "@esbuild/netbsd-arm64", - 653 | - "@esbuild/openbsd-x64@0.21.5", - 629 | + "@esbuild/netbsd-x64", - 654 | - "@esbuild/sunos-x64@0.21.5", - 630 | + "@esbuild/openbsd-arm64", - 655 | - "@esbuild/win32-arm64@0.21.5", - 631 | + "@esbuild/openbsd-x64", - 656 | - "@esbuild/win32-ia32@0.21.5", - 632 | + "@esbuild/openharmony-arm64", - 657 | - "@esbuild/win32-x64@0.21.5" - 633 | + "@esbuild/sunos-x64", - 634 | + "@esbuild/win32-arm64", - 635 | + "@esbuild/win32-ia32", - 636 | + "@esbuild/win32-x64" - | ... - 662 | - "escape-string-regexp@4.0.0": { - 663 | - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - 664 | - }, - 665 | - "estree-walker@0.6.1": { - 666 | - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - 667 | - }, - | ... - 674 | - "exit-hook@2.2.1": { - 675 | - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==" - 676 | - }, - | ... - 650 | + "fdir@6.5.0_picomatch@4.0.4": { - 651 | + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - 652 | + "dependencies": [ - 653 | + "picomatch" - 654 | + ], - 655 | + "optionalPeers": [ - 656 | + "picomatch" - 657 | + ] - 658 | + }, - | ... - 685 | - "function-bind@1.1.2": { - 664 | + "kleur@4.1.5": { - 686 | - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - 665 | + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - | ... - 688 | - "get-source@2.0.12": { - 667 | + "lightningcss-android-arm64@1.32.0": { - 689 | - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - 668 | + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - 669 | + "os": ["android"], - 670 | + "cpu": ["arm64"] - 671 | + }, - 672 | + "lightningcss-darwin-arm64@1.32.0": { - 673 | + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - 674 | + "os": ["darwin"], - 675 | + "cpu": ["arm64"] - 676 | + }, - 677 | + "lightningcss-darwin-x64@1.32.0": { - 678 | + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - 679 | + "os": ["darwin"], - 680 | + "cpu": ["x64"] - 681 | + }, - 682 | + "lightningcss-freebsd-x64@1.32.0": { - 683 | + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - 684 | + "os": ["freebsd"], - 685 | + "cpu": ["x64"] - 686 | + }, - 687 | + "lightningcss-linux-arm-gnueabihf@1.32.0": { - 688 | + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - 689 | + "os": ["linux"], - 690 | + "cpu": ["arm"] - 691 | + }, - 692 | + "lightningcss-linux-arm64-gnu@1.32.0": { - 693 | + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - 694 | + "os": ["linux"], - 695 | + "cpu": ["arm64"] - 696 | + }, - 697 | + "lightningcss-linux-arm64-musl@1.32.0": { - 698 | + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - 699 | + "os": ["linux"], - 700 | + "cpu": ["arm64"] - 701 | + }, - 702 | + "lightningcss-linux-x64-gnu@1.32.0": { - 703 | + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - 704 | + "os": ["linux"], - 705 | + "cpu": ["x64"] - 706 | + }, - 707 | + "lightningcss-linux-x64-musl@1.32.0": { - 708 | + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - 709 | + "os": ["linux"], - 710 | + "cpu": ["x64"] - 711 | + }, - 712 | + "lightningcss-win32-arm64-msvc@1.32.0": { - 713 | + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - 714 | + "os": ["win32"], - 715 | + "cpu": ["arm64"] - 716 | + }, - 717 | + "lightningcss-win32-x64-msvc@1.32.0": { - 718 | + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - 719 | + "os": ["win32"], - 720 | + "cpu": ["x64"] - 721 | + }, - 722 | + "lightningcss@1.32.0": { - 723 | + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - | ... - 691 | - "data-uri-to-buffer", - 725 | + "detect-libc" - 692 | - "source-map" - 726 | + ], - 693 | - ] - 727 | + "optionalDependencies": [ - 694 | - }, - 728 | + "lightningcss-android-arm64", - 695 | - "glob-to-regexp@0.4.1": { - 729 | + "lightningcss-darwin-arm64", - 696 | - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - 730 | + "lightningcss-darwin-x64", - 697 | - }, - 731 | + "lightningcss-freebsd-x64", - 698 | - "hasown@2.0.2": { - 732 | + "lightningcss-linux-arm-gnueabihf", - 699 | - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - 733 | + "lightningcss-linux-arm64-gnu", - 700 | - "dependencies": [ - 734 | + "lightningcss-linux-arm64-musl", - 701 | - "function-bind" - 735 | + "lightningcss-linux-x64-gnu", - 702 | - ] - 736 | + "lightningcss-linux-x64-musl", - 703 | - }, - 737 | + "lightningcss-win32-arm64-msvc", - 704 | - "is-core-module@2.16.1": { - 738 | + "lightningcss-win32-x64-msvc" - 705 | - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - 706 | - "dependencies": [ - 707 | - "hasown" - 708 | - ] - 709 | - }, - 710 | - "itty-time@1.0.6": { - 711 | - "integrity": "sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==" - 712 | - }, - 713 | - "loupe@3.2.1": { - 714 | - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==" - 715 | - }, - 716 | - "magic-string@0.25.9": { - 717 | - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - 718 | - "dependencies": [ - 719 | - "sourcemap-codec" - | ... - 728 | - "mime@3.0.0": { - 747 | + "miniflare@4.20260317.2": { - 729 | - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - 748 | + "integrity": "sha512-qNL+yWAFMX6fr0pWU6Lx1vNpPobpnDSF1V8eunIckWvoIQl8y1oBjL2RJFEGY3un+l3f9gwW9dirDPP26usYJQ==", - 730 | - "bin": true - 731 | - }, - 732 | - "miniflare@3.20241230.0": { - 733 | - "integrity": "sha512-ZtWNoNAIj5Q0Vb3B4SPEKr7DDmVG8a0Stsp/AuRkYXoJniA5hsbKjFNIGhTXGMIHVP5bvDrKJWt/POIDGfpiKg==", - | ... - 736 | - "acorn", - 751 | + "sharp", - 737 | - "acorn-walk", - 738 | - "capnp-ts", - 739 | - "exit-hook", - 740 | - "glob-to-regexp", - 741 | - "stoppable", - | ... - 745 | - "youch", - 755 | + "youch" - 746 | - "zod" - | ... - 750 | - "mlly@1.8.2": { - 751 | - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - 752 | - "dependencies": [ - 753 | - "acorn", - 754 | - "pathe@2.0.3", - 755 | - "pkg-types", - 756 | - "ufo" - 757 | - ] - 758 | - }, - 759 | - "ms@2.1.3": { - 760 | - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - 761 | - }, - 762 | - "mustache@4.2.0": { - 763 | - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - 764 | - "bin": true - 765 | - }, - | ... - 770 | - "node-forge@1.4.0": { - 763 | + "obug@2.1.1": { - 771 | - "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==" - 764 | + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" - 772 | - }, - 773 | - "ohash@1.1.6": { - 774 | - "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==" - 775 | - }, - 776 | - "path-parse@1.0.7": { - 777 | - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - | ... - 782 | - "pathe@1.1.2": { - 783 | - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - 784 | - }, - | ... - 788 | - "pathval@2.0.1": { - 789 | - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==" - 790 | - }, - | ... - 794 | - "pkg-types@1.3.1": { - 775 | + "picomatch@4.0.4": { - 795 | - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - 776 | + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" - 796 | - "dependencies": [ - 797 | - "confbox", - 798 | - "mlly", - 799 | - "pathe@2.0.3" - 800 | - ] - | ... - 810 | - "preact-render-to-string@6.6.5_preact@10.28.3": { - 786 | + "preact-render-to-string@6.6.6_preact@10.29.0": { - 811 | - "integrity": "sha512-O6MHzYNIKYaiSX3bOw0gGZfEbOmlIDtDfWwN1JJdc/T3ihzRT6tGGSEWE088dWrEDGa1u7101q+6fzQnO9XCPA==", - 787 | + "integrity": "sha512-EfqZJytnjJldV+YaaqhthU2oXsEf5e+6rDv957p+zxAvNfFLQOPfvBOTncscQ+akzu6Wrl7s3Pa0LjUQmWJsGQ==", - | ... - 816 | - "preact@10.28.3": { - 792 | + "preact@10.29.0": { - 817 | - "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==" - 793 | + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" - | ... - 819 | - "printable-characters@1.0.42": { - 795 | + "rolldown@1.0.0-rc.11": { - 820 | - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==" - 796 | + "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", - 821 | - }, - 822 | - "readdirp@4.1.2": { - 823 | - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" - 824 | - }, - 825 | - "resolve@1.22.11": { - 826 | - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - | ... - 828 | - "is-core-module", - 798 | + "@oxc-project/types", - 829 | - "path-parse", - 799 | + "@rolldown/pluginutils" - 830 | - "supports-preserve-symlinks-flag" - 831 | - ], - 832 | - "bin": true - 833 | - }, - 834 | - "rollup-plugin-inject@3.0.2": { - 835 | - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - 836 | - "dependencies": [ - 837 | - "estree-walker@0.6.1", - 838 | - "magic-string@0.25.9", - 839 | - "rollup-pluginutils" - 840 | - ], - 841 | - "deprecated": true - 842 | - }, - 843 | - "rollup-plugin-node-polyfills@0.2.1": { - 844 | - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - 845 | - "dependencies": [ - 846 | - "rollup-plugin-inject" - 847 | - ] - 848 | - }, - 849 | - "rollup-pluginutils@2.8.2": { - 850 | - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - 851 | - "dependencies": [ - 852 | - "estree-walker@0.6.1" - 853 | - ] - 854 | - }, - 855 | - "rollup@4.57.1": { - 856 | - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", - 857 | - "dependencies": [ - 858 | - "@types/estree" - | ... - 861 | - "@rollup/rollup-android-arm-eabi", - 802 | + "@rolldown/binding-android-arm64", - 862 | - "@rollup/rollup-android-arm64", - 803 | + "@rolldown/binding-darwin-arm64", - 863 | - "@rollup/rollup-darwin-arm64", - 804 | + "@rolldown/binding-darwin-x64", - 864 | - "@rollup/rollup-darwin-x64", - 805 | + "@rolldown/binding-freebsd-x64", - 865 | - "@rollup/rollup-freebsd-arm64", - 806 | + "@rolldown/binding-linux-arm-gnueabihf", - 866 | - "@rollup/rollup-freebsd-x64", - 807 | + "@rolldown/binding-linux-arm64-gnu", - 867 | - "@rollup/rollup-linux-arm-gnueabihf", - 808 | + "@rolldown/binding-linux-arm64-musl", - 868 | - "@rollup/rollup-linux-arm-musleabihf", - 809 | + "@rolldown/binding-linux-ppc64-gnu", - 869 | - "@rollup/rollup-linux-arm64-gnu", - 810 | + "@rolldown/binding-linux-s390x-gnu", - 870 | - "@rollup/rollup-linux-arm64-musl", - 811 | + "@rolldown/binding-linux-x64-gnu", - 871 | - "@rollup/rollup-linux-loong64-gnu", - 812 | + "@rolldown/binding-linux-x64-musl", - 872 | - "@rollup/rollup-linux-loong64-musl", - 813 | + "@rolldown/binding-openharmony-arm64", - 873 | - "@rollup/rollup-linux-ppc64-gnu", - 814 | + "@rolldown/binding-wasm32-wasi", - 874 | - "@rollup/rollup-linux-ppc64-musl", - 815 | + "@rolldown/binding-win32-arm64-msvc", - 875 | - "@rollup/rollup-linux-riscv64-gnu", - 816 | + "@rolldown/binding-win32-x64-msvc" - 876 | - "@rollup/rollup-linux-riscv64-musl", - 877 | - "@rollup/rollup-linux-s390x-gnu", - 878 | - "@rollup/rollup-linux-x64-gnu", - 879 | - "@rollup/rollup-linux-x64-musl", - 880 | - "@rollup/rollup-openbsd-x64", - 881 | - "@rollup/rollup-openharmony-arm64", - 882 | - "@rollup/rollup-win32-arm64-msvc", - 883 | - "@rollup/rollup-win32-ia32-msvc", - 884 | - "@rollup/rollup-win32-x64-gnu", - 885 | - "@rollup/rollup-win32-x64-msvc", - 886 | - "fsevents" - | ... - 890 | - "selfsigned@2.4.1": { - 891 | - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - 892 | - "dependencies": [ - 893 | - "@types/node-forge", - 894 | - "node-forge" - 895 | - ] - 896 | - }, - | ... - 824 | + "sharp@0.34.5": { - 825 | + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - 826 | + "dependencies": [ - 827 | + "@img/colour", - 828 | + "detect-libc", - 829 | + "semver" - 830 | + ], - 831 | + "optionalDependencies": [ - 832 | + "@img/sharp-darwin-arm64", - 833 | + "@img/sharp-darwin-x64", - 834 | + "@img/sharp-libvips-darwin-arm64", - 835 | + "@img/sharp-libvips-darwin-x64", - 836 | + "@img/sharp-libvips-linux-arm", - 837 | + "@img/sharp-libvips-linux-arm64", - 838 | + "@img/sharp-libvips-linux-ppc64", - 839 | + "@img/sharp-libvips-linux-riscv64", - 840 | + "@img/sharp-libvips-linux-s390x", - 841 | + "@img/sharp-libvips-linux-x64", - 842 | + "@img/sharp-libvips-linuxmusl-arm64", - 843 | + "@img/sharp-libvips-linuxmusl-x64", - 844 | + "@img/sharp-linux-arm", - 845 | + "@img/sharp-linux-arm64", - 846 | + "@img/sharp-linux-ppc64", - 847 | + "@img/sharp-linux-riscv64", - 848 | + "@img/sharp-linux-s390x", - 849 | + "@img/sharp-linux-x64", - 850 | + "@img/sharp-linuxmusl-arm64", - 851 | + "@img/sharp-linuxmusl-x64", - 852 | + "@img/sharp-wasm32", - 853 | + "@img/sharp-win32-arm64", - 854 | + "@img/sharp-win32-ia32", - 855 | + "@img/sharp-win32-x64" - 856 | + ], - 857 | + "scripts": true - 858 | + }, - | ... - 907 | - "source-map@0.6.1": { - 908 | - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - 909 | - }, - 910 | - "sourcemap-codec@1.4.8": { - 911 | - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - 912 | - "deprecated": true - 913 | - }, - | ... - 917 | - "stacktracey@2.2.0": { - 868 | + "std-env@4.0.0": { - 918 | - "integrity": "sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==", - 869 | + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==" - 919 | - "dependencies": [ - 920 | - "as-table", - 921 | - "get-source" - 922 | - ] - | ... - 924 | - "std-env@3.10.0": { - 871 | + "supports-color@10.2.2": { - 925 | - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" - 872 | + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" - 926 | - }, - 927 | - "stoppable@1.1.0": { - 928 | - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" - 929 | - }, - 930 | - "supports-preserve-symlinks-flag@1.0.0": { - 931 | - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - | ... - 936 | - "tinyexec@0.3.2": { - 877 | + "tinyexec@1.0.4": { - 937 | - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - 878 | + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==" - | ... - 939 | - "tinypool@1.1.1": { - 880 | + "tinyglobby@0.2.15": { - 940 | - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==" - 881 | + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - 882 | + "dependencies": [ - 883 | + "fdir", - 884 | + "picomatch" - 885 | + ] - | ... - 942 | - "tinyrainbow@1.2.0": { - 887 | + "tinyrainbow@3.1.0": { - 943 | - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==" - 888 | + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==" - 944 | - }, - 945 | - "tinyspy@3.0.2": { - 946 | - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" - | ... - 951 | - "ufo@1.6.3": { - 893 | + "undici@7.24.4": { - 952 | - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==" - 894 | + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==" - | ... - 954 | - "undici-types@7.18.2": { - 896 | + "unenv@2.0.0-rc.24": { - 955 | - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" - 897 | + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", - 956 | - }, - 957 | - "undici@5.29.0": { - 958 | - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", - | ... - 960 | - "@fastify/busboy" - 899 | + "pathe" - | ... - 963 | - "unenv-nightly@2.0.0-20241218-183400-5d6aec3": { - 902 | + "vite@8.0.2_esbuild@0.27.3": { - 964 | - "integrity": "sha512-7Xpi29CJRbOV1/IrC03DawMJ0hloklDLq/cigSe+J2jkcC+iDres2Cy0r4ltj5f0x7DqsaGaB4/dLuCPPFZnZA==", - 903 | + "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", - | ... - 966 | - "defu", - 905 | + "esbuild", - 967 | - "mlly", - 906 | + "lightningcss", - 968 | - "ohash", - 907 | + "picomatch", - 969 | - "pathe@1.1.2", - 970 | - "ufo" - 971 | - ] - 972 | - }, - 973 | - "vite-node@2.1.9": { - 974 | - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", - 975 | - "dependencies": [ - 976 | - "cac", - 977 | - "debug", - 978 | - "es-module-lexer", - 979 | - "pathe@1.1.2", - 980 | - "vite" - 981 | - ], - 982 | - "bin": true - 983 | - }, - 984 | - "vite@5.4.21": { - 985 | - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - 986 | - "dependencies": [ - 987 | - "esbuild@0.21.5", - | ... - 989 | - "rollup" - 909 | + "rolldown", - 910 | + "tinyglobby" - | ... - 915 | + "optionalPeers": [ - 916 | + "esbuild" - 917 | + ], - | ... - 996 | - "vitest@2.1.9": { - 920 | + "vitest@4.1.1_vite@8.0.2__esbuild@0.27.3_esbuild@0.27.3": { - 997 | - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", - 921 | + "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", - | ... -1006 | - "chai", - 930 | + "es-module-lexer", -1007 | - "debug", - | ... -1009 | - "magic-string@0.30.21", - 932 | + "magic-string", -1010 | - "pathe@1.1.2", - 933 | + "obug", - 934 | + "pathe", - 935 | + "picomatch", - | ... -1014 | - "tinypool", - 939 | + "tinyglobby", - | ... -1017 | - "vite-node", - | ... -1030 | - "workerd@1.20241230.0": { - 954 | + "workerd@1.20260317.1": { -1031 | - "integrity": "sha512-EgixXP0JGXGq6J9lz17TKIZtfNDUvJNG+cl9paPMfZuYWT920fFpBx+K04YmnbQRLnglsivF1GT9pxh1yrlWhg==", - 955 | + "integrity": "sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==", - | ... -1042 | - "wrangler@3.100.0_@cloudflare+workers-types@4.20260226.1": { - 966 | + "wrangler@4.77.0_@cloudflare+workers-types@4.20260317.1": { -1043 | - "integrity": "sha512-+nsZK374Xnp2BEQQuB/18pnObgsOey0AHVlg75pAdwNaKAmB2aa0/E5rFb7i89DiiwFYoZMz3cARY1UKcm/WQQ==", - 967 | + "integrity": "sha512-E2Gm69+K++BFd3QvoWjC290RPQj1vDOUotA++sNHmtKPb7EP6C8Qv+1D5Ii73tfZtyNgakpqHlh8lBBbVWTKAQ==", - | ... - 970 | + "@cloudflare/unenv-preset", - | ... -1047 | - "@esbuild-plugins/node-globals-polyfill", -1048 | - "@esbuild-plugins/node-modules-polyfill", - | ... -1050 | - "chokidar", - 973 | + "esbuild", -1051 | - "date-fns", -1052 | - "esbuild@0.17.19", -1053 | - "itty-time", - | ... -1055 | - "nanoid", - | ... -1057 | - "resolve", - 976 | + "unenv", -1058 | - "selfsigned", - 977 | + "workerd" -1059 | - "source-map", -1060 | - "unenv@npm:unenv-nightly@2.0.0-20241218-183400-5d6aec3", -1061 | - "workerd", -1062 | - "xxhash-wasm" - | ... -1070 | - "deprecated": true, - | ... -1076 | - "xxhash-wasm@1.1.0": { - 990 | + "youch-core@0.3.3": { -1077 | - "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" - 991 | + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", -1078 | - }, -1079 | - "youch@3.3.4": { -1080 | - "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", - | ... -1082 | - "cookie", - 993 | + "@poppinss/exception", -1083 | - "mustache", - 994 | + "error-stack-parser-es" -1084 | - "stacktracey" - | ... -1087 | - "zod@3.22.3": { - 997 | + "youch@4.1.0-beta.10": { -1088 | - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==" - 998 | + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", - 999 | + "dependencies": [ -1000 | + "@poppinss/colors", -1001 | + "@poppinss/dumper", -1002 | + "@speed-highlight/core", -1003 | + "cookie", -1004 | + "youch-core" -1005 | + ] -1006 | + }, -1007 | + "zod@3.25.76": { -1008 | + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" - | ... -1100 | - "npm:@cloudflare/vitest-pool-workers@0.5", -1020 | + "npm:@cloudflare/vitest-pool-workers@~0.13.4", -1101 | - "npm:@cloudflare/workers-types@^4.20241205.0", -1021 | + "npm:@cloudflare/workers-types@^4.20260317.1", -1102 | - "npm:preact-render-to-string@^6.1.0", -1022 | + "npm:preact-render-to-string@^6.6.6", -1103 | - "npm:preact@^10.15.1", -1023 | + "npm:preact@^10.29.0", -1104 | - "npm:vitest@2.1", -1024 | + "npm:vitest@~4.1.1", -1105 | - "npm:wrangler@^3.90.0" -1025 | + "npm:wrangler@^4.77.0" diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..e223f09 --- /dev/null +++ b/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: /$ +Disallow: / diff --git a/wrangler.toml b/wrangler.toml index 38b4ce2..d997d95 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -4,7 +4,7 @@ compatibility_date = "2024-02-24" compatibility_flags = ["nodejs_compat"] rules = [ - { type = "Text", globs = ["**/*.css"] }, + { type = "Text", globs = ["**/*.css", "**/*.txt"], fallthrough = true }, ] [[r2_buckets]]